packages feed

bishbosh (empty) → 0.0.0.1

raw patch · 205 files changed

+96785/−0 lines, 205 filesdep +Cabaldep +HUnitdep +QuickChecksetup-changed

Dependencies added: Cabal, HUnit, QuickCheck, array, base, bishbosh, containers, data-default, deepseq, directory, extra, factory, filepath, hxt, hxt-relaxng, mtl, parallel, parsec, polyparse, random, time, toolshed, unix

Files

+ .ghci view
@@ -0,0 +1,1 @@+:set -isrc-lib:src-exe:src-test:dist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h -Wall -fno-warn-tabs
+ LICENSE view
@@ -0,0 +1,675 @@+                    GNU GENERAL PUBLIC LICENSE+                       Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++                            Preamble++  The GNU General Public License is a free, copyleft license for+software and other kinds of works.++  The licenses for most software and other practical works are designed+to take away your freedom to share and change the works.  By contrast,+the GNU General Public License is intended to guarantee your freedom to+share and change all versions of a program--to make sure it remains free+software for all its users.  We, the Free Software Foundation, use the+GNU General Public License for most of our software; it applies also to+any other work released this way by its authors.  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+them 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 prevent others from denying you+these rights or asking you to surrender the rights.  Therefore, you have+certain responsibilities if you distribute copies of the software, or if+you modify it: responsibilities to respect the freedom of others.++  For example, if you distribute copies of such a program, whether+gratis or for a fee, you must pass on to the recipients the same+freedoms that you received.  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.++  Developers that use the GNU GPL protect your rights with two steps:+(1) assert copyright on the software, and (2) offer you this License+giving you legal permission to copy, distribute and/or modify it.++  For the developers' and authors' protection, the GPL clearly explains+that there is no warranty for this free software.  For both users' and+authors' sake, the GPL requires that modified versions be marked as+changed, so that their problems will not be attributed erroneously to+authors of previous versions.++  Some devices are designed to deny users access to install or run+modified versions of the software inside them, although the manufacturer+can do so.  This is fundamentally incompatible with the aim of+protecting users' freedom to change the software.  The systematic+pattern of such abuse occurs in the area of products for individuals to+use, which is precisely where it is most unacceptable.  Therefore, we+have designed this version of the GPL to prohibit the practice for those+products.  If such problems arise substantially in other domains, we+stand ready to extend this provision to those domains in future versions+of the GPL, as needed to protect the freedom of users.++  Finally, every program is threatened constantly by software patents.+States should not allow patents to restrict development and use of+software on general-purpose computers, but in those that do, we wish to+avoid the special danger that patents applied to a free program could+make it effectively proprietary.  To prevent this, the GPL assures that+patents cannot be used to render the program non-free.++  The precise terms and conditions for copying, distribution and+modification follow.++                       TERMS AND CONDITIONS++  0. Definitions.++  "This License" refers to version 3 of the GNU General Public License.++  "Copyright" also means copyright-like laws that apply to other kinds of+works, such as semiconductor masks.++  "The Program" refers to any copyrightable work licensed under this+License.  Each licensee is addressed as "you".  "Licensees" and+"recipients" may be individuals or organizations.++  To "modify" a work means to copy from or adapt all or part of the work+in a fashion requiring copyright permission, other than the making of an+exact copy.  The resulting work is called a "modified version" of the+earlier work or a work "based on" the earlier work.++  A "covered work" means either the unmodified Program or a work based+on the Program.++  To "propagate" a work means to do anything with it that, without+permission, would make you directly or secondarily liable for+infringement under applicable copyright law, except executing it on a+computer or modifying a private copy.  Propagation includes copying,+distribution (with or without modification), making available to the+public, and in some countries other activities as well.++  To "convey" a work means any kind of propagation that enables other+parties to make or receive copies.  Mere interaction with a user through+a computer network, with no transfer of a copy, is not conveying.++  An interactive user interface displays "Appropriate Legal Notices"+to the extent that it includes a convenient and prominently visible+feature that (1) displays an appropriate copyright notice, and (2)+tells the user that there is no warranty for the work (except to the+extent that warranties are provided), that licensees may convey the+work under this License, and how to view a copy of this License.  If+the interface presents a list of user commands or options, such as a+menu, a prominent item in the list meets this criterion.++  1. Source Code.++  The "source code" for a work means the preferred form of the work+for making modifications to it.  "Object code" means any non-source+form of a work.++  A "Standard Interface" means an interface that either is an official+standard defined by a recognized standards body, or, in the case of+interfaces specified for a particular programming language, one that+is widely used among developers working in that language.++  The "System Libraries" of an executable work include anything, other+than the work as a whole, that (a) is included in the normal form of+packaging a Major Component, but which is not part of that Major+Component, and (b) serves only to enable use of the work with that+Major Component, or to implement a Standard Interface for which an+implementation is available to the public in source code form.  A+"Major Component", in this context, means a major essential component+(kernel, window system, and so on) of the specific operating system+(if any) on which the executable work runs, or a compiler used to+produce the work, or an object code interpreter used to run it.++  The "Corresponding Source" for a work in object code form means all+the source code needed to generate, install, and (for an executable+work) run the object code and to modify the work, including scripts to+control those activities.  However, it does not include the work's+System Libraries, or general-purpose tools or generally available free+programs which are used unmodified in performing those activities but+which are not part of the work.  For example, Corresponding Source+includes interface definition files associated with source files for+the work, and the source code for shared libraries and dynamically+linked subprograms that the work is specifically designed to require,+such as by intimate data communication or control flow between those+subprograms and other parts of the work.++  The Corresponding Source need not include anything that users+can regenerate automatically from other parts of the Corresponding+Source.++  The Corresponding Source for a work in source code form is that+same work.++  2. Basic Permissions.++  All rights granted under this License are granted for the term of+copyright on the Program, and are irrevocable provided the stated+conditions are met.  This License explicitly affirms your unlimited+permission to run the unmodified Program.  The output from running a+covered work is covered by this License only if the output, given its+content, constitutes a covered work.  This License acknowledges your+rights of fair use or other equivalent, as provided by copyright law.++  You may make, run and propagate covered works that you do not+convey, without conditions so long as your license otherwise remains+in force.  You may convey covered works to others for the sole purpose+of having them make modifications exclusively for you, or provide you+with facilities for running those works, provided that you comply with+the terms of this License in conveying all material for which you do+not control copyright.  Those thus making or running the covered works+for you must do so exclusively on your behalf, under your direction+and control, on terms that prohibit them from making any copies of+your copyrighted material outside their relationship with you.++  Conveying under any other circumstances is permitted solely under+the conditions stated below.  Sublicensing is not allowed; section 10+makes it unnecessary.++  3. Protecting Users' Legal Rights From Anti-Circumvention Law.++  No covered work shall be deemed part of an effective technological+measure under any applicable law fulfilling obligations under article+11 of the WIPO copyright treaty adopted on 20 December 1996, or+similar laws prohibiting or restricting circumvention of such+measures.++  When you convey a covered work, you waive any legal power to forbid+circumvention of technological measures to the extent such circumvention+is effected by exercising rights under this License with respect to+the covered work, and you disclaim any intention to limit operation or+modification of the work as a means of enforcing, against the work's+users, your or third parties' legal rights to forbid circumvention of+technological measures.++  4. Conveying Verbatim Copies.++  You may convey 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;+keep intact all notices stating that this License and any+non-permissive terms added in accord with section 7 apply to the code;+keep intact all notices of the absence of any warranty; and give all+recipients a copy of this License along with the Program.++  You may charge any price or no price for each copy that you convey,+and you may offer support or warranty protection for a fee.++  5. Conveying Modified Source Versions.++  You may convey a work based on the Program, or the modifications to+produce it from the Program, in the form of source code under the+terms of section 4, provided that you also meet all of these conditions:++    a) The work must carry prominent notices stating that you modified+    it, and giving a relevant date.++    b) The work must carry prominent notices stating that it is+    released under this License and any conditions added under section+    7.  This requirement modifies the requirement in section 4 to+    "keep intact all notices".++    c) You must license the entire work, as a whole, under this+    License to anyone who comes into possession of a copy.  This+    License will therefore apply, along with any applicable section 7+    additional terms, to the whole of the work, and all its parts,+    regardless of how they are packaged.  This License gives no+    permission to license the work in any other way, but it does not+    invalidate such permission if you have separately received it.++    d) If the work has interactive user interfaces, each must display+    Appropriate Legal Notices; however, if the Program has interactive+    interfaces that do not display Appropriate Legal Notices, your+    work need not make them do so.++  A compilation of a covered work with other separate and independent+works, which are not by their nature extensions of the covered work,+and which are not combined with it such as to form a larger program,+in or on a volume of a storage or distribution medium, is called an+"aggregate" if the compilation and its resulting copyright are not+used to limit the access or legal rights of the compilation's users+beyond what the individual works permit.  Inclusion of a covered work+in an aggregate does not cause this License to apply to the other+parts of the aggregate.++  6. Conveying Non-Source Forms.++  You may convey a covered work in object code form under the terms+of sections 4 and 5, provided that you also convey the+machine-readable Corresponding Source under the terms of this License,+in one of these ways:++    a) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by the+    Corresponding Source fixed on a durable physical medium+    customarily used for software interchange.++    b) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by a+    written offer, valid for at least three years and valid for as+    long as you offer spare parts or customer support for that product+    model, to give anyone who possesses the object code either (1) a+    copy of the Corresponding Source for all the software in the+    product that is covered by this License, on a durable physical+    medium customarily used for software interchange, for a price no+    more than your reasonable cost of physically performing this+    conveying of source, or (2) access to copy the+    Corresponding Source from a network server at no charge.++    c) Convey individual copies of the object code with a copy of the+    written offer to provide the Corresponding Source.  This+    alternative is allowed only occasionally and noncommercially, and+    only if you received the object code with such an offer, in accord+    with subsection 6b.++    d) Convey the object code by offering access from a designated+    place (gratis or for a charge), and offer equivalent access to the+    Corresponding Source in the same way through the same place at no+    further charge.  You need not require recipients to copy the+    Corresponding Source along with the object code.  If the place to+    copy the object code is a network server, the Corresponding Source+    may be on a different server (operated by you or a third party)+    that supports equivalent copying facilities, provided you maintain+    clear directions next to the object code saying where to find the+    Corresponding Source.  Regardless of what server hosts the+    Corresponding Source, you remain obligated to ensure that it is+    available for as long as needed to satisfy these requirements.++    e) Convey the object code using peer-to-peer transmission, provided+    you inform other peers where the object code and Corresponding+    Source of the work are being offered to the general public at no+    charge under subsection 6d.++  A separable portion of the object code, whose source code is excluded+from the Corresponding Source as a System Library, need not be+included in conveying the object code work.++  A "User Product" is either (1) a "consumer product", which means any+tangible personal property which is normally used for personal, family,+or household purposes, or (2) anything designed or sold for incorporation+into a dwelling.  In determining whether a product is a consumer product,+doubtful cases shall be resolved in favor of coverage.  For a particular+product received by a particular user, "normally used" refers to a+typical or common use of that class of product, regardless of the status+of the particular user or of the way in which the particular user+actually uses, or expects or is expected to use, the product.  A product+is a consumer product regardless of whether the product has substantial+commercial, industrial or non-consumer uses, unless such uses represent+the only significant mode of use of the product.++  "Installation Information" for a User Product means any methods,+procedures, authorization keys, or other information required to install+and execute modified versions of a covered work in that User Product from+a modified version of its Corresponding Source.  The information must+suffice to ensure that the continued functioning of the modified object+code is in no case prevented or interfered with solely because+modification has been made.++  If you convey an object code work under this section in, or with, or+specifically for use in, a User Product, and the conveying occurs as+part of a transaction in which the right of possession and use of the+User Product is transferred to the recipient in perpetuity or for a+fixed term (regardless of how the transaction is characterized), the+Corresponding Source conveyed under this section must be accompanied+by the Installation Information.  But this requirement does not apply+if neither you nor any third party retains the ability to install+modified object code on the User Product (for example, the work has+been installed in ROM).++  The requirement to provide Installation Information does not include a+requirement to continue to provide support service, warranty, or updates+for a work that has been modified or installed by the recipient, or for+the User Product in which it has been modified or installed.  Access to a+network may be denied when the modification itself materially and+adversely affects the operation of the network or violates the rules and+protocols for communication across the network.++  Corresponding Source conveyed, and Installation Information provided,+in accord with this section must be in a format that is publicly+documented (and with an implementation available to the public in+source code form), and must require no special password or key for+unpacking, reading or copying.++  7. Additional Terms.++  "Additional permissions" are terms that supplement the terms of this+License by making exceptions from one or more of its conditions.+Additional permissions that are applicable to the entire Program shall+be treated as though they were included in this License, to the extent+that they are valid under applicable law.  If additional permissions+apply only to part of the Program, that part may be used separately+under those permissions, but the entire Program remains governed by+this License without regard to the additional permissions.++  When you convey a copy of a covered work, you may at your option+remove any additional permissions from that copy, or from any part of+it.  (Additional permissions may be written to require their own+removal in certain cases when you modify the work.)  You may place+additional permissions on material, added by you to a covered work,+for which you have or can give appropriate copyright permission.++  Notwithstanding any other provision of this License, for material you+add to a covered work, you may (if authorized by the copyright holders of+that material) supplement the terms of this License with terms:++    a) Disclaiming warranty or limiting liability differently from the+    terms of sections 15 and 16 of this License; or++    b) Requiring preservation of specified reasonable legal notices or+    author attributions in that material or in the Appropriate Legal+    Notices displayed by works containing it; or++    c) Prohibiting misrepresentation of the origin of that material, or+    requiring that modified versions of such material be marked in+    reasonable ways as different from the original version; or++    d) Limiting the use for publicity purposes of names of licensors or+    authors of the material; or++    e) Declining to grant rights under trademark law for use of some+    trade names, trademarks, or service marks; or++    f) Requiring indemnification of licensors and authors of that+    material by anyone who conveys the material (or modified versions of+    it) with contractual assumptions of liability to the recipient, for+    any liability that these contractual assumptions directly impose on+    those licensors and authors.++  All other non-permissive additional terms are considered "further+restrictions" within the meaning of section 10.  If the Program as you+received it, or any part of it, contains a notice stating that it is+governed by this License along with a term that is a further+restriction, you may remove that term.  If a license document contains+a further restriction but permits relicensing or conveying under this+License, you may add to a covered work material governed by the terms+of that license document, provided that the further restriction does+not survive such relicensing or conveying.++  If you add terms to a covered work in accord with this section, you+must place, in the relevant source files, a statement of the+additional terms that apply to those files, or a notice indicating+where to find the applicable terms.++  Additional terms, permissive or non-permissive, may be stated in the+form of a separately written license, or stated as exceptions;+the above requirements apply either way.++  8. Termination.++  You may not propagate or modify a covered work except as expressly+provided under this License.  Any attempt otherwise to propagate or+modify it is void, and will automatically terminate your rights under+this License (including any patent licenses granted under the third+paragraph of section 11).++  However, if you cease all violation of this License, then your+license from a particular copyright holder is reinstated (a)+provisionally, unless and until the copyright holder explicitly and+finally terminates your license, and (b) permanently, if the copyright+holder fails to notify you of the violation by some reasonable means+prior to 60 days after the cessation.++  Moreover, your license from a particular copyright holder is+reinstated permanently if the copyright holder notifies you of the+violation by some reasonable means, this is the first time you have+received notice of violation of this License (for any work) from that+copyright holder, and you cure the violation prior to 30 days after+your receipt of the notice.++  Termination of your rights under this section does not terminate the+licenses of parties who have received copies or rights from you under+this License.  If your rights have been terminated and not permanently+reinstated, you do not qualify to receive new licenses for the same+material under section 10.++  9. Acceptance Not Required for Having Copies.++  You are not required to accept this License in order to receive or+run a copy of the Program.  Ancillary propagation of a covered work+occurring solely as a consequence of using peer-to-peer transmission+to receive a copy likewise does not require acceptance.  However,+nothing other than this License grants you permission to propagate or+modify any covered work.  These actions infringe copyright if you do+not accept this License.  Therefore, by modifying or propagating a+covered work, you indicate your acceptance of this License to do so.++  10. Automatic Licensing of Downstream Recipients.++  Each time you convey a covered work, the recipient automatically+receives a license from the original licensors, to run, modify and+propagate that work, subject to this License.  You are not responsible+for enforcing compliance by third parties with this License.++  An "entity transaction" is a transaction transferring control of an+organization, or substantially all assets of one, or subdividing an+organization, or merging organizations.  If propagation of a covered+work results from an entity transaction, each party to that+transaction who receives a copy of the work also receives whatever+licenses to the work the party's predecessor in interest had or could+give under the previous paragraph, plus a right to possession of the+Corresponding Source of the work from the predecessor in interest, if+the predecessor has it or can get it with reasonable efforts.++  You may not impose any further restrictions on the exercise of the+rights granted or affirmed under this License.  For example, you may+not impose a license fee, royalty, or other charge for exercise of+rights granted under this License, and you may not initiate litigation+(including a cross-claim or counterclaim in a lawsuit) alleging that+any patent claim is infringed by making, using, selling, offering for+sale, or importing the Program or any portion of it.++  11. Patents.++  A "contributor" is a copyright holder who authorizes use under this+License of the Program or a work on which the Program is based.  The+work thus licensed is called the contributor's "contributor version".++  A contributor's "essential patent claims" are all patent claims+owned or controlled by the contributor, whether already acquired or+hereafter acquired, that would be infringed by some manner, permitted+by this License, of making, using, or selling its contributor version,+but do not include claims that would be infringed only as a+consequence of further modification of the contributor version.  For+purposes of this definition, "control" includes the right to grant+patent sublicenses in a manner consistent with the requirements of+this License.++  Each contributor grants you a non-exclusive, worldwide, royalty-free+patent license under the contributor's essential patent claims, to+make, use, sell, offer for sale, import and otherwise run, modify and+propagate the contents of its contributor version.++  In the following three paragraphs, a "patent license" is any express+agreement or commitment, however denominated, not to enforce a patent+(such as an express permission to practice a patent or covenant not to+sue for patent infringement).  To "grant" such a patent license to a+party means to make such an agreement or commitment not to enforce a+patent against the party.++  If you convey a covered work, knowingly relying on a patent license,+and the Corresponding Source of the work is not available for anyone+to copy, free of charge and under the terms of this License, through a+publicly available network server or other readily accessible means,+then you must either (1) cause the Corresponding Source to be so+available, or (2) arrange to deprive yourself of the benefit of the+patent license for this particular work, or (3) arrange, in a manner+consistent with the requirements of this License, to extend the patent+license to downstream recipients.  "Knowingly relying" means you have+actual knowledge that, but for the patent license, your conveying the+covered work in a country, or your recipient's use of the covered work+in a country, would infringe one or more identifiable patents in that+country that you have reason to believe are valid.++  If, pursuant to or in connection with a single transaction or+arrangement, you convey, or propagate by procuring conveyance of, a+covered work, and grant a patent license to some of the parties+receiving the covered work authorizing them to use, propagate, modify+or convey a specific copy of the covered work, then the patent license+you grant is automatically extended to all recipients of the covered+work and works based on it.++  A patent license is "discriminatory" if it does not include within+the scope of its coverage, prohibits the exercise of, or is+conditioned on the non-exercise of one or more of the rights that are+specifically granted under this License.  You may not convey a covered+work if you are a party to an arrangement with a third party that is+in the business of distributing software, under which you make payment+to the third party based on the extent of your activity of conveying+the work, and under which the third party grants, to any of the+parties who would receive the covered work from you, a discriminatory+patent license (a) in connection with copies of the covered work+conveyed by you (or copies made from those copies), or (b) primarily+for and in connection with specific products or compilations that+contain the covered work, unless you entered into that arrangement,+or that patent license was granted, prior to 28 March 2007.++  Nothing in this License shall be construed as excluding or limiting+any implied license or other defenses to infringement that may+otherwise be available to you under applicable patent law.++  12. No Surrender of Others' Freedom.++  If 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 convey a+covered work so as to satisfy simultaneously your obligations under this+License and any other pertinent obligations, then as a consequence you may+not convey it at all.  For example, if you agree to terms that obligate you+to collect a royalty for further conveying from those to whom you convey+the Program, the only way you could satisfy both those terms and this+License would be to refrain entirely from conveying the Program.++  13. Use with the GNU Affero General Public License.++  Notwithstanding any other provision of this License, you have+permission to link or combine any covered work with a work licensed+under version 3 of the GNU Affero General Public License into a single+combined work, and to convey the resulting work.  The terms of this+License will continue to apply to the part which is the covered work,+but the special requirements of the GNU Affero General Public License,+section 13, concerning interaction through a network will apply to the+combination as such.++  14. Revised Versions of this License.++  The Free Software Foundation may publish revised and/or new versions of+the GNU 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 that a certain numbered version of the GNU General+Public License "or any later version" applies to it, you have the+option of following the terms and conditions either of that numbered+version or of any later version published by the Free Software+Foundation.  If the Program does not specify a version number of the+GNU General Public License, you may choose any version ever published+by the Free Software Foundation.++  If the Program specifies that a proxy can decide which future+versions of the GNU General Public License can be used, that proxy's+public statement of acceptance of a version permanently authorizes you+to choose that version for the Program.++  Later license versions may give you additional or different+permissions.  However, no additional obligations are imposed on any+author or copyright holder as a result of your choosing to follow a+later version.++  15. Disclaimer of Warranty.++  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.++  16. Limitation of Liability.++  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS+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.++  17. Interpretation of Sections 15 and 16.++  If the disclaimer of warranty and limitation of liability provided+above cannot be given local legal effect according to their terms,+reviewing courts shall apply local law that most closely approximates+an absolute waiver of all civil liability in connection with the+Program, unless a warranty or assumption of liability accompanies a+copy of the Program in return for a fee.++                     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+state 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 a brief idea of what it does.>+    Copyright (C) <year>  <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 3 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, see <http://www.gnu.org/licenses/>.++Also add information on how to contact you by electronic and paper mail.++  If the program does terminal interaction, make it output a short+notice like this when it starts in an interactive mode:++    <program>  Copyright (C) <year>  <name of author>+    This program 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, your program's commands+might be different; for a GUI interface, you would use an "about box".++  You should also get your employer (if you work as a programmer) or school,+if any, to sign a "copyright disclaimer" for the program, if necessary.+For more information on this, and how to apply and follow the GNU GPL, see+<http://www.gnu.org/licenses/>.++  The GNU 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 Lesser General+Public License instead of this License.  But first, please read+<http://www.gnu.org/philosophy/why-not-lgpl.html>.+
+ README.markdown view
@@ -0,0 +1,33 @@+# **BishBosh**++[![Hackage](https://img.shields.io/hackage/v/bishbosh.svg)](https://hackage.haskell.org/package/bishbosh) [![Build Status](https://travis-ci.org/functionalley/BishBosh.svg?branch=master)](https://travis-ci.org/functionalley/BishBosh)++This is "**BishBosh**", a chess-game which can be rendered in a terminal (emulator) using raw ASCII, or used as an engine by **xboard**.++## Installation++It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html).++## Documentation++The documentation is in "**man/**".++## License++For information on copying and distributing this package, see the file "**LICENSE**" in this directory.++## Bug-reporting++Bug-reports should be emailed to <bishbosh@functionalley.eu>.++## Testing++The test-suite can be run using:++    cabal configure --enable-tests;+    cabal build;+    cabal test --show-details=always;++## Author++This application is written and maintained by Dr. Alistair Ward.
+ Setup.hs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell++import qualified Distribution.Simple++main = Distribution.Simple.defaultMain
+ bishbosh.cabal view
@@ -0,0 +1,425 @@+-- This file is part of BishBosh.+--+-- BishBosh 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 3 of the License, or+-- (at your option) any later version.+--+-- BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.++Name:		bishbosh+Version:	0.0.0.1+Cabal-version:	>= 1.10+Copyright:	(C) 2018 Dr. Alistair Ward+License:	GPL+License-file:	LICENSE+Author:		Dr. Alistair Ward+Stability:	stable+Synopsis:	Plays chess.+Build-type:	Simple+Description:	A chess-game which can be rendered in a terminal (emulator) in raw ASCII, or used as an engine by xboard.+Category:	Game+Tested-with:	GHC == 8.0, GHC == 8.2+Homepage:	http://functionalley.eu+Maintainer:	mailto:bishbosh@functionalley.eu+Bug-reports:	mailto:bishbosh@functionalley.eu++-- These files can be read by the application from 'Paths_bishbosh.datadir'.+Data-files:+    config/bishbosh.dtd+    config/bishbosh.rng+    config/CECP/*.xml+    config/Raw/*.xml+    pgn/*.pgn++-- None of these files are needed at run-time.+Extra-source-files:+    .ghci+    bishbosh.spec+    bishbosh.svg+    changelog.markdown+    copyright+    man/man1/bishbosh.1+    man/man5/bishbosh.5+    README.markdown++source-repository head+    type:	git+    location:	https://github.com/functionalley/BishBosh++-- Enable using: 'runhaskell Setup configure -f llvm --verbose'.+flag llvm+    Description:	Whether the 'llvm' compiler-backend has been installed and is required for code-generation.+    Manual:		True+    Default:		False++-- Automatically disabled when the required package isn't available.+-- To manually disable, use "runhaskell Setup configure -f -polyparse --verbose"; which may be required to access Parsec's more precise error-messages.+flag polyparse+    Description:	Link with package "polyparse" when available, rather than "parsec".+    Default:		True++-- Automatically disabled when the required package isn't available.+-- To manually disable, use "runhaskell Setup configure -f -hxtrelaxng --verbose", under which circumstances the XML-configuration will be validated against the packaged DTD instead.+flag hxtrelaxng+    Description:	Link with package "hxt-relaxng" when available, for more precise specification of the XML-configuration than a traditional DTD.+    Default:		True++-- Whether to use narrower numerical types than machine-defaults. CAVEAT: bizarely, this option increases both the space allocated & the execution-time.+flag narrownumbers+    Description:	Use narrow numerical types.+    Manual:		True+    Default:		False++-- Highly recommended.+flag threaded+    Description:	Build for parallel runtime.+    Manual:		True+    Default:		True++-- Automatically disabled when the required package isn't available, which will typically be the case on Windows.+flag unix+    Description:	Link with package "unix" when available.+    Default:		True++Library+    Default-language:	Haskell2010+    GHC-options:	-O2 -Wall -fno-warn-tabs+    Hs-source-dirs:	src-lib++    Exposed-modules:+        BishBosh.Attribute.CaptureMoveSortAlgorithm+        BishBosh.Attribute.ColourScheme+        BishBosh.Attribute.CriterionValue+        BishBosh.Attribute.CriterionWeight+        BishBosh.Attribute.Direction+        BishBosh.Attribute.LogicalColour+        BishBosh.Attribute.LogicalColourOfSquare+        BishBosh.Attribute.MoveType+        BishBosh.Attribute.PhysicalColour+        BishBosh.Attribute.Rank+        BishBosh.Attribute.RankValues+        BishBosh.Attribute.WeightedMeanAndCriterionValues+        BishBosh.Cartesian.Abscissa+        BishBosh.Cartesian.Coordinates+        BishBosh.Cartesian.Ordinate+        BishBosh.Cartesian.Vector+        BishBosh.Component.EitherQualifiedMove+        BishBosh.Component.Move+        BishBosh.Component.Piece+        BishBosh.Component.PieceSquareArray+        BishBosh.Component.QualifiedMove+        BishBosh.Component.Turn+        BishBosh.Component.Zobrist+        BishBosh.ContextualNotation.PGN+        BishBosh.ContextualNotation.PGNComment+        BishBosh.ContextualNotation.PGNDatabase+        BishBosh.ContextualNotation.PositionHashQualifiedMoveTree+        BishBosh.ContextualNotation.QualifiedMoveForest+        BishBosh.ContextualNotation.StandardAlgebraic+        BishBosh.Data.Bool+        BishBosh.Data.Either+        BishBosh.Data.Exception+        BishBosh.Data.Float+        BishBosh.Data.Integral+        BishBosh.Data.Num+        BishBosh.Data.Ratio+        BishBosh.Data.RoseTree+        BishBosh.Data.Time+        BishBosh.Evaluation.Fitness+        BishBosh.Evaluation.PositionHashQuantifiedGameTree+        BishBosh.Evaluation.QuantifiedGame+        BishBosh.Input.CECPFeatures+        BishBosh.Input.CECPOptions+        BishBosh.Input.CriteriaWeights+        BishBosh.Input.EvaluationOptions+        BishBosh.Input.IOOptions+        BishBosh.Input.NativeUIOptions+        BishBosh.Input.Options+        BishBosh.Input.PGNOptions+        BishBosh.Input.PieceSquareTable+        BishBosh.Input.SearchOptions+        BishBosh.Input.StandardOpeningOptions+        BishBosh.Input.UIOptions+        BishBosh.Input.Verbosity+        BishBosh.Model.DrawReason+        BishBosh.Model.Game+        BishBosh.Model.GameTerminationReason+        BishBosh.Model.GameTree+        BishBosh.Model.MoveFrequency+        BishBosh.Model.PositionHashTree+        BishBosh.Model.Result+        BishBosh.Notation.Coordinate+        BishBosh.Notation.ICCFNumeric+        BishBosh.Notation.MoveNotation+        BishBosh.Notation.Smith+        BishBosh.Property.Empty+        BishBosh.Property.ForsythEdwards+        BishBosh.Property.Null+        BishBosh.Property.Opposable+        BishBosh.Property.Orientated+        BishBosh.Property.Reflectable+        BishBosh.Property.Rotatable+        BishBosh.Property.ShowFloat+        BishBosh.Property.Tree+        BishBosh.Search.AlphaBeta+        BishBosh.Search.DynamicMoveData+        BishBosh.Search.EphemeralData+        BishBosh.Search.KillerMoves+        BishBosh.Search.Search+        BishBosh.Search.SearchState+        BishBosh.Search.Transpositions+        BishBosh.Search.TranspositionValue+        BishBosh.State.Board+        BishBosh.State.CastleableRooksByLogicalColour+        BishBosh.State.Censor+        BishBosh.State.CoordinatesByRankByLogicalColour+        BishBosh.State.EnPassantAbscissa+        BishBosh.State.InstancesByPosition+        BishBosh.State.MaybePieceByCoordinates+        BishBosh.State.Position+        BishBosh.State.TurnsByLogicalColour+        BishBosh.Text.ShowList+        BishBosh.Types+        BishBosh.UI.Command+        BishBosh.UI.PrintObject+        BishBosh.UI.SetObject++    Build-depends:+        array >= 0.5.1.1,+        base >= 4.9 && < 5.0,+        Cabal >= 1.10,+        containers,+        data-default,+        deepseq >= 1.4.1,+        extra,+        factory >= 0.3.1,+        filepath,+        hxt,+        mtl,+        parallel >= 3.0,+        random,+        time,+        toolshed >= 0.18++    if impl(ghc >= 7.0)+        if flag(llvm)+            GHC-options:	-fllvm++        if impl(ghc >= 7.4.1)+            GHC-prof-options:	-fprof-auto -fprof-cafs++            if impl(ghc >= 8.0)+                GHC-options:	-j -Wredundant-constraints+        else+            GHC-prof-options:	-auto-all -caf-all++    if flag(polyparse)+        Build-depends:		polyparse+        CPP-Options:		-DUSE_POLYPARSE=1+        Exposed-modules:	BishBosh.Text.Poly+    else+        Build-depends:		parsec++    if flag(narrownumbers)+        CPP-Options:		-DUSE_NARROW_NUMBERS=1++Executable bishbosh+    Default-language:	Haskell2010+    GHC-options:	-O2 -Wall -fno-warn-tabs+    Hs-source-dirs:	src-exe+    Main-is:		Main.hs++-- Required for 'cabal sdist'.+    Other-modules:+        BishBosh.Concurrent.Pondering+        BishBosh.Concurrent.SignalHandlers+        BishBosh.Input.CommandLineOption+        BishBosh.Play+        BishBosh.State.ApplicationTerminationReason+        BishBosh.State.PlayState+        BishBosh.Text.Show+        BishBosh.UI.CECP+        BishBosh.UI.Raw++    Build-depends:+        array >= 0.5.1.1,+        base >= 4.9 && < 5.0,+        bishbosh,+        Cabal >= 1.10,+        containers,+        data-default,+        deepseq >= 1.4.1,+        directory,+        extra,+        factory >= 0.3.1,+        filepath,+        hxt,+        mtl,+        parallel >= 3.0,+        random,+        time,+        toolshed >= 0.18++    if impl(ghc >= 7.0)+        if flag(llvm)+            GHC-options:	-fllvm++        if flag(threaded)+            GHC-options:	-rtsopts "-with-rtsopts=-N -H100M"++        if impl(ghc >= 7.4.1)+            GHC-prof-options:	-fprof-auto -fprof-cafs -rtsopts -with-rtsopts=-H100M++            if impl(ghc >= 8.0)+                GHC-options:	-j -Wredundant-constraints+        else+            GHC-prof-options:	-auto-all -caf-all++    if flag(polyparse)+        Build-depends:	polyparse+        CPP-Options:	-DUSE_POLYPARSE=1+    else+        Build-depends:	parsec++    if flag(hxtrelaxng)+        Build-depends:	hxt-relaxng+        CPP-Options:	-DUSE_HXTRELAXNG=1+    else+        Build-depends:	parsec++    if flag(narrownumbers)+        CPP-Options:	-DUSE_NARROW_NUMBERS=1++    if flag(threaded)+        GHC-options:	-threaded++-- N.B.: The Haskell package 'unix' may be available on Windows, but building it will probably be laborious.+    if flag(unix)+        Other-modules:	BishBosh.Concurrent.SignalHandlers+        Build-depends:	unix+        CPP-Options:	-DUSE_UNIX++Test-Suite test+    Default-language:	Haskell2010+    GHC-options:	-O2 -Wall -fno-warn-tabs+    Hs-source-dirs:	src-test+    Main-is:		Main.hs+    Type:		exitcode-stdio-1.0++-- Required for 'cabal sdist'.+    Other-modules:+        BishBosh.Test.HUnit.Attribute.Direction+        BishBosh.Test.HUnit.Attribute.LogicalColour+        BishBosh.Test.HUnit.Attribute.Rank+        BishBosh.Test.HUnit.Cartesian.Coordinates+        BishBosh.Test.HUnit.Cartesian.Vector+        BishBosh.Test.HUnit.Component.Move+        BishBosh.Test.HUnit.Component.Piece+        BishBosh.Test.HUnit.Component.Zobrist+        BishBosh.Test.HUnit.ContextualNotation.PGN+        BishBosh.Test.HUnit.ContextualNotation.PositionHashQualifiedMoveTree+        BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic+        BishBosh.Test.HUnit.Evaluation.Fitness+        BishBosh.Test.HUnit.Input.Options+        BishBosh.Test.HUnit.Model.Game+        BishBosh.Test.HUnit.Model.GameTree+        BishBosh.Test.HUnit.Model.PositionHashTree+        BishBosh.Test.HUnit.Search.Search+        BishBosh.Test.HUnit.State.Board+        BishBosh.Test.QuickCheck.Attribute.CaptureMoveSortAlgorithm+        BishBosh.Test.QuickCheck.Attribute.CriterionWeight+        BishBosh.Test.QuickCheck.Attribute.Direction+        BishBosh.Test.QuickCheck.Attribute.LogicalColour+        BishBosh.Test.QuickCheck.Attribute.MoveType+        BishBosh.Test.QuickCheck.Attribute.Rank+        BishBosh.Test.QuickCheck.Attribute.RankValues+        BishBosh.Test.QuickCheck.Cartesian.Coordinates+        BishBosh.Test.QuickCheck.Cartesian.Vector+        BishBosh.Test.QuickCheck.Component.Move+        BishBosh.Test.QuickCheck.Component.Piece+        BishBosh.Test.QuickCheck.Component.QualifiedMove+        BishBosh.Test.QuickCheck.Component.Turn+        BishBosh.Test.QuickCheck.Component.Zobrist+        BishBosh.Test.QuickCheck.ContextualNotation.PGN+        BishBosh.Test.QuickCheck.ContextualNotation.PGNComment+        BishBosh.Test.QuickCheck.ContextualNotation.PositionHashQualifiedMoveTree+        BishBosh.Test.QuickCheck.ContextualNotation.QualifiedMoveForest+        BishBosh.Test.QuickCheck.ContextualNotation.StandardAlgebraic+        BishBosh.Test.QuickCheck.Data.Integral+        BishBosh.Test.QuickCheck.Evaluation.PositionHashQuantifiedGameTree+        BishBosh.Test.QuickCheck.Input.CECPFeatures+        BishBosh.Test.QuickCheck.Input.CECPOptions+        BishBosh.Test.QuickCheck.Input.CriteriaWeights+        BishBosh.Test.QuickCheck.Input.EvaluationOptions+        BishBosh.Test.QuickCheck.Input.IOOptions+        BishBosh.Test.QuickCheck.Input.NativeUIOptions+        BishBosh.Test.QuickCheck.Input.Options+        BishBosh.Test.QuickCheck.Input.PGNOptions+        BishBosh.Test.QuickCheck.Input.PieceSquareTable+        BishBosh.Test.QuickCheck.Input.SearchOptions+        BishBosh.Test.QuickCheck.Input.StandardOpeningOptions+        BishBosh.Test.QuickCheck.Input.UIOptions+        BishBosh.Test.QuickCheck.Input.Verbosity+        BishBosh.Test.QuickCheck.Model.DrawReason+        BishBosh.Test.QuickCheck.Model.Game+        BishBosh.Test.QuickCheck.Model.GameTerminationReason+        BishBosh.Test.QuickCheck.Model.GameTree+        BishBosh.Test.QuickCheck.Model.MoveFrequency+        BishBosh.Test.QuickCheck.Model.Result+        BishBosh.Test.QuickCheck.Notation.Coordinate+        BishBosh.Test.QuickCheck.Notation.ICCFNumeric+        BishBosh.Test.QuickCheck.Notation.MoveNotation+        BishBosh.Test.QuickCheck.Notation.Smith+        BishBosh.Test.QuickCheck.Search.KillerMoves+        BishBosh.Test.QuickCheck.Search.Search+        BishBosh.Test.QuickCheck.Search.SearchState+        BishBosh.Test.QuickCheck.State.Board+        BishBosh.Test.QuickCheck.State.CastleableRooksByLogicalColour+        BishBosh.Test.QuickCheck.State.Censor+        BishBosh.Test.QuickCheck.State.InstancesByPosition+        BishBosh.Test.QuickCheck.State.Position+        BishBosh.Test.QuickCheck.State.TurnsByLogicalColour+        BishBosh.Test.QuickCheck.UI.Command+        BishBosh.Test.QuickCheck.UI.PrintObject+        BishBosh.Test.QuickCheck.UI.SetObject++    Build-depends:+        array >= 0.5.1.1,+        base >= 4.9 && < 5.0,+        bishbosh,+        Cabal >= 1.10,+        containers,+        data-default,+        extra,+        filepath,+        HUnit,+        hxt,+        mtl,+        QuickCheck >= 2.8.2,+        random,+        toolshed >= 0.18++    if impl(ghc >= 7.0)+        GHC-options:	-with-rtsopts=-H100M++        if impl(ghc >= 7.4.1)+            GHC-prof-options:	-fprof-auto -fprof-cafs -rtsopts -with-rtsopts=-H100M++            if impl(ghc >= 8.0)+                GHC-options:	-j -Wredundant-constraints+        else+            GHC-prof-options:	-auto-all -caf-all++    if flag(polyparse)+        Build-depends:	polyparse+        CPP-Options:	-DUSE_POLYPARSE=1+    else+        Build-depends:	parsec+
+ bishbosh.spec view
@@ -0,0 +1,77 @@+# Copyright (C) 2018 Dr. Alistair Ward+#+# This file is part of BishBosh.+#+# BishBosh 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 3 of the License, or+# (at your option) any later version.+#+# BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.++%define package		%name-%version+%define tarBall		%package.tar.gz+%define _sharedir	%prefix/share+%define _datadir	%_sharedir/%name+%define _docdir		%_sharedir/doc/%name+%define _mandir		%_sharedir/man++Summary:	BishBosh is a chess-game.+Name:		bishbosh+Version:	0.0.0.1+Release:	1+License:	GPLv3+# From '/usr/share/doc/packages/rpm/GROUPS'.+Group:		Amusements/Games+# Source0:	http://functionalley.eu/Downloads/sdist/%tarBall+URL:		http://functionalley.eu/BishBosh+Prefix:		/usr+BuildRequires:	haskell-platform++%description+BishBosh is a chess-game which can be rendered in a terminal (emulator) using raw ASCII, or used as an engine by xboard.++%prep+# N.B.: CWD has changed to %_builddir+echo 'package="%package", prefix="%prefix", _builddir="%_builddir", buildroot="%buildroot"'+(cd $OLDPWD && cabal sdist) && tar -zxf $OLDPWD/dist/%tarBall	# Make a source-distribution & unpack it into the build-directory.+cd '%package/' && cabal configure --user --prefix='%prefix' --datadir='%_datadir' --datasubdir='' --docdir='%_docdir'	# Tell cabal to use the user's personal package-database, to generate an appropriate "Paths" module, & where to place the documentation.++%build+cd '%package/' && cabal build	# Descend into the unpacked source-distribution and build according to the previously established configuration.++%install+cd '%package/'	# Descend into the build-directory.+cabal copy --destdir=%buildroot	# Install the built package in the target-directory.+mkdir -p -- '%buildroot%_docdir' && mv '%name.svg' 'changelog.markdown' 'copyright' 'README.markdown' '%buildroot%_docdir/'	# 'LICENSE' has already been copied by cabal.+mkdir -p -- '%buildroot%_mandir' && mv man/man[15] '%buildroot%_mandir/'+rm -rf -- '%buildroot%prefix/lib/'	# The library isn't a deliverable.++%clean+rm -rf -- '%_builddir/%package/' '%buildroot/'	# Only the '.rpm' is required.++%files+%attr(0755, root, root)		%prefix/bin/%name+%attr(0644, root, root)		%_datadir/config/%name.dtd+%attr(0644, root, root)		%_datadir/config/%name.rng+%attr(0644, root, root)		%_datadir/config/CECP/*.xml+%attr(0644, root, root)		%_datadir/config/Raw/*.xml+%attr(0644, root, root)		%_datadir/pgn/*.pgn+%attr(0644, root, root)	%doc	%_docdir/%name.svg+%attr(0644, root, root) %doc	%_docdir/changelog.markdown+%attr(0644, root, root)	%doc	%_docdir/copyright+%attr(0644, root, root)	%doc	%_docdir/LICENSE+%attr(0644, root, root)	%doc	%_docdir/README.markdown+%attr(0644, root, root) %doc	%_mandir/man1/%name.1.gz+%attr(0644, root, root) %doc	%_mandir/man5/%name.5.gz++%changelog+* Thu Jul 04 2013	Alistair Ward	<bishbosh@functionalley.eu>	0.0.0.1-1+First cut.+
+ bishbosh.svg view
@@ -0,0 +1,1527 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<!-- Generated by graphviz version 2.38.0 (20140413.2041)+ -->+<!-- Title: G Pages: 1 -->+<svg width="2880pt" height="1705pt"+ viewBox="0.00 0.00 2880.00 1704.64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">+<g id="graph0" class="graph" transform="scale(0.593578 0.593578) rotate(0) translate(4 2867.8)">+<title>G</title>+<polygon fill="white" stroke="none" points="-4,4 -4,-2867.8 4847.93,-2867.8 4847.93,4 -4,4"/>+<g id="clust1" class="cluster"><title>cluster_0</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="14.2806,-21.2724 14.2806,-2746.8 4771.28,-2746.8 4771.28,-21.2724 14.2806,-21.2724"/>+<text text-anchor="middle" x="2392.78" y="-2731.6" font-family="Times,serif" font-size="14.00">BishBosh</text>+</g>+<g id="clust2" class="cluster"><title>cluster_1</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2545.28,-454.698 2545.28,-874.828 3667.28,-874.828 3667.28,-454.698 2545.28,-454.698"/>+<text text-anchor="middle" x="3106.28" y="-859.628" font-family="Times,serif" font-size="14.00">Attribute</text>+</g>+<g id="clust3" class="cluster"><title>cluster_2</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2397.28,-454.698 2397.28,-1265.71 2525.28,-1265.71 2525.28,-454.698 2397.28,-454.698"/>+<text text-anchor="middle" x="2461.28" y="-1250.51" font-family="Times,serif" font-size="14.00">Cartesian</text>+</g>+<g id="clust4" class="cluster"><title>cluster_3</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1605.28,-675.399 1605.28,-1265.71 2036.28,-1265.71 2036.28,-675.399 1605.28,-675.399"/>+<text text-anchor="middle" x="1820.78" y="-1250.51" font-family="Times,serif" font-size="14.00">Component</text>+</g>+<g id="clust5" class="cluster"><title>cluster_4</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="269.281,-2148.51 269.281,-2347.94 535.281,-2347.94 535.281,-2148.51 269.281,-2148.51"/>+<text text-anchor="middle" x="402.281" y="-2332.74" font-family="Times,serif" font-size="14.00">Concurrent</text>+</g>+<g id="clust6" class="cluster"><title>cluster_5</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3433.28,-1286.98 3433.28,-2347.94 3759.28,-2347.94 3759.28,-1286.98 3433.28,-1286.98"/>+<text text-anchor="middle" x="3596.28" y="-2332.74" font-family="Times,serif" font-size="14.00">ContextualNotation</text>+</g>+<g id="clust7" class="cluster"><title>cluster_6</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3945.28,-233.997 3945.28,-433.426 4763.28,-433.426 4763.28,-233.997 3945.28,-233.997"/>+<text text-anchor="middle" x="4354.28" y="-418.226" font-family="Times,serif" font-size="14.00">Data</text>+</g>+<g id="clust8" class="cluster"><title>cluster_7</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3133.28,-1507.68 3133.28,-2127.24 3425.28,-2127.24 3425.28,-1507.68 3133.28,-1507.68"/>+<text text-anchor="middle" x="3279.28" y="-2112.04" font-family="Times,serif" font-size="14.00">Evaluation</text>+</g>+<g id="clust9" class="cluster"><title>cluster_8</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3767.28,-675.399 3767.28,-1707.11 4573.28,-1707.11 4573.28,-675.399 3767.28,-675.399"/>+<text text-anchor="middle" x="4170.28" y="-1691.91" font-family="Times,serif" font-size="14.00">Input</text>+</g>+<g id="clust10" class="cluster"><title>cluster_9</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1321.28,-1066.28 1321.28,-1906.54 1567.28,-1906.54 1567.28,-1066.28 1321.28,-1066.28"/>+<text text-anchor="middle" x="1444.28" y="-1891.34" font-family="Times,serif" font-size="14.00">Model</text>+</g>+<g id="clust11" class="cluster"><title>cluster_10</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="154.281,-1066.28 154.281,-1486.41 503.281,-1486.41 503.281,-1066.28 154.281,-1066.28"/>+<text text-anchor="middle" x="328.781" y="-1471.21" font-family="Times,serif" font-size="14.00">Notation</text>+</g>+<g id="clust12" class="cluster"><title>cluster_11</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2140.28,-42.5448 2140.28,-433.426 3000.28,-433.426 3000.28,-42.5448 2140.28,-42.5448"/>+<text text-anchor="middle" x="2570.28" y="-418.226" font-family="Times,serif" font-size="14.00">Property</text>+</g>+<g id="clust13" class="cluster"><title>cluster_12</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2044.28,-1066.28 2044.28,-2347.94 2377.28,-2347.94 2377.28,-1066.28 2044.28,-1066.28"/>+<text text-anchor="middle" x="2210.78" y="-2332.74" font-family="Times,serif" font-size="14.00">Search</text>+</g>+<g id="clust14" class="cluster"><title>cluster_13</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="543.281,-1066.28 543.281,-2347.94 1313.28,-2347.94 1313.28,-1066.28 543.281,-1066.28"/>+<text text-anchor="middle" x="928.281" y="-2332.74" font-family="Times,serif" font-size="14.00">State</text>+</g>+<g id="clust15" class="cluster"><title>cluster_14</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3705.28,-233.997 3705.28,-654.127 3811.28,-654.127 3811.28,-233.997 3705.28,-233.997"/>+<text text-anchor="middle" x="3758.28" y="-638.927" font-family="Times,serif" font-size="14.00">Text</text>+</g>+<g id="clust16" class="cluster"><title>cluster_15</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3781.28,-1927.81 3781.28,-2547.37 4019.28,-2547.37 4019.28,-1927.81 3781.28,-1927.81"/>+<text text-anchor="middle" x="3900.28" y="-2532.17" font-family="Times,serif" font-size="14.00">UI</text>+</g>+<!-- u4 -->+<g id="node1" class="node"><title>u4</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3310.28" cy="-524.272" rx="67.6881" ry="18"/>+<text text-anchor="middle" x="3310.28" y="-520.572" font-family="Times,serif" font-size="14.00">PhysicalColour</text>+</g>+<!-- u7 -->+<g id="node2" class="node"><title>u7</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2618.28" cy="-524.272" rx="64.9885" ry="18"/>+<text text-anchor="middle" x="2618.28" y="-520.572" font-family="Times,serif" font-size="14.00">LogicalColour</text>+</g>+<!-- u8 -->+<g id="node68" class="node"><title>u8</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2490.28" cy="-303.272" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="2490.28" y="-299.572" font-family="Times,serif" font-size="14.00">ForsythEdwards</text>+</g>+<!-- u7&#45;&gt;u8 -->+<g id="edge7" class="edge"><title>u7&#45;&gt;u8</title>+<path fill="none" stroke="black" d="M2608.45,-506.451C2586.16,-468.314 2531.67,-375.082 2505.2,-329.794"/>+<polygon fill="black" stroke="black" points="2508.21,-328.018 2500.15,-321.151 2502.17,-331.55 2508.21,-328.018"/>+</g>+<!-- u9 -->+<g id="node69" class="node"><title>u9</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2630.28" cy="-303.272" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="2630.28" y="-299.572" font-family="Times,serif" font-size="14.00">Opposable</text>+</g>+<!-- u7&#45;&gt;u9 -->+<g id="edge8" class="edge"><title>u7&#45;&gt;u9</title>+<path fill="none" stroke="black" d="M2619.22,-506.088C2621.3,-468.188 2626.29,-377.17 2628.79,-331.449"/>+<polygon fill="black" stroke="black" points="2632.29,-331.554 2629.34,-321.377 2625.3,-331.171 2632.29,-331.554"/>+</g>+<!-- u11 -->+<g id="node3" class="node"><title>u11</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2823.28" cy="-744.272" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="2823.28" y="-740.572" font-family="Times,serif" font-size="14.00">MoveType</text>+</g>+<!-- u12 -->+<g id="node4" class="node"><title>u12</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2731.28" cy="-524.272" rx="29.795" ry="18"/>+<text text-anchor="middle" x="2731.28" y="-520.572" font-family="Times,serif" font-size="14.00">Rank</text>+</g>+<!-- u11&#45;&gt;u12 -->+<g id="edge9" class="edge"><title>u11&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M2816.06,-726.166C2800.03,-688.187 2761.39,-596.622 2742.31,-551.417"/>+<polygon fill="black" stroke="black" points="2745.45,-549.852 2738.34,-542 2739,-552.574 2745.45,-549.852"/>+</g>+<!-- u5 -->+<g id="node97" class="node"><title>u5</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="3758.28" cy="-303.272" rx="44.6926" ry="18"/>+<text text-anchor="middle" x="3758.28" y="-299.572" font-family="Times,serif" font-size="14.00">ShowList</text>+</g>+<!-- u11&#45;&gt;u5 -->+<g id="edge10" class="edge"><title>u11&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M2853.21,-729.408C2862.95,-725.33 2873.92,-721.185 2884.28,-718.272 3079.72,-663.305 3654.61,-727.801 3786.28,-573.272 3816.88,-537.366 3782.19,-392.102 3765.86,-331.271"/>+<polygon fill="black" stroke="black" points="3769.14,-329.997 3763.13,-321.27 3762.38,-331.838 3769.14,-329.997"/>+</g>+<!-- u14 -->+<g id="node5" class="node"><title>u14</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3088.28" cy="-744.272" rx="45.4919" ry="18"/>+<text text-anchor="middle" x="3088.28" y="-740.572" font-family="Times,serif" font-size="14.00">Direction</text>+</g>+<!-- u14&#45;&gt;u7 -->+<g id="edge11" class="edge"><title>u14&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M3060.05,-729.994C3051.77,-726.156 3042.69,-721.999 3034.28,-718.272 2883.35,-651.361 2838.09,-650.711 2692.28,-573.272 2677.67,-565.511 2662.2,-555.749 2649.21,-547.058"/>+<polygon fill="black" stroke="black" points="2650.9,-543.97 2640.66,-541.251 2646.97,-549.763 2650.9,-543.97"/>+</g>+<!-- u15 -->+<g id="node33" class="node"><title>u15</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="3997.28" cy="-303.272" rx="44.393" ry="18"/>+<text text-anchor="middle" x="3997.28" y="-299.572" font-family="Times,serif" font-size="14.00">Ordering</text>+</g>+<!-- u14&#45;&gt;u15 -->+<g id="edge12" class="edge"><title>u14&#45;&gt;u15</title>+<path fill="none" stroke="black" d="M3114.72,-729.611C3123.34,-725.543 3133.07,-721.354 3142.28,-718.272 3432.44,-621.182 3561.73,-744.542 3815.28,-573.272 3907.43,-511.024 3965.62,-385.03 3987.48,-330.456"/>+<polygon fill="black" stroke="black" points="3990.74,-331.717 3991.14,-321.129 3984.23,-329.16 3990.74,-331.717"/>+</g>+<!-- u16 -->+<g id="node34" class="node"><title>u16</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4183.28" cy="-303.272" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="4183.28" y="-299.572" font-family="Times,serif" font-size="14.00">Exception</text>+</g>+<!-- u14&#45;&gt;u16 -->+<g id="edge13" class="edge"><title>u14&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3114.7,-729.541C3123.32,-725.469 3133.05,-721.295 3142.28,-718.272 3451.24,-617.063 3588.51,-753.23 3859.28,-573.272 3892.85,-550.96 3881.74,-526.736 3910.28,-498.272 3992.33,-416.452 4033.84,-422.133 4126.28,-352.272 4136.84,-344.29 4148.07,-335.018 4157.74,-326.764"/>+<polygon fill="black" stroke="black" points="4160.16,-329.3 4165.45,-320.12 4155.59,-323.997 4160.16,-329.3"/>+</g>+<!-- u17 -->+<g id="node70" class="node"><title>u17</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2748.28" cy="-303.272" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="2748.28" y="-299.572" font-family="Times,serif" font-size="14.00">Orientated</text>+</g>+<!-- u14&#45;&gt;u17 -->+<g id="edge14" class="edge"><title>u14&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M3115.5,-729.78C3186.29,-694.419 3371.76,-599.951 3387.28,-573.272 3404.04,-544.46 3407.77,-524.563 3387.28,-498.272 3223.86,-288.62 3044.9,-471.419 2807.28,-352.272 2794.61,-345.921 2782.2,-336.46 2772.05,-327.612"/>+<polygon fill="black" stroke="black" points="2774.2,-324.836 2764.44,-320.719 2769.5,-330.025 2774.2,-324.836"/>+</g>+<!-- u18 -->+<g id="node71" class="node"><title>u18</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2647.28" cy="-111.272" rx="52.7911" ry="18"/>+<text text-anchor="middle" x="2647.28" y="-107.572" font-family="Times,serif" font-size="14.00">Reflectable</text>+</g>+<!-- u14&#45;&gt;u18 -->+<g id="edge15" class="edge"><title>u14&#45;&gt;u18</title>+<path fill="none" stroke="black" d="M3116.73,-730.106C3202.23,-690.527 3451.04,-575.221 3452.28,-573.272 3461.11,-559.401 3462.68,-290.014 3452.28,-277.272 3358.05,-161.766 2881.22,-124.887 2709.24,-115.237"/>+<polygon fill="black" stroke="black" points="2709.26,-111.733 2699.08,-114.679 2708.88,-118.722 2709.26,-111.733"/>+</g>+<!-- u19 -->+<g id="node6" class="node"><title>u19</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2653.28" cy="-744.272" rx="100.182" ry="18"/>+<text text-anchor="middle" x="2653.28" y="-740.572" font-family="Times,serif" font-size="14.00">LogicalColourOfSquare</text>+</g>+<!-- u19&#45;&gt;u7 -->+<g id="edge16" class="edge"><title>u19&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M2650.53,-726.166C2644.48,-688.439 2629.93,-597.837 2622.62,-552.325"/>+<polygon fill="black" stroke="black" points="2626.06,-551.618 2621.01,-542.299 2619.14,-552.727 2626.06,-551.618"/>+</g>+<!-- u49 -->+<g id="node7" class="node"><title>u49</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3593.28" cy="-744.272" rx="66.0889" ry="18"/>+<text text-anchor="middle" x="3593.28" y="-740.572" font-family="Times,serif" font-size="14.00">ColourScheme</text>+</g>+<!-- u49&#45;&gt;u4 -->+<g id="edge17" class="edge"><title>u49&#45;&gt;u4</title>+<path fill="none" stroke="black" d="M3572.01,-726.887C3522,-688.365 3396.88,-591.985 3339.67,-547.91"/>+<polygon fill="black" stroke="black" points="3341.47,-544.88 3331.41,-541.551 3337.2,-550.426 3341.47,-544.88"/>+</g>+<!-- u49&#45;&gt;u16 -->+<g id="edge18" class="edge"><title>u49&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3637.33,-730.766C3711.31,-708.222 3862.77,-655.341 3968.28,-573.272 4060.69,-501.398 4137.52,-382.095 4168.54,-329.969"/>+<polygon fill="black" stroke="black" points="4171.74,-331.438 4173.79,-321.045 4165.7,-327.888 4171.74,-331.438"/>+</g>+<!-- u49&#45;&gt;u5 -->+<g id="edge19" class="edge"><title>u49&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3625.45,-728.498C3674.14,-704.123 3764.71,-650.388 3801.28,-573.272 3840.42,-490.744 3796.03,-379.643 3771.87,-330.047"/>+<polygon fill="black" stroke="black" points="3774.94,-328.356 3767.34,-320.974 3768.68,-331.484 3774.94,-328.356"/>+</g>+<!-- u60 -->+<g id="node8" class="node"><title>u60</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3394.28" cy="-744.272" rx="115.08" ry="18"/>+<text text-anchor="middle" x="3394.28" y="-740.572" font-family="Times,serif" font-size="14.00">CaptureMoveSortAlgorithm</text>+</g>+<!-- u65 -->+<g id="node9" class="node"><title>u65</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2921.28" cy="-524.272" rx="142.175" ry="18"/>+<text text-anchor="middle" x="2921.28" y="-520.572" font-family="Times,serif" font-size="14.00">WeightedMeanAndCriterionValues</text>+</g>+<!-- u40 -->+<g id="node73" class="node"><title>u40</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2866.28" cy="-303.272" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="2866.28" y="-299.572" font-family="Times,serif" font-size="14.00">ShowFloat</text>+</g>+<!-- u65&#45;&gt;u40 -->+<g id="edge20" class="edge"><title>u65&#45;&gt;u40</title>+<path fill="none" stroke="black" d="M2916.96,-506.088C2907.43,-468.108 2884.49,-376.786 2873.03,-331.16"/>+<polygon fill="black" stroke="black" points="2876.41,-330.223 2870.58,-321.377 2869.62,-331.929 2876.41,-330.223"/>+</g>+<!-- u65&#45;&gt;u5 -->+<g id="edge21" class="edge"><title>u65&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M2998.17,-509.102C3183.93,-474.513 3646.47,-386.128 3709.28,-352.272 3720.31,-346.329 3730.54,-337.166 3738.78,-328.432"/>+<polygon fill="black" stroke="black" points="3741.41,-330.744 3745.47,-320.96 3736.19,-326.075 3741.41,-330.744"/>+</g>+<!-- u66 -->+<g id="node10" class="node"><title>u66</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3206.28" cy="-744.272" rx="54.6905" ry="18"/>+<text text-anchor="middle" x="3206.28" y="-740.572" font-family="Times,serif" font-size="14.00">RankValues</text>+</g>+<!-- u66&#45;&gt;u12 -->+<g id="edge22" class="edge"><title>u66&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M3172.4,-730.034C3162.68,-726.235 3152.06,-722.088 3142.28,-718.272 2976.97,-653.768 2913.66,-677.826 2770.28,-573.272 2761.43,-566.819 2753.44,-557.889 2747.03,-549.479"/>+<polygon fill="black" stroke="black" points="2749.86,-547.42 2741.18,-541.354 2744.19,-551.513 2749.86,-547.42"/>+</g>+<!-- u66&#45;&gt;u16 -->+<g id="edge23" class="edge"><title>u66&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3238.53,-729.668C3248.59,-725.695 3259.81,-721.546 3270.28,-718.272 3536.26,-635.153 3633.07,-701.88 3880.28,-573.272 3888.45,-569.023 4086.04,-391.696 4157.66,-327.319"/>+<polygon fill="black" stroke="black" points="4160.26,-329.684 4165.36,-320.395 4155.58,-324.478 4160.26,-329.684"/>+</g>+<!-- u67 -->+<g id="node38" class="node"><title>u67</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4088.28" cy="-303.272" rx="29.4969" ry="18"/>+<text text-anchor="middle" x="4088.28" y="-299.572" font-family="Times,serif" font-size="14.00">Num</text>+</g>+<!-- u66&#45;&gt;u67 -->+<g id="edge24" class="edge"><title>u66&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M3238.9,-729.682C3248.88,-725.753 3259.96,-721.625 3270.28,-718.272 3512.76,-639.535 3603.53,-699.062 3825.28,-573.272 3938.33,-509.148 4034.53,-382.183 4071.78,-328.813"/>+<polygon fill="black" stroke="black" points="4074.84,-330.534 4077.64,-320.316 4069.08,-326.559 4074.84,-330.534"/>+</g>+<!-- u66&#45;&gt;u40 -->+<g id="edge25" class="edge"><title>u66&#45;&gt;u40</title>+<path fill="none" stroke="black" d="M3234.18,-728.627C3302.21,-691.022 3466.37,-587.729 3400.28,-498.272 3269.04,-320.636 3120.09,-456.327 2925.28,-352.272 2912.78,-345.596 2900.39,-336.083 2890.22,-327.284"/>+<polygon fill="black" stroke="black" points="2892.36,-324.505 2882.58,-320.448 2887.7,-329.723 2892.36,-324.505"/>+</g>+<!-- u66&#45;&gt;u5 -->+<g id="edge26" class="edge"><title>u66&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3231.5,-728.294C3278.42,-700.043 3381.69,-636.068 3462.28,-573.272 3569.91,-489.411 3686.7,-375.813 3735.18,-327.529"/>+<polygon fill="black" stroke="black" points="3737.76,-329.898 3742.36,-320.355 3732.81,-324.945 3737.76,-329.898"/>+</g>+<!-- u69 -->+<g id="node11" class="node"><title>u69</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2959.28" cy="-744.272" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="2959.28" y="-740.572" font-family="Times,serif" font-size="14.00">CriterionValue</text>+</g>+<!-- u69&#45;&gt;u65 -->+<g id="edge28" class="edge"><title>u69&#45;&gt;u65</title>+<path fill="none" stroke="black" d="M2956.3,-726.166C2949.72,-688.439 2933.93,-597.837 2926,-552.325"/>+<polygon fill="black" stroke="black" points="2929.41,-551.549 2924.25,-542.299 2922.52,-552.752 2929.41,-551.549"/>+</g>+<!-- u70 -->+<g id="node12" class="node"><title>u70</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3153.28" cy="-524.272" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="3153.28" y="-520.572" font-family="Times,serif" font-size="14.00">CriterionWeight</text>+</g>+<!-- u69&#45;&gt;u70 -->+<g id="edge29" class="edge"><title>u69&#45;&gt;u70</title>+<path fill="none" stroke="black" d="M2974.18,-726.528C3008.25,-688.248 3091.94,-594.205 3131.67,-549.559"/>+<polygon fill="black" stroke="black" points="3134.3,-551.871 3138.33,-542.074 3129.07,-547.217 3134.3,-551.871"/>+</g>+<!-- u21 -->+<g id="node103" class="node"><title>u21</title>+<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="3218.28" cy="-303.272" rx="33.5952" ry="18"/>+<text text-anchor="middle" x="3218.28" y="-299.572" font-family="Times,serif" font-size="14.00">Types</text>+</g>+<!-- u69&#45;&gt;u21 -->+<g id="edge27" class="edge"><title>u69&#45;&gt;u21</title>+<path fill="none" stroke="black" d="M2997.18,-729.533C3099.69,-692.193 3375.59,-590.493 3387.28,-573.272 3449.41,-481.748 3310.45,-368.52 3247.36,-323.775"/>+<polygon fill="black" stroke="black" points="3249.19,-320.785 3238.99,-317.925 3245.18,-326.522 3249.19,-320.785"/>+</g>+<!-- u70&#45;&gt;u16 -->+<g id="edge30" class="edge"><title>u70&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3194.08,-509.305C3206.56,-505.364 3220.4,-501.323 3233.28,-498.272 3624.62,-405.622 3760.9,-520.277 4126.28,-352.272 4139.08,-346.387 4151.3,-336.824 4161.13,-327.777"/>+<polygon fill="black" stroke="black" points="4163.68,-330.172 4168.45,-320.712 4158.82,-325.133 4163.68,-330.172"/>+</g>+<!-- u70&#45;&gt;u67 -->+<g id="edge31" class="edge"><title>u70&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M3194.11,-509.424C3206.59,-505.486 3220.42,-501.418 3233.28,-498.272 3591.58,-410.643 3733.71,-541.601 4050.28,-352.272 4059.72,-346.626 4067.74,-337.699 4073.94,-329.068"/>+<polygon fill="black" stroke="black" points="4076.91,-330.933 4079.53,-320.667 4071.08,-327.058 4076.91,-330.933"/>+</g>+<!-- u70&#45;&gt;u5 -->+<g id="edge32" class="edge"><title>u70&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3196.45,-509.737C3208.38,-506.009 3221.33,-501.974 3233.28,-498.272 3444.66,-432.826 3519.07,-465.349 3709.28,-352.272 3719.94,-345.936 3730.03,-336.813 3738.26,-328.219"/>+<polygon fill="black" stroke="black" points="3741.09,-330.313 3745.25,-320.57 3735.92,-325.59 3741.09,-330.313"/>+</g>+<!-- u13 -->+<g id="node13" class="node"><title>u13</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2461.28" cy="-944.272" rx="55.7903" ry="18"/>+<text text-anchor="middle" x="2461.28" y="-940.572" font-family="Times,serif" font-size="14.00">Coordinates</text>+</g>+<!-- u13&#45;&gt;u14 -->+<g id="edge33" class="edge"><title>u13&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M2513.66,-937.848C2618.18,-925.295 2857.71,-887.758 3034.28,-793.272 3046.03,-786.985 3057.33,-777.648 3066.53,-768.876"/>+<polygon fill="black" stroke="black" points="3069.1,-771.253 3073.72,-761.72 3064.16,-766.29 3069.1,-771.253"/>+</g>+<!-- u13&#45;&gt;u19 -->+<g id="edge34" class="edge"><title>u13&#45;&gt;u19</title>+<path fill="none" stroke="black" d="M2477.32,-926.732C2511.19,-891.805 2590.13,-810.399 2629.73,-769.554"/>+<polygon fill="black" stroke="black" points="2632.43,-771.801 2636.88,-762.186 2627.41,-766.928 2632.43,-771.801"/>+</g>+<!-- u22 -->+<g id="node15" class="node"><title>u22</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2452.28" cy="-744.272" rx="42.7926" ry="18"/>+<text text-anchor="middle" x="2452.28" y="-740.572" font-family="Times,serif" font-size="14.00">Ordinate</text>+</g>+<!-- u13&#45;&gt;u22 -->+<g id="edge35" class="edge"><title>u13&#45;&gt;u22</title>+<path fill="none" stroke="black" d="M2460.5,-926.048C2458.93,-891.587 2455.4,-813.918 2453.52,-772.496"/>+<polygon fill="black" stroke="black" points="2457.01,-772.147 2453.06,-762.316 2450.01,-772.465 2457.01,-772.147"/>+</g>+<!-- u23 -->+<g id="node72" class="node"><title>u23</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2355.28" cy="-303.272" rx="45.4919" ry="18"/>+<text text-anchor="middle" x="2355.28" y="-299.572" font-family="Times,serif" font-size="14.00">Rotatable</text>+</g>+<!-- u13&#45;&gt;u23 -->+<g id="edge36" class="edge"><title>u13&#45;&gt;u23</title>+<path fill="none" stroke="black" d="M2452.43,-926.277C2438.68,-899.032 2412.53,-843.529 2400.28,-793.272 2358.34,-621.165 2354.84,-406.3 2355.01,-331.465"/>+<polygon fill="black" stroke="black" points="2358.51,-331.478 2355.05,-321.461 2351.51,-331.445 2358.51,-331.478"/>+</g>+<!-- u13&#45;&gt;u5 -->+<g id="edge37" class="edge"><title>u13&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M2467.2,-925.939C2476.44,-898.231 2494.28,-842.106 2504.28,-793.272 2517.53,-728.546 2494.55,-544.981 2541.28,-498.272 2726.28,-313.349 3473.71,-465.983 3709.28,-352.272 3720.73,-346.747 3731.15,-337.485 3739.41,-328.563"/>+<polygon fill="black" stroke="black" points="3742.14,-330.749 3746.08,-320.912 3736.87,-326.148 3742.14,-330.749"/>+</g>+<!-- u20 -->+<g id="node14" class="node"><title>u20</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2452.28" cy="-524.272" rx="42.7926" ry="18"/>+<text text-anchor="middle" x="2452.28" y="-520.572" font-family="Times,serif" font-size="14.00">Abscissa</text>+</g>+<!-- u20&#45;&gt;u21 -->+<g id="edge38" class="edge"><title>u20&#45;&gt;u21</title>+<path fill="none" stroke="black" d="M2479.79,-510.239C2489.04,-506.115 2499.5,-501.734 2509.28,-498.272 2758.1,-410.199 3067.66,-337.807 3177.4,-313.247"/>+<polygon fill="black" stroke="black" points="3178.38,-316.613 3187.38,-311.021 3176.86,-309.78 3178.38,-316.613"/>+</g>+<!-- u22&#45;&gt;u7 -->+<g id="edge39" class="edge"><title>u22&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M2464.76,-726.887C2493.59,-689.026 2564.98,-595.273 2599.28,-550.223"/>+<polygon fill="black" stroke="black" points="2602.16,-552.224 2605.43,-542.148 2596.59,-547.983 2602.16,-552.224"/>+</g>+<!-- u22&#45;&gt;u20 -->+<g id="edge40" class="edge"><title>u22&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M2452.28,-726.166C2452.28,-688.439 2452.28,-597.837 2452.28,-552.325"/>+<polygon fill="black" stroke="black" points="2455.78,-552.299 2452.28,-542.299 2448.78,-552.299 2455.78,-552.299"/>+</g>+<!-- u24 -->+<g id="node16" class="node"><title>u24</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2443.28" cy="-1135.27" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="2443.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Vector</text>+</g>+<!-- u24&#45;&gt;u13 -->+<g id="edge41" class="edge"><title>u24&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M2444.91,-1117.17C2448.04,-1084.29 2454.92,-1012.03 2458.69,-972.476"/>+<polygon fill="black" stroke="black" points="2462.18,-972.763 2459.64,-962.476 2455.21,-972.099 2462.18,-972.763"/>+</g>+<!-- u10 -->+<g id="node17" class="node"><title>u10</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1681.28" cy="-744.272" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="1681.28" y="-740.572" font-family="Times,serif" font-size="14.00">Move</text>+</g>+<!-- u10&#45;&gt;u11 -->+<g id="edge42" class="edge"><title>u10&#45;&gt;u11</title>+<path fill="none" stroke="black" d="M1710.78,-752.003C1863.83,-791.445 2567.56,-964.384 2753.28,-859.772 2786.4,-841.12 2805.64,-799.783 2815.3,-771.965"/>+<polygon fill="black" stroke="black" points="2818.65,-772.988 2818.44,-762.396 2812,-770.81 2818.65,-772.988"/>+</g>+<!-- u10&#45;&gt;u24 -->+<g id="edge43" class="edge"><title>u10&#45;&gt;u24</title>+<path fill="none" stroke="black" d="M1712.89,-748.918C1804.82,-760.746 2077.34,-804.592 2263.28,-926.272 2338.82,-975.71 2400.96,-1065.57 2428.29,-1109.18"/>+<polygon fill="black" stroke="black" points="2425.35,-1111.09 2433.58,-1117.75 2431.31,-1107.41 2425.35,-1111.09"/>+</g>+<!-- u27 -->+<g id="node18" class="node"><title>u27</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1996.28" cy="-944.272" rx="31.6951" ry="18"/>+<text text-anchor="middle" x="1996.28" y="-940.572" font-family="Times,serif" font-size="14.00">Piece</text>+</g>+<!-- u27&#45;&gt;u12 -->+<g id="edge44" class="edge"><title>u27&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M2011.09,-927.977C2050.35,-888.202 2161.75,-780.319 2273.28,-718.272 2445.49,-622.474 2530.86,-686.293 2692.28,-573.272 2701.25,-566.991 2709.27,-558.095 2715.66,-549.665"/>+<polygon fill="black" stroke="black" points="2718.53,-551.676 2721.49,-541.505 2712.83,-547.606 2718.53,-551.676"/>+</g>+<!-- u27&#45;&gt;u24 -->+<g id="edge45" class="edge"><title>u27&#45;&gt;u24</title>+<path fill="none" stroke="black" d="M2021.05,-955.744C2095.73,-987.32 2318.97,-1081.71 2407.01,-1118.94"/>+<polygon fill="black" stroke="black" points="2405.75,-1122.2 2416.33,-1122.88 2408.48,-1115.76 2405.75,-1122.2"/>+</g>+<!-- u28 -->+<g id="node19" class="node"><title>u28</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1681.28" cy="-944.272" rx="67.6881" ry="18"/>+<text text-anchor="middle" x="1681.28" y="-940.572" font-family="Times,serif" font-size="14.00">QualifiedMove</text>+</g>+<!-- u28&#45;&gt;u10 -->+<g id="edge46" class="edge"><title>u28&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M1681.28,-926.048C1681.28,-891.587 1681.28,-813.918 1681.28,-772.496"/>+<polygon fill="black" stroke="black" points="1684.78,-772.316 1681.28,-762.316 1677.78,-772.316 1684.78,-772.316"/>+</g>+<!-- u29 -->+<g id="node20" class="node"><title>u29</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1736.28" cy="-1135.27" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="1736.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Turn</text>+</g>+<!-- u29&#45;&gt;u28 -->+<g id="edge47" class="edge"><title>u29&#45;&gt;u28</title>+<path fill="none" stroke="black" d="M1731.4,-1117.5C1721.84,-1084.66 1700.59,-1011.63 1689.07,-972.04"/>+<polygon fill="black" stroke="black" points="1692.38,-970.903 1686.23,-962.279 1685.66,-972.859 1692.38,-970.903"/>+</g>+<!-- u31 -->+<g id="node21" class="node"><title>u31</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1856.28" cy="-944.272" rx="89.8845" ry="18"/>+<text text-anchor="middle" x="1856.28" y="-940.572" font-family="Times,serif" font-size="14.00">EitherQualifiedMove</text>+</g>+<!-- u31&#45;&gt;u10 -->+<g id="edge48" class="edge"><title>u31&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M1841.36,-926.391C1810.04,-890.957 1737.41,-808.778 1701.76,-768.446"/>+<polygon fill="black" stroke="black" points="1704.19,-765.909 1694.95,-760.734 1698.95,-770.545 1704.19,-765.909"/>+</g>+<!-- u32 -->+<g id="node22" class="node"><title>u32</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1652.28" cy="-1135.27" rx="37.0935" ry="18"/>+<text text-anchor="middle" x="1652.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Zobrist</text>+</g>+<!-- u32&#45;&gt;u12 -->+<g id="edge49" class="edge"><title>u32&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M1675.47,-1121.15C1682.71,-1117.2 1690.76,-1112.94 1698.28,-1109.27 1845.9,-1037.33 1893.56,-1041.73 2037.28,-962.272 2205.16,-869.468 2227.41,-814.613 2393.28,-718.272 2520.99,-644.095 2576.52,-664.987 2692.28,-573.272 2700.65,-566.641 2708.4,-557.918 2714.76,-549.729"/>+<polygon fill="black" stroke="black" points="2717.71,-551.622 2720.83,-541.499 2712.08,-547.463 2717.71,-551.622"/>+</g>+<!-- u32&#45;&gt;u13 -->+<g id="edge50" class="edge"><title>u32&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M1674.14,-1120.73C1681.58,-1116.58 1690.1,-1112.3 1698.28,-1109.27 1949.34,-1016.27 2267.42,-969.129 2399.48,-952.462"/>+<polygon fill="black" stroke="black" points="2399.92,-955.934 2409.41,-951.221 2399.06,-948.987 2399.92,-955.934"/>+</g>+<!-- u44 -->+<g id="node23" class="node"><title>u44</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1949.28" cy="-1135.27" rx="78.7863" ry="18"/>+<text text-anchor="middle" x="1949.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PieceSquareArray</text>+</g>+<!-- u44&#45;&gt;u27 -->+<g id="edge51" class="edge"><title>u44&#45;&gt;u27</title>+<path fill="none" stroke="black" d="M1953.53,-1117.17C1961.75,-1084.13 1979.85,-1011.36 1989.65,-971.924"/>+<polygon fill="black" stroke="black" points="1993.05,-972.753 1992.07,-962.203 1986.26,-971.063 1993.05,-972.753"/>+</g>+<!-- u45 -->+<g id="node35" class="node"><title>u45</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4362.28" cy="-303.272" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="4362.28" y="-299.572" font-family="Times,serif" font-size="14.00">Bool</text>+</g>+<!-- u44&#45;&gt;u45 -->+<g id="edge52" class="edge"><title>u44&#45;&gt;u45</title>+<path fill="none" stroke="black" d="M1995.87,-1120.73C2010.07,-1116.81 2025.76,-1112.67 2040.28,-1109.27 2759.25,-941.126 3002.51,-1106.21 3671.28,-793.272 3719.06,-770.914 3719.94,-748.343 3763.28,-718.272 3868.19,-645.494 3903.92,-642.38 4011.28,-573.272 4154.47,-481.1 4200.61,-469.34 4324.28,-352.272 4331.84,-345.114 4339.18,-336.405 4345.36,-328.38"/>+<polygon fill="black" stroke="black" points="4348.17,-330.468 4351.34,-320.359 4342.56,-326.284 4348.17,-330.468"/>+</g>+<!-- u2 -->+<g id="node24" class="node"><title>u2</title>+<ellipse fill="#ffbbff" stroke="black" stroke-width="0" cx="344.281" cy="-2217.27" rx="66.8882" ry="18"/>+<text text-anchor="middle" x="344.281" y="-2213.57" font-family="Times,serif" font-size="14.00">SignalHandlers</text>+</g>+<!-- u3 -->+<g id="node96" class="node"><title>u3</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="3746.28" cy="-524.272" rx="31.3957" ry="18"/>+<text text-anchor="middle" x="3746.28" y="-520.572" font-family="Times,serif" font-size="14.00">Show</text>+</g>+<!-- u2&#45;&gt;u3 -->+<g id="edge53" class="edge"><title>u2&#45;&gt;u3</title>+<path fill="none" stroke="black" d="M331.804,-2199.5C252.035,-2090.12 -174.418,-1471.47 105.281,-1109.27 595.063,-475.026 2910.52,-825.063 3671.28,-573.272 3689.39,-567.279 3707.47,-555.912 3721.33,-545.743"/>+<polygon fill="black" stroke="black" points="3723.54,-548.462 3729.39,-539.626 3719.31,-542.888 3723.54,-548.462"/>+</g>+<!-- u97 -->+<g id="node25" class="node"><title>u97</title>+<ellipse fill="#ffbbff" stroke="black" stroke-width="0" cx="478.281" cy="-2217.27" rx="49.2915" ry="18"/>+<text text-anchor="middle" x="478.281" y="-2213.57" font-family="Times,serif" font-size="14.00">Pondering</text>+</g>+<!-- u6 -->+<g id="node26" class="node"><title>u6</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3684.28" cy="-1577.27" rx="29.795" ry="18"/>+<text text-anchor="middle" x="3684.28" y="-1573.57" font-family="Times,serif" font-size="14.00">PGN</text>+</g>+<!-- u25 -->+<g id="node27" class="node"><title>u25</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3684.28" cy="-1356.27" rx="66.8882" ry="18"/>+<text text-anchor="middle" x="3684.28" y="-1352.57" font-family="Times,serif" font-size="14.00">PGNComment</text>+</g>+<!-- u6&#45;&gt;u25 -->+<g id="edge54" class="edge"><title>u6&#45;&gt;u25</title>+<path fill="none" stroke="black" d="M3684.28,-1559.09C3684.28,-1521.19 3684.28,-1430.17 3684.28,-1384.45"/>+<polygon fill="black" stroke="black" points="3687.78,-1384.38 3684.28,-1374.38 3680.78,-1384.38 3687.78,-1384.38"/>+</g>+<!-- u26 -->+<g id="node28" class="node"><title>u26</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3520.28" cy="-1356.27" rx="79.0865" ry="18"/>+<text text-anchor="middle" x="3520.28" y="-1352.57" font-family="Times,serif" font-size="14.00">StandardAlgebraic</text>+</g>+<!-- u6&#45;&gt;u26 -->+<g id="edge55" class="edge"><title>u6&#45;&gt;u26</title>+<path fill="none" stroke="black" d="M3672.49,-1560.52C3644.34,-1522.93 3573.03,-1427.71 3538.96,-1382.22"/>+<polygon fill="black" stroke="black" points="3541.66,-1379.98 3532.86,-1374.07 3536.05,-1384.17 3541.66,-1379.98"/>+</g>+<!-- u55 -->+<g id="node36" class="node"><title>u55</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4448.28" cy="-303.272" rx="38.9931" ry="18"/>+<text text-anchor="middle" x="4448.28" y="-299.572" font-family="Times,serif" font-size="14.00">Integral</text>+</g>+<!-- u6&#45;&gt;u55 -->+<g id="edge56" class="edge"><title>u6&#45;&gt;u55</title>+<path fill="none" stroke="black" d="M3709.28,-1567.33C3724.69,-1562.07 3744.95,-1555.63 3763.28,-1551.27 3961.69,-1504.16 4537.05,-1560.52 4669.28,-1405.27 4800.73,-1250.94 4657,-681.988 4571.28,-498.272 4541.12,-433.639 4493.07,-364.63 4466.85,-328.904"/>+<polygon fill="black" stroke="black" points="4469.44,-326.518 4460.67,-320.561 4463.81,-330.681 4469.44,-326.518"/>+</g>+<!-- u30 -->+<g id="node58" class="node"><title>u30</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1526.28" cy="-1577.27" rx="33.2948" ry="18"/>+<text text-anchor="middle" x="1526.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Game</text>+</g>+<!-- u26&#45;&gt;u30 -->+<g id="edge57" class="edge"><title>u26&#45;&gt;u30</title>+<path fill="none" stroke="black" d="M3450.59,-1364.93C3132.33,-1399.88 1821.62,-1543.84 1568.65,-1571.62"/>+<polygon fill="black" stroke="black" points="1567.97,-1568.17 1558.41,-1572.74 1568.73,-1575.13 1567.97,-1568.17"/>+</g>+<!-- u56 -->+<g id="node29" class="node"><title>u56</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3651.28" cy="-1776.27" rx="62.2891" ry="18"/>+<text text-anchor="middle" x="3651.28" y="-1772.57" font-family="Times,serif" font-size="14.00">PGNDatabase</text>+</g>+<!-- u56&#45;&gt;u6 -->+<g id="edge58" class="edge"><title>u56&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M3654.15,-1758.13C3659.91,-1723.77 3672.89,-1646.24 3679.79,-1605.1"/>+<polygon fill="black" stroke="black" points="3683.24,-1605.67 3681.44,-1595.23 3676.34,-1604.51 3683.24,-1605.67"/>+</g>+<!-- u57 -->+<g id="node30" class="node"><title>u57</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3617.28" cy="-1997.27" rx="90.9839" ry="18"/>+<text text-anchor="middle" x="3617.28" y="-1993.57" font-family="Times,serif" font-size="14.00">QualifiedMoveForest</text>+</g>+<!-- u57&#45;&gt;u56 -->+<g id="edge59" class="edge"><title>u57&#45;&gt;u56</title>+<path fill="none" stroke="black" d="M3619.95,-1979.09C3625.83,-1941.19 3639.96,-1850.17 3647.06,-1804.45"/>+<polygon fill="black" stroke="black" points="3650.55,-1804.8 3648.63,-1794.38 3643.63,-1803.72 3650.55,-1804.8"/>+</g>+<!-- u59 -->+<g id="node62" class="node"><title>u59</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1508.28" cy="-1776.27" rx="50.8918" ry="18"/>+<text text-anchor="middle" x="1508.28" y="-1772.57" font-family="Times,serif" font-size="14.00">GameTree</text>+</g>+<!-- u57&#45;&gt;u59 -->+<g id="edge60" class="edge"><title>u57&#45;&gt;u59</title>+<path fill="none" stroke="black" d="M3545.48,-1986.18C3510.46,-1981.4 3467.71,-1975.77 3429.28,-1971.27 2695.66,-1885.47 1801.74,-1803.65 1566.99,-1782.52"/>+<polygon fill="black" stroke="black" points="1567.23,-1779.03 1556.96,-1781.62 1566.6,-1786 1567.23,-1779.03"/>+</g>+<!-- u95 -->+<g id="node31" class="node"><title>u95</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3617.28" cy="-2217.27" rx="133.776" ry="18"/>+<text text-anchor="middle" x="3617.28" y="-2213.57" font-family="Times,serif" font-size="14.00">PositionHashQualifiedMoveTree</text>+</g>+<!-- u95&#45;&gt;u57 -->+<g id="edge61" class="edge"><title>u95&#45;&gt;u57</title>+<path fill="none" stroke="black" d="M3617.28,-2199.17C3617.28,-2161.44 3617.28,-2070.84 3617.28,-2025.33"/>+<polygon fill="black" stroke="black" points="3620.78,-2025.3 3617.28,-2015.3 3613.78,-2025.3 3620.78,-2025.3"/>+</g>+<!-- u1 -->+<g id="node32" class="node"><title>u1</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4725.28" cy="-303.272" rx="29.795" ry="18"/>+<text text-anchor="middle" x="4725.28" y="-299.572" font-family="Times,serif" font-size="14.00">Float</text>+</g>+<!-- u58 -->+<g id="node37" class="node"><title>u58</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4552.28" cy="-303.272" rx="46.5926" ry="18"/>+<text text-anchor="middle" x="4552.28" y="-299.572" font-family="Times,serif" font-size="14.00">RoseTree</text>+</g>+<!-- u81 -->+<g id="node39" class="node"><title>u81</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4282.28" cy="-303.272" rx="33.2948" ry="18"/>+<text text-anchor="middle" x="4282.28" y="-299.572" font-family="Times,serif" font-size="14.00">Either</text>+</g>+<!-- u98 -->+<g id="node40" class="node"><title>u98</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4647.28" cy="-303.272" rx="30.5947" ry="18"/>+<text text-anchor="middle" x="4647.28" y="-299.572" font-family="Times,serif" font-size="14.00">Time</text>+</g>+<!-- u64 -->+<g id="node41" class="node"><title>u64</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3279.28" cy="-1997.27" rx="138.375" ry="18"/>+<text text-anchor="middle" x="3279.28" y="-1993.57" font-family="Times,serif" font-size="14.00">PositionHashQuantifiedGameTree</text>+</g>+<!-- u74 -->+<g id="node43" class="node"><title>u74</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3345.28" cy="-1776.27" rx="72.2875" ry="18"/>+<text text-anchor="middle" x="3345.28" y="-1772.57" font-family="Times,serif" font-size="14.00">QuantifiedGame</text>+</g>+<!-- u64&#45;&gt;u74 -->+<g id="edge62" class="edge"><title>u64&#45;&gt;u74</title>+<path fill="none" stroke="black" d="M3284.46,-1979.09C3295.91,-1941.11 3323.43,-1849.79 3337.18,-1804.16"/>+<polygon fill="black" stroke="black" points="3340.59,-1804.96 3340.13,-1794.38 3333.89,-1802.94 3340.59,-1804.96"/>+</g>+<!-- u75 -->+<g id="node47" class="node"><title>u75</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4029.28" cy="-1356.27" rx="64.189" ry="18"/>+<text text-anchor="middle" x="4029.28" y="-1352.57" font-family="Times,serif" font-size="14.00">SearchOptions</text>+</g>+<!-- u64&#45;&gt;u75 -->+<g id="edge63" class="edge"><title>u64&#45;&gt;u75</title>+<path fill="none" stroke="black" d="M3273.29,-1979.2C3251.42,-1913.45 3183.08,-1674.09 3300.28,-1551.27 3506.49,-1335.18 3681.21,-1521.68 3956.28,-1405.27 3971.83,-1398.69 3987.66,-1388.76 4000.58,-1379.63"/>+<polygon fill="black" stroke="black" points="4003,-1382.21 4009.03,-1373.5 3998.88,-1376.54 4003,-1382.21"/>+</g>+<!-- u64&#45;&gt;u59 -->+<g id="edge64" class="edge"><title>u64&#45;&gt;u59</title>+<path fill="none" stroke="black" d="M3182.81,-1984.34C2859.58,-1944.37 1820.87,-1815.93 1565.43,-1784.34"/>+<polygon fill="black" stroke="black" points="1565.62,-1780.84 1555.26,-1783.08 1564.76,-1787.78 1565.62,-1780.84"/>+</g>+<!-- u68 -->+<g id="node42" class="node"><title>u68</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3345.28" cy="-1577.27" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="3345.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Fitness</text>+</g>+<!-- u72 -->+<g id="node45" class="node"><title>u72</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3868.28" cy="-1356.27" rx="78.7863" ry="18"/>+<text text-anchor="middle" x="3868.28" y="-1352.57" font-family="Times,serif" font-size="14.00">EvaluationOptions</text>+</g>+<!-- u68&#45;&gt;u72 -->+<g id="edge65" class="edge"><title>u68&#45;&gt;u72</title>+<path fill="none" stroke="black" d="M3372.83,-1565.45C3439.96,-1538.98 3617.21,-1468.51 3763.28,-1405.27 3784.05,-1396.28 3806.93,-1385.88 3826.01,-1377.07"/>+<polygon fill="black" stroke="black" points="3827.73,-1380.13 3835.33,-1372.75 3824.79,-1373.78 3827.73,-1380.13"/>+</g>+<!-- u68&#45;&gt;u30 -->+<g id="edge66" class="edge"><title>u68&#45;&gt;u30</title>+<path fill="none" stroke="black" d="M3312.19,-1585C3164.54,-1618.46 2551.18,-1746.8 2049.28,-1692.27 1865.25,-1672.28 1651.1,-1613.82 1565.01,-1588.82"/>+<polygon fill="black" stroke="black" points="1565.98,-1585.46 1555.4,-1586.01 1564.02,-1592.18 1565.98,-1585.46"/>+</g>+<!-- u74&#45;&gt;u68 -->+<g id="edge67" class="edge"><title>u74&#45;&gt;u68</title>+<path fill="none" stroke="black" d="M3345.28,-1758.13C3345.28,-1723.93 3345.28,-1646.96 3345.28,-1605.67"/>+<polygon fill="black" stroke="black" points="3348.78,-1605.51 3345.28,-1595.51 3341.78,-1605.51 3348.78,-1605.51"/>+</g>+<!-- u71 -->+<g id="node44" class="node"><title>u71</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3845.28" cy="-1135.27" rx="69.5877" ry="18"/>+<text text-anchor="middle" x="3845.28" y="-1131.57" font-family="Times,serif" font-size="14.00">CriteriaWeights</text>+</g>+<!-- u71&#45;&gt;u69 -->+<g id="edge68" class="edge"><title>u71&#45;&gt;u69</title>+<path fill="none" stroke="black" d="M3805.79,-1120.41C3686.39,-1077.93 3319.93,-943.319 3034.28,-793.272 3019.49,-785.504 3003.82,-775.741 2990.65,-767.052"/>+<polygon fill="black" stroke="black" points="2992.24,-763.898 2981.98,-761.245 2988.34,-769.716 2992.24,-763.898"/>+</g>+<!-- u72&#45;&gt;u66 -->+<g id="edge69" class="edge"><title>u72&#45;&gt;u66</title>+<path fill="none" stroke="black" d="M3850.23,-1338.64C3757.94,-1253.6 3338.99,-867.553 3231.48,-768.493"/>+<polygon fill="black" stroke="black" points="3233.73,-765.807 3224.01,-761.605 3228.99,-770.955 3233.73,-765.807"/>+</g>+<!-- u72&#45;&gt;u44 -->+<g id="edge70" class="edge"><title>u72&#45;&gt;u44</title>+<path fill="none" stroke="black" d="M3819.7,-1342.11C3802.05,-1337.75 3781.88,-1333.26 3763.28,-1330.27 3004.47,-1208.49 2777.81,-1400.32 2040.28,-1184.27 2020.03,-1178.34 1999.1,-1167.66 1982.42,-1157.88"/>+<polygon fill="black" stroke="black" points="1983.99,-1154.74 1973.62,-1152.58 1980.37,-1160.74 1983.99,-1154.74"/>+</g>+<!-- u72&#45;&gt;u71 -->+<g id="edge71" class="edge"><title>u72&#45;&gt;u71</title>+<path fill="none" stroke="black" d="M3866.48,-1338.09C3862.5,-1300.19 3852.94,-1209.17 3848.13,-1163.45"/>+<polygon fill="black" stroke="black" points="3851.6,-1162.96 3847.08,-1153.38 3844.64,-1163.69 3851.6,-1162.96"/>+</g>+<!-- u73 -->+<g id="node46" class="node"><title>u73</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4011.28" cy="-1135.27" rx="77.9862" ry="18"/>+<text text-anchor="middle" x="4011.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PieceSquareTable</text>+</g>+<!-- u72&#45;&gt;u73 -->+<g id="edge72" class="edge"><title>u72&#45;&gt;u73</title>+<path fill="none" stroke="black" d="M3879.5,-1338.09C3904.51,-1299.79 3964.94,-1207.24 3994.47,-1162.02"/>+<polygon fill="black" stroke="black" points="3997.57,-1163.66 4000.11,-1153.38 3991.71,-1159.84 3997.57,-1163.66"/>+</g>+<!-- u73&#45;&gt;u12 -->+<g id="edge73" class="edge"><title>u73&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M3965.36,-1120.57C3952.14,-1116.76 3937.67,-1112.73 3924.28,-1109.27 3315.02,-952.104 2936.41,-1285.35 2544.28,-793.272 2523.51,-767.204 2531.37,-749.003 2544.28,-718.272 2579.96,-633.378 2630.26,-641.338 2692.28,-573.272 2699.18,-565.696 2706.36,-557.094 2712.65,-549.287"/>+<polygon fill="black" stroke="black" points="2715.59,-551.218 2719.07,-541.212 2710.11,-546.862 2715.59,-551.218"/>+</g>+<!-- u73&#45;&gt;u13 -->+<g id="edge74" class="edge"><title>u73&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M3967.82,-1120.23C3954.02,-1116.19 3938.62,-1112.11 3924.28,-1109.27 3390.21,-1003.39 2731.91,-960.161 2525.96,-948.633"/>+<polygon fill="black" stroke="black" points="2526.1,-945.136 2515.92,-948.076 2525.71,-952.125 2526.1,-945.136"/>+</g>+<!-- u73&#45;&gt;u45 -->+<g id="edge75" class="edge"><title>u73&#45;&gt;u45</title>+<path fill="none" stroke="black" d="M4037.14,-1118.2C4078.29,-1091.22 4158.3,-1032.8 4200.28,-962.272 4330.23,-743.963 4356.22,-425.744 4361.17,-331.518"/>+<polygon fill="black" stroke="black" points="4364.67,-331.558 4361.66,-321.4 4357.68,-331.217 4364.67,-331.558"/>+</g>+<!-- u73&#45;&gt;u67 -->+<g id="edge76" class="edge"><title>u73&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M4038.27,-1118.38C4079.95,-1092.07 4158.4,-1035.06 4189.28,-962.272 4287.17,-731.56 4146.75,-419.577 4101.51,-329.547"/>+<polygon fill="black" stroke="black" points="4104.62,-327.93 4096.96,-320.604 4098.38,-331.104 4104.62,-327.93"/>+</g>+<!-- u73&#45;&gt;u40 -->+<g id="edge77" class="edge"><title>u73&#45;&gt;u40</title>+<path fill="none" stroke="black" d="M3973.64,-1119.42C3896.76,-1088.25 3726.18,-1014.62 3693.28,-962.272 3665.81,-918.575 3705.02,-537.331 3671.28,-498.272 3450.43,-242.604 3231.22,-495.597 2925.28,-352.272 2912.26,-346.173 2899.64,-336.577 2889.44,-327.564"/>+<polygon fill="black" stroke="black" points="2891.54,-324.74 2881.81,-320.538 2886.8,-329.888 2891.54,-324.74"/>+</g>+<!-- u75&#45;&gt;u60 -->+<g id="edge78" class="edge"><title>u75&#45;&gt;u60</title>+<path fill="none" stroke="black" d="M4000.14,-1340.03C3949.5,-1312.77 3843.32,-1252.13 3766.28,-1184.27 3609.93,-1046.54 3461.41,-841.821 3411.75,-770.704"/>+<polygon fill="black" stroke="black" points="3414.51,-768.542 3405.93,-762.328 3408.76,-772.537 3414.51,-768.542"/>+</g>+<!-- u75&#45;&gt;u10 -->+<g id="edge79" class="edge"><title>u75&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M3993.74,-1341.22C3981.98,-1337.08 3968.72,-1332.94 3956.28,-1330.27 3615.21,-1257.03 2647.9,-1422.73 2393.28,-1184.27 2368.64,-1161.2 2400,-1137.36 2381.28,-1109.27 2295.5,-980.569 2221.93,-998.717 2085.28,-926.272 1952.65,-855.962 1787.24,-787.58 1716.27,-759.111"/>+<polygon fill="black" stroke="black" points="1717.48,-755.825 1706.89,-755.363 1714.88,-762.325 1717.48,-755.825"/>+</g>+<!-- u75&#45;&gt;u55 -->+<g id="edge80" class="edge"><title>u75&#45;&gt;u55</title>+<path fill="none" stroke="black" d="M4068.39,-1341.85C4079.64,-1338.05 4091.93,-1333.95 4103.28,-1330.27 4311.78,-1262.75 4444.26,-1360.7 4574.28,-1184.27 4779.11,-906.33 4529.73,-442.147 4463.56,-329.475"/>+<polygon fill="black" stroke="black" points="4466.54,-327.635 4458.43,-320.817 4460.52,-331.204 4466.54,-327.635"/>+</g>+<!-- u76 -->+<g id="node48" class="node"><title>u76</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4462.28" cy="-1135.27" rx="103.182" ry="18"/>+<text text-anchor="middle" x="4462.28" y="-1131.57" font-family="Times,serif" font-size="14.00">StandardOpeningOptions</text>+</g>+<!-- u75&#45;&gt;u76 -->+<g id="edge81" class="edge"><title>u75&#45;&gt;u76</title>+<path fill="none" stroke="black" d="M4059.04,-1340.22C4134.72,-1301.94 4334.62,-1200.84 4421.26,-1157.02"/>+<polygon fill="black" stroke="black" points="4422.93,-1160.1 4430.27,-1152.46 4419.77,-1153.85 4422.93,-1160.1"/>+</g>+<!-- u76&#45;&gt;u45 -->+<g id="edge82" class="edge"><title>u76&#45;&gt;u45</title>+<path fill="none" stroke="black" d="M4460.32,-1117.06C4451.86,-1042.97 4417.58,-743.79 4387.28,-498.272 4379.94,-438.762 4370.83,-369.053 4365.89,-331.525"/>+<polygon fill="black" stroke="black" points="4369.33,-330.849 4364.55,-321.392 4362.39,-331.764 4369.33,-330.849"/>+</g>+<!-- u76&#45;&gt;u5 -->+<g id="edge83" class="edge"><title>u76&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M4402.6,-1120.51C4236.15,-1081.99 3778.29,-975.066 3768.28,-962.272 3640.58,-799.06 3843.3,-703.463 3814.28,-498.272 3805.6,-436.88 3782.18,-367.715 3768.54,-330.823"/>+<polygon fill="black" stroke="black" points="3771.75,-329.44 3764.97,-321.306 3765.2,-331.899 3771.75,-329.44"/>+</g>+<!-- u77 -->+<g id="node49" class="node"><title>u77</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4161.28" cy="-1356.27" rx="49.2915" ry="18"/>+<text text-anchor="middle" x="4161.28" y="-1352.57" font-family="Times,serif" font-size="14.00">IOOptions</text>+</g>+<!-- u79 -->+<g id="node51" class="node"><title>u79</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4282.28" cy="-1135.27" rx="58.4896" ry="18"/>+<text text-anchor="middle" x="4282.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PGNOptions</text>+</g>+<!-- u77&#45;&gt;u79 -->+<g id="edge84" class="edge"><title>u77&#45;&gt;u79</title>+<path fill="none" stroke="black" d="M4170.57,-1338.45C4191.6,-1300.39 4242.94,-1207.47 4268.02,-1162.08"/>+<polygon fill="black" stroke="black" points="4271.18,-1163.6 4272.96,-1153.15 4265.06,-1160.21 4271.18,-1163.6"/>+</g>+<!-- u80 -->+<g id="node52" class="node"><title>u80</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4156.28" cy="-1135.27" rx="49.2915" ry="18"/>+<text text-anchor="middle" x="4156.28" y="-1131.57" font-family="Times,serif" font-size="14.00">UIOptions</text>+</g>+<!-- u77&#45;&gt;u80 -->+<g id="edge85" class="edge"><title>u77&#45;&gt;u80</title>+<path fill="none" stroke="black" d="M4160.89,-1338.09C4160.02,-1300.19 4157.94,-1209.17 4156.9,-1163.45"/>+<polygon fill="black" stroke="black" points="4160.4,-1163.29 4156.67,-1153.38 4153.4,-1163.45 4160.4,-1163.29"/>+</g>+<!-- u78 -->+<g id="node50" class="node"><title>u78</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3990.28" cy="-744.272" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="3990.28" y="-740.572" font-family="Times,serif" font-size="14.00">CECPFeatures</text>+</g>+<!-- u78&#45;&gt;u16 -->+<g id="edge86" class="edge"><title>u78&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3997.73,-726.332C4027.19,-659.322 4135.72,-412.456 4171.65,-330.737"/>+<polygon fill="black" stroke="black" points="4174.93,-331.962 4175.75,-321.399 4168.52,-329.145 4174.93,-331.962"/>+</g>+<!-- u78&#45;&gt;u45 -->+<g id="edge87" class="edge"><title>u78&#45;&gt;u45</title>+<path fill="none" stroke="black" d="M4016.88,-727.798C4061.43,-700.881 4152.05,-641.724 4211.28,-573.272 4279.15,-494.842 4330.74,-381.136 4351.85,-330.407"/>+<polygon fill="black" stroke="black" points="4355.21,-331.431 4355.77,-320.851 4348.74,-328.772 4355.21,-331.431"/>+</g>+<!-- u78&#45;&gt;u5 -->+<g id="edge88" class="edge"><title>u78&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3981.83,-726.244C3961.93,-686.248 3910.39,-583.264 3865.28,-498.272 3833.09,-437.61 3793.75,-367.199 3772.9,-330.144"/>+<polygon fill="black" stroke="black" points="3775.73,-328.034 3767.77,-321.04 3769.63,-331.471 3775.73,-328.034"/>+</g>+<!-- u79&#45;&gt;u6 -->+<g id="edge89" class="edge"><title>u79&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M4262.73,-1152.39C4249.64,-1162.58 4231.68,-1175.44 4214.28,-1184.27 4032.8,-1276.36 3919.51,-1181.84 3780.28,-1330.27 3756.68,-1355.43 3771.77,-1372.74 3760.28,-1405.27 3741.58,-1458.25 3713.46,-1517.68 3697.19,-1550.68"/>+<polygon fill="black" stroke="black" points="3694.05,-1549.13 3692.73,-1559.64 3700.32,-1552.24 3694.05,-1549.13"/>+</g>+<!-- u80&#45;&gt;u55 -->+<g id="edge90" class="edge"><title>u80&#45;&gt;u55</title>+<path fill="none" stroke="black" d="M4187.6,-1121.29C4239.35,-1098 4341.5,-1043.8 4387.28,-962.272 4508.71,-746.003 4468.55,-425.745 4453.12,-331.37"/>+<polygon fill="black" stroke="black" points="4456.53,-330.523 4451.42,-321.243 4449.63,-331.685 4456.53,-330.523"/>+</g>+<!-- u80&#45;&gt;u81 -->+<g id="edge91" class="edge"><title>u80&#45;&gt;u81</title>+<path fill="none" stroke="black" d="M4125.75,-1121C4034.66,-1081.36 3770.94,-966.359 3768.28,-962.272 3759.56,-948.861 3763.44,-941.521 3768.28,-926.272 3814.18,-781.81 4219.03,-376.375 4240.28,-352.272 4247.27,-344.342 4254.89,-335.651 4261.69,-327.87"/>+<polygon fill="black" stroke="black" points="4264.75,-329.695 4268.69,-319.862 4259.47,-325.089 4264.75,-329.695"/>+</g>+<!-- u82 -->+<g id="node53" class="node"><title>u82</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3841.28" cy="-944.272" rx="63.8893" ry="18"/>+<text text-anchor="middle" x="3841.28" y="-940.572" font-family="Times,serif" font-size="14.00">CECPOptions</text>+</g>+<!-- u80&#45;&gt;u82 -->+<g id="edge92" class="edge"><title>u80&#45;&gt;u82</title>+<path fill="none" stroke="black" d="M4131.83,-1119.6C4076.3,-1086.28 3940.56,-1004.84 3876.22,-966.233"/>+<polygon fill="black" stroke="black" points="3877.63,-963.002 3867.26,-960.859 3874.03,-969.005 3877.63,-963.002"/>+</g>+<!-- u83 -->+<g id="node54" class="node"><title>u83</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4107.28" cy="-944.272" rx="73.387" ry="18"/>+<text text-anchor="middle" x="4107.28" y="-940.572" font-family="Times,serif" font-size="14.00">NativeUIOptions</text>+</g>+<!-- u80&#45;&gt;u83 -->+<g id="edge93" class="edge"><title>u80&#45;&gt;u83</title>+<path fill="none" stroke="black" d="M4151.85,-1117.17C4143.3,-1084.22 4124.51,-1011.73 4114.27,-972.223"/>+<polygon fill="black" stroke="black" points="4117.64,-971.277 4111.74,-962.476 4110.86,-973.034 4117.64,-971.277"/>+</g>+<!-- u84 -->+<g id="node55" class="node"><title>u84</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3969.28" cy="-944.272" rx="46.5926" ry="18"/>+<text text-anchor="middle" x="3969.28" y="-940.572" font-family="Times,serif" font-size="14.00">Verbosity</text>+</g>+<!-- u80&#45;&gt;u84 -->+<g id="edge94" class="edge"><title>u80&#45;&gt;u84</title>+<path fill="none" stroke="black" d="M4140.34,-1118.16C4107.22,-1084.68 4030.85,-1007.5 3992.35,-968.593"/>+<polygon fill="black" stroke="black" points="3994.71,-965.993 3985.18,-961.346 3989.73,-970.916 3994.71,-965.993"/>+</g>+<!-- u36 -->+<g id="node64" class="node"><title>u36</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="430.281" cy="-1356.27" rx="64.9885" ry="18"/>+<text text-anchor="middle" x="430.281" y="-1352.57" font-family="Times,serif" font-size="14.00">MoveNotation</text>+</g>+<!-- u80&#45;&gt;u36 -->+<g id="edge95" class="edge"><title>u80&#45;&gt;u36</title>+<path fill="none" stroke="black" d="M4141.87,-1152.87C4131.11,-1163.98 4115.37,-1177.72 4098.28,-1184.27 3359.2,-1467.68 1323.82,-1225.13 539.281,-1330.27 521.345,-1332.68 502.02,-1336.64 484.696,-1340.72"/>+<polygon fill="black" stroke="black" points="483.652,-1337.37 474.752,-1343.12 485.294,-1344.17 483.652,-1337.37"/>+</g>+<!-- u62 -->+<g id="node76" class="node"><title>u62</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2963.28" cy="-303.272" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="2963.28" y="-299.572" font-family="Times,serif" font-size="14.00">Tree</text>+</g>+<!-- u80&#45;&gt;u62 -->+<g id="edge96" class="edge"><title>u80&#45;&gt;u62</title>+<path fill="none" stroke="black" d="M4125.61,-1120.96C4116.8,-1117.16 4107.17,-1113.03 4098.28,-1109.27 3940.98,-1042.81 3847.09,-1097.87 3743.28,-962.272 3727.48,-941.634 3700.9,-517.379 3683.28,-498.272 3471.65,-268.812 3255.84,-525.671 2996.28,-352.272 2987.88,-346.662 2981.01,-338.123 2975.76,-329.795"/>+<polygon fill="black" stroke="black" points="2978.72,-327.914 2970.7,-320.989 2972.65,-331.403 2978.72,-327.914"/>+</g>+<!-- u82&#45;&gt;u78 -->+<g id="edge97" class="edge"><title>u82&#45;&gt;u78</title>+<path fill="none" stroke="black" d="M3853.98,-926.391C3880.27,-891.467 3940.72,-811.137 3971.51,-770.215"/>+<polygon fill="black" stroke="black" points="3974.39,-772.206 3977.61,-762.111 3968.8,-767.997 3974.39,-772.206"/>+</g>+<!-- u83&#45;&gt;u49 -->+<g id="edge98" class="edge"><title>u83&#45;&gt;u49</title>+<path fill="none" stroke="black" d="M4069.48,-928.713C3977.05,-893.104 3739.78,-801.707 3639.32,-763.008"/>+<polygon fill="black" stroke="black" points="3640.34,-759.65 3629.75,-759.321 3637.82,-766.182 3640.34,-759.65"/>+</g>+<!-- u85 -->+<g id="node56" class="node"><title>u85</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4029.28" cy="-1577.27" rx="39.7935" ry="18"/>+<text text-anchor="middle" x="4029.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Options</text>+</g>+<!-- u85&#45;&gt;u72 -->+<g id="edge99" class="edge"><title>u85&#45;&gt;u72</title>+<path fill="none" stroke="black" d="M4017.18,-1559.81C3989.22,-1521.78 3919.98,-1427.59 3886.71,-1382.34"/>+<polygon fill="black" stroke="black" points="3889.49,-1380.21 3880.74,-1374.23 3883.85,-1384.36 3889.49,-1380.21"/>+</g>+<!-- u85&#45;&gt;u75 -->+<g id="edge100" class="edge"><title>u85&#45;&gt;u75</title>+<path fill="none" stroke="black" d="M4029.28,-1559.09C4029.28,-1521.19 4029.28,-1430.17 4029.28,-1384.45"/>+<polygon fill="black" stroke="black" points="4032.78,-1384.38 4029.28,-1374.38 4025.78,-1384.38 4032.78,-1384.38"/>+</g>+<!-- u85&#45;&gt;u77 -->+<g id="edge101" class="edge"><title>u85&#45;&gt;u77</title>+<path fill="none" stroke="black" d="M4039.2,-1559.81C4062.09,-1521.84 4118.7,-1427.92 4146.03,-1382.57"/>+<polygon fill="black" stroke="black" points="4149.08,-1384.3 4151.24,-1373.92 4143.08,-1380.68 4149.08,-1384.3"/>+</g>+<!-- u93 -->+<g id="node57" class="node"><title>u93</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4473.28" cy="-1577.27" rx="91.784" ry="18"/>+<text text-anchor="middle" x="4473.28" y="-1573.57" font-family="Times,serif" font-size="14.00">CommandLineOption</text>+</g>+<!-- u93&#45;&gt;u16 -->+<g id="edge102" class="edge"><title>u93&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M4495.81,-1559.63C4530.98,-1532.1 4597.65,-1473.32 4624.28,-1405.27 4679.93,-1263.06 4686.59,-848.776 4607.28,-718.272 4545.69,-616.927 4469.81,-654.369 4383.28,-573.272 4300.53,-495.724 4227.87,-380.366 4197.89,-329.696"/>+<polygon fill="black" stroke="black" points="4200.88,-327.866 4192.8,-321.012 4194.84,-331.408 4200.88,-327.866"/>+</g>+<!-- u34 -->+<g id="node60" class="node"><title>u34</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1452.28" cy="-1356.27" rx="105.082" ry="18"/>+<text text-anchor="middle" x="1452.28" y="-1352.57" font-family="Times,serif" font-size="14.00">GameTerminationReason</text>+</g>+<!-- u30&#45;&gt;u34 -->+<g id="edge103" class="edge"><title>u30&#45;&gt;u34</title>+<path fill="none" stroke="black" d="M1520.6,-1559.45C1507.82,-1521.65 1476.75,-1429.7 1461.31,-1383.99"/>+<polygon fill="black" stroke="black" points="1464.6,-1382.81 1458.09,-1374.45 1457.97,-1385.05 1464.6,-1382.81"/>+</g>+<!-- u30&#45;&gt;u36 -->+<g id="edge104" class="edge"><title>u30&#45;&gt;u36</title>+<path fill="none" stroke="black" d="M1506.55,-1562.41C1499.77,-1558.23 1491.95,-1554.03 1484.28,-1551.27 1084.35,-1407.51 947.234,-1524.37 539.281,-1405.27 514.839,-1398.14 488.691,-1386.76 468.133,-1376.87"/>+<polygon fill="black" stroke="black" points="469.628,-1373.71 459.107,-1372.46 466.551,-1380 469.628,-1373.71"/>+</g>+<!-- u53 -->+<g id="node92" class="node"><title>u53</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1220.28" cy="-1997.27" rx="85.2851" ry="18"/>+<text text-anchor="middle" x="1220.28" y="-1993.57" font-family="Times,serif" font-size="14.00">InstancesByPosition</text>+</g>+<!-- u30&#45;&gt;u53 -->+<g id="edge105" class="edge"><title>u30&#45;&gt;u53</title>+<path fill="none" stroke="black" d="M1512.81,-1593.96C1480.78,-1631.35 1400.85,-1725.09 1376.28,-1758.27 1320.97,-1832.96 1262.71,-1926.4 1235.7,-1970.7"/>+<polygon fill="black" stroke="black" points="1232.63,-1969.02 1230.43,-1979.38 1238.61,-1972.65 1232.63,-1969.02"/>+</g>+<!-- u54 -->+<g id="node93" class="node"><title>u54</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="846.281" cy="-2217.27" rx="40.8928" ry="18"/>+<text text-anchor="middle" x="846.281" y="-2213.57" font-family="Times,serif" font-size="14.00">Position</text>+</g>+<!-- u30&#45;&gt;u54 -->+<g id="edge106" class="edge"><title>u30&#45;&gt;u54</title>+<path fill="none" stroke="black" d="M1518.97,-1594.87C1482.72,-1677.15 1323.56,-2037.68 1314.28,-2046.27 1192.16,-2159.35 989.015,-2198.5 895.795,-2210.96"/>+<polygon fill="black" stroke="black" points="895.255,-2207.5 885.785,-2212.25 896.15,-2214.44 895.255,-2207.5"/>+</g>+<!-- u33 -->+<g id="node59" class="node"><title>u33</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1478.28" cy="-1135.27" rx="57.3905" ry="18"/>+<text text-anchor="middle" x="1478.28" y="-1131.57" font-family="Times,serif" font-size="14.00">DrawReason</text>+</g>+<!-- u33&#45;&gt;u10 -->+<g id="edge107" class="edge"><title>u33&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M1487.13,-1117.31C1519.2,-1055.87 1629.37,-844.751 1667.87,-770.971"/>+<polygon fill="black" stroke="black" points="1671.09,-772.374 1672.61,-761.89 1664.88,-769.136 1671.09,-772.374"/>+</g>+<!-- u34&#45;&gt;u33 -->+<g id="edge108" class="edge"><title>u34&#45;&gt;u33</title>+<path fill="none" stroke="black" d="M1454.32,-1338.09C1458.82,-1300.19 1469.63,-1209.17 1475.05,-1163.45"/>+<polygon fill="black" stroke="black" points="1478.55,-1163.72 1476.25,-1153.38 1471.6,-1162.89 1478.55,-1163.72"/>+</g>+<!-- u35 -->+<g id="node61" class="node"><title>u35</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1368.28" cy="-1135.27" rx="33.5952" ry="18"/>+<text text-anchor="middle" x="1368.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Result</text>+</g>+<!-- u34&#45;&gt;u35 -->+<g id="edge109" class="edge"><title>u34&#45;&gt;u35</title>+<path fill="none" stroke="black" d="M1445.69,-1338.09C1431.05,-1299.93 1395.77,-1207.95 1378.35,-1162.54"/>+<polygon fill="black" stroke="black" points="1381.58,-1161.16 1374.73,-1153.08 1375.04,-1163.67 1381.58,-1161.16"/>+</g>+<!-- u35&#45;&gt;u7 -->+<g id="edge110" class="edge"><title>u35&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M1372.15,-1117.2C1387.74,-1052.63 1452.44,-821.771 1601.28,-718.272 1944.01,-479.946 2133.66,-706.49 2529.28,-573.272 2548.93,-566.655 2569.4,-555.924 2585.74,-546.286"/>+<polygon fill="black" stroke="black" points="2587.62,-549.242 2594.37,-541.076 2584,-543.251 2587.62,-549.242"/>+</g>+<!-- u59&#45;&gt;u60 -->+<g id="edge111" class="edge"><title>u59&#45;&gt;u60</title>+<path fill="none" stroke="black" d="M1553.75,-1768.17C1742.86,-1738.76 2485.81,-1624.73 3099.28,-1551.27 3263.13,-1531.65 4466.48,-1527.56 4577.28,-1405.27 4621.45,-1356.53 4619.46,-1159.75 4577.28,-1109.27 4341.56,-827.164 4107.97,-1090.1 3763.28,-962.272 3627.79,-912.026 3485.25,-812.925 3424.53,-768.167"/>+<polygon fill="black" stroke="black" points="3426.29,-765.116 3416.17,-761.97 3422.12,-770.738 3426.29,-765.116"/>+</g>+<!-- u59&#45;&gt;u58 -->+<g id="edge112" class="edge"><title>u59&#45;&gt;u58</title>+<path fill="none" stroke="black" d="M1557.94,-1772.53C1781.72,-1759.83 2697.54,-1704 2973.28,-1626.27 3047.33,-1605.4 3055.2,-1572.03 3129.28,-1551.27 3447.72,-1462.04 4375.31,-1637.98 4610.28,-1405.27 4718.86,-1297.73 4663.61,-869.454 4641.28,-718.272 4619.5,-570.842 4576.41,-397.306 4559.41,-331.453"/>+<polygon fill="black" stroke="black" points="4562.72,-330.279 4556.82,-321.479 4555.95,-332.037 4562.72,-330.279"/>+</g>+<!-- u59&#45;&gt;u30 -->+<g id="edge113" class="edge"><title>u59&#45;&gt;u30</title>+<path fill="none" stroke="black" d="M1509.85,-1758.13C1512.97,-1723.93 1520,-1646.96 1523.78,-1605.67"/>+<polygon fill="black" stroke="black" points="1527.28,-1605.79 1524.71,-1595.51 1520.31,-1605.15 1527.28,-1605.79"/>+</g>+<!-- u61 -->+<g id="node63" class="node"><title>u61</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1402.28" cy="-1577.27" rx="72.5877" ry="18"/>+<text text-anchor="middle" x="1402.28" y="-1573.57" font-family="Times,serif" font-size="14.00">MoveFrequency</text>+</g>+<!-- u59&#45;&gt;u61 -->+<g id="edge114" class="edge"><title>u59&#45;&gt;u61</title>+<path fill="none" stroke="black" d="M1499.24,-1758.48C1480.71,-1724.03 1438.29,-1645.2 1416.21,-1604.17"/>+<polygon fill="black" stroke="black" points="1419.27,-1602.45 1411.45,-1595.31 1413.1,-1605.77 1419.27,-1602.45"/>+</g>+<!-- u59&#45;&gt;u62 -->+<g id="edge115" class="edge"><title>u59&#45;&gt;u62</title>+<path fill="none" stroke="black" d="M1557.61,-1771.96C1731.19,-1759.83 2329.57,-1713.85 2816.28,-1626.27 2952.82,-1601.7 2982.56,-1574.82 3119.28,-1551.27 3444.32,-1495.28 4374.83,-1649.69 4596.28,-1405.27 4640.79,-1356.14 4604.43,-752.604 4577.28,-718.272 4467.95,-580.03 3986.94,-538.237 3815.28,-498.272 3455.17,-414.433 3307.07,-552.561 2996.28,-352.272 2987.79,-346.801 2980.9,-338.293 2975.66,-329.95"/>+<polygon fill="black" stroke="black" points="2978.61,-328.064 2970.62,-321.114 2972.53,-331.534 2978.61,-328.064"/>+</g>+<!-- u61&#45;&gt;u10 -->+<g id="edge116" class="edge"><title>u61&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M1360.25,-1562.45C1346.66,-1558.37 1331.44,-1554.22 1317.28,-1551.27 1061.41,-1498 323.236,-1601.21 150.281,-1405.27 128.516,-1380.62 128.592,-1134 150.281,-1109.27 481.066,-732.191 854.484,-1244.32 1269.28,-962.272 1284.42,-951.981 1275.87,-938.724 1289.28,-926.272 1395.67,-827.528 1565.4,-774.606 1641.77,-754.682"/>+<polygon fill="black" stroke="black" points="1643.09,-757.957 1651.91,-752.089 1641.36,-751.176 1643.09,-757.957"/>+</g>+<!-- u41 -->+<g id="node74" class="node"><title>u41</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2256.28" cy="-303.272" rx="35.9954" ry="18"/>+<text text-anchor="middle" x="2256.28" y="-299.572" font-family="Times,serif" font-size="14.00">Empty</text>+</g>+<!-- u61&#45;&gt;u41 -->+<g id="edge117" class="edge"><title>u61&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M1426.82,-1560.16C1465.12,-1533.36 1537.68,-1475.57 1566.28,-1405.27 1571.3,-1392.95 1570.1,-939.577 1570.28,-926.272 1571.56,-833.82 1559.41,-809.53 1574.28,-718.272 1590.77,-617.133 1568.95,-568.812 1643.28,-498.272 1832.35,-318.849 1987,-485.078 2211.28,-352.272 2221.41,-346.274 2230.68,-337.326 2238.13,-328.775"/>+<polygon fill="black" stroke="black" points="2241.04,-330.751 2244.7,-320.808 2235.64,-326.3 2241.04,-330.751"/>+</g>+<!-- u42 -->+<g id="node75" class="node"><title>u42</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2175.28" cy="-303.272" rx="27" ry="18"/>+<text text-anchor="middle" x="2175.28" y="-299.572" font-family="Times,serif" font-size="14.00">Null</text>+</g>+<!-- u61&#45;&gt;u42 -->+<g id="edge118" class="edge"><title>u61&#45;&gt;u42</title>+<path fill="none" stroke="black" d="M1360.25,-1562.43C1346.66,-1558.36 1331.44,-1554.21 1317.28,-1551.27 1057.69,-1497.47 323.373,-1590.06 133.281,-1405.27 59.1384,-1333.2 63.2806,-1048.67 63.2806,-945.272 63.2806,-945.272 63.2806,-945.272 63.2806,-743.272 63.2806,-301.653 1855.77,-301.138 2138.06,-303.795"/>+<polygon fill="black" stroke="black" points="2138.16,-307.296 2148.19,-303.898 2138.23,-300.297 2138.16,-307.296"/>+</g>+<!-- u36&#45;&gt;u29 -->+<g id="edge119" class="edge"><title>u36&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M476.481,-1343.6C495.799,-1339 518.539,-1333.95 539.281,-1330.27 1050.5,-1239.68 1245.99,-1439.19 1698.28,-1184.27 1707.86,-1178.87 1715.91,-1169.99 1722.09,-1161.33"/>+<polygon fill="black" stroke="black" points="1725.08,-1163.16 1727.65,-1152.88 1719.23,-1159.31 1725.08,-1163.16"/>+</g>+<!-- u36&#45;&gt;u31 -->+<g id="edge120" class="edge"><title>u36&#45;&gt;u31</title>+<path fill="none" stroke="black" d="M437.747,-1338.12C461.94,-1282.58 536.763,-1111.13 539.281,-1109.27 758.645,-947.015 1488.33,-1001.94 1758.28,-962.272 1765.97,-961.143 1773.98,-959.885 1781.97,-958.579"/>+<polygon fill="black" stroke="black" points="1782.75,-961.997 1792.04,-956.905 1781.61,-955.091 1782.75,-961.997"/>+</g>+<!-- u37 -->+<g id="node65" class="node"><title>u37</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="214.281" cy="-1135.27" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="214.281" y="-1131.57" font-family="Times,serif" font-size="14.00">Coordinate</text>+</g>+<!-- u36&#45;&gt;u37 -->+<g id="edge121" class="edge"><title>u36&#45;&gt;u37</title>+<path fill="none" stroke="black" d="M414.046,-1338.81C376.112,-1300.35 281.555,-1204.48 237.523,-1159.84"/>+<polygon fill="black" stroke="black" points="239.924,-1157.29 230.409,-1152.63 234.94,-1162.2 239.924,-1157.29"/>+</g>+<!-- u38 -->+<g id="node66" class="node"><title>u38</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="348.281" cy="-1135.27" rx="64.189" ry="18"/>+<text text-anchor="middle" x="348.281" y="-1131.57" font-family="Times,serif" font-size="14.00">ICCFNumeric</text>+</g>+<!-- u36&#45;&gt;u38 -->+<g id="edge122" class="edge"><title>u36&#45;&gt;u38</title>+<path fill="none" stroke="black" d="M423.846,-1338.09C409.595,-1300.03 375.288,-1208.4 358.241,-1162.87"/>+<polygon fill="black" stroke="black" points="361.47,-1161.51 354.685,-1153.38 354.914,-1163.97 361.47,-1161.51"/>+</g>+<!-- u39 -->+<g id="node67" class="node"><title>u39</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="463.281" cy="-1135.27" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="463.281" y="-1131.57" font-family="Times,serif" font-size="14.00">Smith</text>+</g>+<!-- u36&#45;&gt;u39 -->+<g id="edge123" class="edge"><title>u36&#45;&gt;u39</title>+<path fill="none" stroke="black" d="M432.87,-1338.09C438.581,-1300.19 452.296,-1209.17 459.185,-1163.45"/>+<polygon fill="black" stroke="black" points="462.674,-1163.79 460.703,-1153.38 455.752,-1162.74 462.674,-1163.79"/>+</g>+<!-- u36&#45;&gt;u40 -->+<g id="edge124" class="edge"><title>u36&#45;&gt;u40</title>+<path fill="none" stroke="black" d="M390.854,-1341.91C297.07,-1308.03 74.2451,-1214 153.281,-1109.27 522.717,-619.728 2263.4,-635.701 2807.28,-352.272 2819.85,-345.724 2832.25,-336.231 2842.41,-327.413"/>+<polygon fill="black" stroke="black" points="2844.94,-329.842 2850.04,-320.555 2840.26,-324.635 2844.94,-329.842"/>+</g>+<!-- u37&#45;&gt;u10 -->+<g id="edge125" class="edge"><title>u37&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M243.868,-1120.44C253.687,-1116.32 264.791,-1112.14 275.281,-1109.27 714.587,-989.362 914.429,-1220.84 1289.28,-962.272 1304.35,-951.88 1295.99,-938.859 1309.28,-926.272 1409.76,-831.105 1569.73,-776.657 1642.71,-755.546"/>+<polygon fill="black" stroke="black" points="1643.76,-758.888 1652.42,-752.788 1641.84,-752.155 1643.76,-758.888"/>+</g>+<!-- u38&#45;&gt;u10 -->+<g id="edge126" class="edge"><title>u38&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M385.198,-1120.49C396.935,-1116.47 410.046,-1112.33 422.281,-1109.27 809.945,-1012.34 962.53,-1160.88 1309.28,-962.272 1327.35,-951.921 1323.1,-939.391 1339.28,-926.272 1438.79,-845.574 1579.83,-784.661 1645.31,-758.84"/>+<polygon fill="black" stroke="black" points="1646.74,-762.04 1654.78,-755.143 1644.19,-755.519 1646.74,-762.04"/>+</g>+<!-- u39&#45;&gt;u28 -->+<g id="edge127" class="edge"><title>u39&#45;&gt;u28</title>+<path fill="none" stroke="black" d="M487.933,-1123.45C500.162,-1118.47 515.278,-1112.87 529.281,-1109.27 927.479,-1006.85 1420.66,-963.627 1606.11,-950.21"/>+<polygon fill="black" stroke="black" points="1606.57,-953.686 1616.3,-949.48 1606.07,-946.703 1606.57,-953.686"/>+</g>+<!-- u23&#45;&gt;u18 -->+<g id="edge128" class="edge"><title>u23&#45;&gt;u18</title>+<path fill="none" stroke="black" d="M2378.19,-287.363C2429.86,-253.746 2555.55,-171.962 2615.04,-133.249"/>+<polygon fill="black" stroke="black" points="2617.19,-136.028 2623.66,-127.64 2613.37,-130.16 2617.19,-136.028"/>+</g>+<!-- u86 -->+<g id="node77" class="node"><title>u86</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2271.28" cy="-1776.27" rx="53.8905" ry="18"/>+<text text-anchor="middle" x="2271.28" y="-1772.57" font-family="Times,serif" font-size="14.00">SearchState</text>+</g>+<!-- u86&#45;&gt;u64 -->+<g id="edge129" class="edge"><title>u86&#45;&gt;u64</title>+<path fill="none" stroke="black" d="M2315.11,-1786.79C2471.2,-1820.71 3001.33,-1935.89 3201.71,-1979.42"/>+<polygon fill="black" stroke="black" points="3201.06,-1982.86 3211.58,-1981.56 3202.55,-1976.02 3201.06,-1982.86"/>+</g>+<!-- u87 -->+<g id="node78" class="node"><title>u87</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2253.28" cy="-1577.27" rx="83.3857" ry="18"/>+<text text-anchor="middle" x="2253.28" y="-1573.57" font-family="Times,serif" font-size="14.00">DynamicMoveData</text>+</g>+<!-- u86&#45;&gt;u87 -->+<g id="edge130" class="edge"><title>u86&#45;&gt;u87</title>+<path fill="none" stroke="black" d="M2269.71,-1758.13C2266.59,-1723.93 2259.56,-1646.96 2255.78,-1605.67"/>+<polygon fill="black" stroke="black" points="2259.25,-1605.15 2254.86,-1595.51 2252.28,-1605.79 2259.25,-1605.15"/>+</g>+<!-- u87&#45;&gt;u29 -->+<g id="edge131" class="edge"><title>u87&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M2233.11,-1559.63C2196.26,-1529.18 2115.62,-1462.38 2048.28,-1405.27 1940.07,-1313.5 1812.2,-1202.42 1760.13,-1157.07"/>+<polygon fill="black" stroke="black" points="1762.28,-1154.3 1752.44,-1150.37 1757.68,-1159.58 1762.28,-1154.3"/>+</g>+<!-- u87&#45;&gt;u75 -->+<g id="edge132" class="edge"><title>u87&#45;&gt;u75</title>+<path fill="none" stroke="black" d="M2334.53,-1573.24C2630.71,-1561.42 3651.03,-1513.55 3956.28,-1405.27 3972.7,-1399.45 3989.08,-1389.19 4002.15,-1379.65"/>+<polygon fill="black" stroke="black" points="4004.36,-1382.36 4010.23,-1373.53 4000.14,-1376.78 4004.36,-1382.36"/>+</g>+<!-- u89 -->+<g id="node80" class="node"><title>u89</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2114.28" cy="-1356.27" rx="57.3905" ry="18"/>+<text text-anchor="middle" x="2114.28" y="-1352.57" font-family="Times,serif" font-size="14.00">KillerMoves</text>+</g>+<!-- u87&#45;&gt;u89 -->+<g id="edge133" class="edge"><title>u87&#45;&gt;u89</title>+<path fill="none" stroke="black" d="M2242.37,-1559.09C2218,-1520.69 2159.04,-1427.79 2130.41,-1382.68"/>+<polygon fill="black" stroke="black" points="2133.26,-1380.64 2124.95,-1374.08 2127.35,-1384.39 2133.26,-1380.64"/>+</g>+<!-- u90 -->+<g id="node81" class="node"><title>u90</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2253.28" cy="-1356.27" rx="63.8893" ry="18"/>+<text text-anchor="middle" x="2253.28" y="-1352.57" font-family="Times,serif" font-size="14.00">Transpositions</text>+</g>+<!-- u87&#45;&gt;u90 -->+<g id="edge134" class="edge"><title>u87&#45;&gt;u90</title>+<path fill="none" stroke="black" d="M2253.28,-1559.09C2253.28,-1521.19 2253.28,-1430.17 2253.28,-1384.45"/>+<polygon fill="black" stroke="black" points="2256.78,-1384.38 2253.28,-1374.38 2249.78,-1384.38 2256.78,-1384.38"/>+</g>+<!-- u88 -->+<g id="node79" class="node"><title>u88</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2120.28" cy="-1135.27" rx="67.6881" ry="18"/>+<text text-anchor="middle" x="2120.28" y="-1131.57" font-family="Times,serif" font-size="14.00">EphemeralData</text>+</g>+<!-- u88&#45;&gt;u10 -->+<g id="edge135" class="edge"><title>u88&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M2117.63,-1117.01C2110.88,-1078.35 2089.72,-983.693 2037.28,-926.272 1947.71,-828.186 1792.83,-775.54 1720.55,-755.255"/>+<polygon fill="black" stroke="black" points="1721.07,-751.769 1710.5,-752.496 1719.22,-758.52 1721.07,-751.769"/>+</g>+<!-- u89&#45;&gt;u41 -->+<g id="edge136" class="edge"><title>u89&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M2065.02,-1346.88C1944.58,-1325.27 1640.66,-1263.79 1581.28,-1184.27 1565.79,-1163.53 1575.51,-742.967 1583.28,-718.272 1618.3,-607.037 1632.98,-568.235 1726.28,-498.272 1906.38,-363.222 2019.96,-470.897 2211.28,-352.272 2221.29,-346.069 2230.53,-337.08 2238,-328.555"/>+<polygon fill="black" stroke="black" points="2240.89,-330.556 2244.59,-320.629 2235.51,-326.081 2240.89,-330.556"/>+</g>+<!-- u89&#45;&gt;u88 -->+<g id="edge137" class="edge"><title>u89&#45;&gt;u88</title>+<path fill="none" stroke="black" d="M2114.75,-1338.09C2115.79,-1300.19 2118.28,-1209.17 2119.54,-1163.45"/>+<polygon fill="black" stroke="black" points="2123.04,-1163.47 2119.81,-1153.38 2116.04,-1163.28 2123.04,-1163.47"/>+</g>+<!-- u90&#45;&gt;u41 -->+<g id="edge138" class="edge"><title>u90&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M2215.58,-1341.7C2204.29,-1337.81 2191.84,-1333.7 2180.28,-1330.27 1925.86,-1254.77 1764.39,-1393.62 1601.28,-1184.27 1569.46,-1143.43 1575.77,-763.329 1601.28,-718.272 1757.06,-443.144 1965.25,-550.838 2211.28,-352.272 2220.17,-345.096 2228.99,-336.199 2236.42,-328.022"/>+<polygon fill="black" stroke="black" points="2239.09,-330.292 2243.09,-320.483 2233.85,-325.654 2239.09,-330.292"/>+</g>+<!-- u90&#45;&gt;u88 -->+<g id="edge139" class="edge"><title>u90&#45;&gt;u88</title>+<path fill="none" stroke="black" d="M2243.07,-1338.45C2219.9,-1300.31 2163.28,-1207.08 2135.78,-1161.79"/>+<polygon fill="black" stroke="black" points="2138.71,-1159.88 2130.53,-1153.15 2132.73,-1163.51 2138.71,-1159.88"/>+</g>+<!-- u91 -->+<g id="node82" class="node"><title>u91</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2287.28" cy="-1135.27" rx="81.7856" ry="18"/>+<text text-anchor="middle" x="2287.28" y="-1131.57" font-family="Times,serif" font-size="14.00">TranspositionValue</text>+</g>+<!-- u90&#45;&gt;u91 -->+<g id="edge140" class="edge"><title>u90&#45;&gt;u91</title>+<path fill="none" stroke="black" d="M2255.95,-1338.09C2261.83,-1300.19 2275.96,-1209.17 2283.06,-1163.45"/>+<polygon fill="black" stroke="black" points="2286.55,-1163.8 2284.63,-1153.38 2279.63,-1162.72 2286.55,-1163.8"/>+</g>+<!-- u91&#45;&gt;u10 -->+<g id="edge141" class="edge"><title>u91&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M2271.73,-1117.42C2236.19,-1079.59 2145.13,-986.539 2055.28,-926.272 1939.66,-848.718 1785.79,-785.222 1717.07,-758.669"/>+<polygon fill="black" stroke="black" points="1718.15,-755.336 1707.56,-755.022 1715.64,-761.872 1718.15,-755.336"/>+</g>+<!-- u99 -->+<g id="node83" class="node"><title>u99</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2333.28" cy="-2217.27" rx="35.9954" ry="18"/>+<text text-anchor="middle" x="2333.28" y="-2213.57" font-family="Times,serif" font-size="14.00">Search</text>+</g>+<!-- u100 -->+<g id="node84" class="node"><title>u100</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2307.28" cy="-1997.27" rx="49.2915" ry="18"/>+<text text-anchor="middle" x="2307.28" y="-1993.57" font-family="Times,serif" font-size="14.00">AlphaBeta</text>+</g>+<!-- u99&#45;&gt;u100 -->+<g id="edge142" class="edge"><title>u99&#45;&gt;u100</title>+<path fill="none" stroke="black" d="M2331.24,-2199.17C2326.74,-2161.44 2315.94,-2070.84 2310.51,-2025.33"/>+<polygon fill="black" stroke="black" points="2313.97,-2024.81 2309.31,-2015.3 2307.02,-2025.64 2313.97,-2024.81"/>+</g>+<!-- u100&#45;&gt;u86 -->+<g id="edge143" class="edge"><title>u100&#45;&gt;u86</title>+<path fill="none" stroke="black" d="M2304.46,-1979.09C2298.23,-1941.19 2283.26,-1850.17 2275.75,-1804.45"/>+<polygon fill="black" stroke="black" points="2279.17,-1803.68 2274.09,-1794.38 2272.26,-1804.81 2279.17,-1803.68"/>+</g>+<!-- u43 -->+<g id="node85" class="node"><title>u43</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="796.281" cy="-1776.27" rx="33.2948" ry="18"/>+<text text-anchor="middle" x="796.281" y="-1772.57" font-family="Times,serif" font-size="14.00">Board</text>+</g>+<!-- u47 -->+<g id="node87" class="node"><title>u47</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="870.281" cy="-1577.27" rx="150.273" ry="18"/>+<text text-anchor="middle" x="870.281" y="-1573.57" font-family="Times,serif" font-size="14.00">CoordinatesByRankByLogicalColour</text>+</g>+<!-- u43&#45;&gt;u47 -->+<g id="edge144" class="edge"><title>u43&#45;&gt;u47</title>+<path fill="none" stroke="black" d="M802.59,-1758.48C815.473,-1724.18 844.891,-1645.86 860.358,-1604.69"/>+<polygon fill="black" stroke="black" points="863.642,-1605.9 863.882,-1595.31 857.089,-1603.44 863.642,-1605.9"/>+</g>+<!-- u46 -->+<g id="node86" class="node"><title>u46</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1256.28" cy="-1135.27" rx="37.0935" ry="18"/>+<text text-anchor="middle" x="1256.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Censor</text>+</g>+<!-- u46&#45;&gt;u27 -->+<g id="edge145" class="edge"><title>u46&#45;&gt;u27</title>+<path fill="none" stroke="black" d="M1279.91,-1121.26C1288.36,-1117 1298.08,-1112.52 1307.28,-1109.27 1585.75,-1010.95 1673.87,-1051.82 1955.28,-962.272 1957.57,-961.543 1959.92,-960.739 1962.26,-959.889"/>+<polygon fill="black" stroke="black" points="1963.74,-963.07 1971.82,-956.211 1961.23,-956.537 1963.74,-963.07"/>+</g>+<!-- u48 -->+<g id="node88" class="node"><title>u48</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1192.28" cy="-1356.27" rx="113.18" ry="18"/>+<text text-anchor="middle" x="1192.28" y="-1352.57" font-family="Times,serif" font-size="14.00">MaybePieceByCoordinates</text>+</g>+<!-- u47&#45;&gt;u48 -->+<g id="edge146" class="edge"><title>u47&#45;&gt;u48</title>+<path fill="none" stroke="black" d="M895.013,-1559.45C952.398,-1520.42 1094.62,-1423.69 1159.31,-1379.7"/>+<polygon fill="black" stroke="black" points="1161.6,-1382.37 1167.9,-1373.85 1157.67,-1376.58 1161.6,-1382.37"/>+</g>+<!-- u48&#45;&gt;u49 -->+<g id="edge147" class="edge"><title>u48&#45;&gt;u49</title>+<path fill="none" stroke="black" d="M1206.55,-1338.04C1230.24,-1308.5 1277.52,-1245.46 1302.28,-1184.27 1315.03,-1152.76 1292.9,-1132.96 1317.28,-1109.27 1404.26,-1024.77 2273.25,-943.564 2393.28,-926.272 2891.62,-854.485 3044.21,-962.835 3518.28,-793.272 3534.88,-787.336 3551.57,-777.165 3564.98,-767.71"/>+<polygon fill="black" stroke="black" points="3567.27,-770.373 3573.28,-761.651 3563.14,-764.718 3567.27,-770.373"/>+</g>+<!-- u48&#45;&gt;u10 -->+<g id="edge148" class="edge"><title>u48&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M1189.04,-1338.16C1181.99,-1296.21 1169.04,-1186.04 1210.28,-1109.27 1262.63,-1011.82 1556.84,-822.783 1651.76,-763.506"/>+<polygon fill="black" stroke="black" points="1653.67,-766.44 1660.31,-758.182 1649.97,-760.498 1653.67,-766.44"/>+</g>+<!-- u48&#45;&gt;u32 -->+<g id="edge149" class="edge"><title>u48&#45;&gt;u32</title>+<path fill="none" stroke="black" d="M1231.42,-1339.31C1300.95,-1310.58 1450.07,-1247.28 1571.28,-1184.27 1588.34,-1175.41 1606.81,-1164.56 1621.81,-1155.42"/>+<polygon fill="black" stroke="black" points="1623.97,-1158.2 1630.65,-1149.98 1620.3,-1152.24 1623.97,-1158.2"/>+</g>+<!-- u48&#45;&gt;u44 -->+<g id="edge150" class="edge"><title>u48&#45;&gt;u44</title>+<path fill="none" stroke="black" d="M1244.31,-1340.22C1381.16,-1300.63 1750.34,-1193.82 1892.45,-1152.71"/>+<polygon fill="black" stroke="black" points="1893.65,-1156.01 1902.29,-1149.87 1891.71,-1149.28 1893.65,-1156.01"/>+</g>+<!-- u48&#45;&gt;u41 -->+<g id="edge151" class="edge"><title>u48&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M1107.78,-1344.28C926.032,-1315.4 514.281,-1219.7 514.281,-945.272 514.281,-945.272 514.281,-945.272 514.281,-743.272 514.281,-436.622 862.198,-574.275 1159.28,-498.272 1616.59,-381.28 1792.1,-569.317 2211.28,-352.272 2222,-346.723 2231.53,-337.578 2239.04,-328.751"/>+<polygon fill="black" stroke="black" points="2241.84,-330.849 2245.33,-320.846 2236.37,-326.488 2241.84,-330.849"/>+</g>+<!-- u48&#45;&gt;u46 -->+<g id="edge152" class="edge"><title>u48&#45;&gt;u46</title>+<path fill="none" stroke="black" d="M1197.3,-1338.09C1208.4,-1300.11 1235.09,-1208.79 1248.42,-1163.16"/>+<polygon fill="black" stroke="black" points="1251.84,-1163.96 1251.28,-1153.38 1245.12,-1161.99 1251.84,-1163.96"/>+</g>+<!-- u50 -->+<g id="node89" class="node"><title>u50</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="689.281" cy="-1997.27" rx="137.576" ry="18"/>+<text text-anchor="middle" x="689.281" y="-1993.57" font-family="Times,serif" font-size="14.00">CastleableRooksByLogicalColour</text>+</g>+<!-- u50&#45;&gt;u29 -->+<g id="edge153" class="edge"><title>u50&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M771.419,-1982.82C984.797,-1947.53 1542.16,-1853.15 1571.28,-1825.27 1765.87,-1638.97 1748.27,-1267.13 1739.13,-1163.59"/>+<polygon fill="black" stroke="black" points="1742.59,-1162.99 1738.17,-1153.36 1735.62,-1163.64 1742.59,-1162.99"/>+</g>+<!-- u50&#45;&gt;u43 -->+<g id="edge154" class="edge"><title>u50&#45;&gt;u43</title>+<path fill="none" stroke="black" d="M697.677,-1979.09C716.403,-1940.76 761.671,-1848.11 783.75,-1802.92"/>+<polygon fill="black" stroke="black" points="786.971,-1804.3 788.216,-1793.78 780.682,-1801.23 786.971,-1804.3"/>+</g>+<!-- u51 -->+<g id="node90" class="node"><title>u51</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="648.281" cy="-1776.27" rx="96.6831" ry="18"/>+<text text-anchor="middle" x="648.281" y="-1772.57" font-family="Times,serif" font-size="14.00">TurnsByLogicalColour</text>+</g>+<!-- u50&#45;&gt;u51 -->+<g id="edge155" class="edge"><title>u50&#45;&gt;u51</title>+<path fill="none" stroke="black" d="M686.063,-1979.09C678.968,-1941.19 661.928,-1850.17 653.369,-1804.45"/>+<polygon fill="black" stroke="black" points="656.763,-1803.56 651.483,-1794.38 649.883,-1804.85 656.763,-1803.56"/>+</g>+<!-- u51&#45;&gt;u10 -->+<g id="edge156" class="edge"><title>u51&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M605.086,-1760.12C500.645,-1720.84 235.522,-1604.62 133.281,-1405.27 103.262,-1346.74 89.912,-1158.73 133.281,-1109.27 463.128,-733.128 835.626,-1243.65 1249.28,-962.272 1264.41,-951.978 1255.75,-938.598 1269.28,-926.272 1381.76,-823.809 1561.55,-772.491 1641.14,-753.801"/>+<polygon fill="black" stroke="black" points="1642.27,-757.131 1651.23,-751.479 1640.7,-750.309 1642.27,-757.131"/>+</g>+<!-- u51&#45;&gt;u41 -->+<g id="edge157" class="edge"><title>u51&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M579.706,-1763.47C494.671,-1745.94 348.912,-1706.12 250.281,-1626.27 4.41424,-1427.22 43.2806,-1261.61 43.2806,-945.272 43.2806,-945.272 43.2806,-945.272 43.2806,-743.272 43.2806,-475.266 334.888,-565.673 594.281,-498.272 1292.68,-316.8 1562.74,-668.636 2211.28,-352.272 2222.28,-346.904 2231.96,-337.617 2239.5,-328.633"/>+<polygon fill="black" stroke="black" points="2242.38,-330.622 2245.79,-320.589 2236.87,-326.309 2242.38,-330.622"/>+</g>+<!-- u51&#45;&gt;u42 -->+<g id="edge158" class="edge"><title>u51&#45;&gt;u42</title>+<path fill="none" stroke="black" d="M571.336,-1765.28C431.925,-1745.6 145.725,-1697.46 78.2806,-1626.27 -5.64588,-1537.69 23.2806,-1479.3 23.2806,-1357.27 23.2806,-1357.27 23.2806,-1357.27 23.2806,-743.272 23.2806,-634.18 -37.7179,-576.538 38.2806,-498.272 190.82,-341.183 1865.63,-309.005 2137.96,-304.799"/>+<polygon fill="black" stroke="black" points="2138.17,-308.296 2148.11,-304.645 2138.06,-301.297 2138.17,-308.296"/>+</g>+<!-- u52 -->+<g id="node91" class="node"><title>u52</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1192.28" cy="-1577.27" rx="79.8859" ry="18"/>+<text text-anchor="middle" x="1192.28" y="-1573.57" font-family="Times,serif" font-size="14.00">EnPassantAbscissa</text>+</g>+<!-- u52&#45;&gt;u29 -->+<g id="edge159" class="edge"><title>u52&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M1243.94,-1563.53C1322.32,-1542.05 1472.57,-1492.24 1571.28,-1405.27 1651.44,-1334.65 1705.22,-1215.54 1726.29,-1162.78"/>+<polygon fill="black" stroke="black" points="1729.68,-1163.74 1730.07,-1153.15 1723.16,-1161.18 1729.68,-1163.74"/>+</g>+<!-- u52&#45;&gt;u48 -->+<g id="edge160" class="edge"><title>u52&#45;&gt;u48</title>+<path fill="none" stroke="black" d="M1192.28,-1559.09C1192.28,-1521.19 1192.28,-1430.17 1192.28,-1384.45"/>+<polygon fill="black" stroke="black" points="1195.78,-1384.38 1192.28,-1374.38 1188.78,-1384.38 1195.78,-1384.38"/>+</g>+<!-- u53&#45;&gt;u43 -->+<g id="edge161" class="edge"><title>u53&#45;&gt;u43</title>+<path fill="none" stroke="black" d="M1189.45,-1980.35C1111.62,-1940.15 907.798,-1834.87 828.5,-1793.91"/>+<polygon fill="black" stroke="black" points="829.954,-1790.73 819.463,-1789.25 826.742,-1796.95 829.954,-1790.73"/>+</g>+<!-- u54&#45;&gt;u50 -->+<g id="edge162" class="edge"><title>u54&#45;&gt;u50</title>+<path fill="none" stroke="black" d="M834.48,-2199.89C807.337,-2162.2 740.305,-2069.12 707.693,-2023.84"/>+<polygon fill="black" stroke="black" points="710.336,-2021.52 701.651,-2015.45 704.655,-2025.61 710.336,-2021.52"/>+</g>+<!-- u54&#45;&gt;u52 -->+<g id="edge163" class="edge"><title>u54&#45;&gt;u52</title>+<path fill="none" stroke="black" d="M843.281,-2199.16C836.857,-2158.11 824.78,-2051.52 856.281,-1971.27 922.474,-1802.65 1093.09,-1655.67 1162.37,-1600.99"/>+<polygon fill="black" stroke="black" points="1164.59,-1603.7 1170.31,-1594.78 1160.27,-1598.19 1164.59,-1603.7"/>+</g>+<!-- u63 -->+<g id="node94" class="node"><title>u63</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1260.28" cy="-2217.27" rx="45.4919" ry="18"/>+<text text-anchor="middle" x="1260.28" y="-2213.57" font-family="Times,serif" font-size="14.00">PlayState</text>+</g>+<!-- u63&#45;&gt;u85 -->+<g id="edge164" class="edge"><title>u63&#45;&gt;u85</title>+<path fill="none" stroke="black" d="M1279.16,-2200.62C1362.26,-2132.8 1706.12,-1863 2040.28,-1758.27 2773.15,-1528.59 3001.49,-1723.93 3763.28,-1626.27 3841.39,-1616.26 3931.4,-1598.75 3984.14,-1587.87"/>+<polygon fill="black" stroke="black" points="3985.1,-1591.25 3994.18,-1585.79 3983.67,-1584.39 3985.1,-1591.25"/>+</g>+<!-- u63&#45;&gt;u86 -->+<g id="edge165" class="edge"><title>u63&#45;&gt;u86</title>+<path fill="none" stroke="black" d="M1301.83,-2209.63C1403.4,-2192.38 1670.93,-2140.78 1875.28,-2046.27 2026.22,-1976.47 2183.12,-1851.45 2244.46,-1800.17"/>+<polygon fill="black" stroke="black" points="2247.07,-1802.55 2252.47,-1793.44 2242.57,-1797.19 2247.07,-1802.55"/>+</g>+<!-- u92 -->+<g id="node95" class="node"><title>u92</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="991.281" cy="-1997.27" rx="126.178" ry="18"/>+<text text-anchor="middle" x="991.281" y="-1993.57" font-family="Times,serif" font-size="14.00">ApplicationTerminationReason</text>+</g>+<!-- u63&#45;&gt;u92 -->+<g id="edge166" class="edge"><title>u63&#45;&gt;u92</title>+<path fill="none" stroke="black" d="M1240.93,-2200.59C1194.3,-2162.8 1075.46,-2066.49 1020.27,-2021.76"/>+<polygon fill="black" stroke="black" points="1022.26,-2018.87 1012.29,-2015.3 1017.85,-2024.31 1022.26,-2018.87"/>+</g>+<!-- u3&#45;&gt;u4 -->+<g id="edge167" class="edge"><title>u3&#45;&gt;u4</title>+<path fill="none" stroke="black" d="M3714.99,-524.272C3606.05,-524.272 3497.12,-524.272 3388.18,-524.272"/>+<polygon fill="black" stroke="black" points="3387.98,-520.773 3377.98,-524.272 3387.98,-527.773 3387.98,-520.773"/>+</g>+<!-- u3&#45;&gt;u5 -->+<g id="edge168" class="edge"><title>u3&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3747.22,-506.088C3749.3,-468.188 3754.29,-377.17 3756.79,-331.449"/>+<polygon fill="black" stroke="black" points="3760.29,-331.554 3757.34,-321.377 3753.3,-331.171 3760.29,-331.554"/>+</g>+<!-- u96 -->+<g id="node98" class="node"><title>u96</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3823.28" cy="-2417.27" rx="34.394" ry="18"/>+<text text-anchor="middle" x="3823.28" y="-2413.57" font-family="Times,serif" font-size="14.00">CECP</text>+</g>+<!-- u96&#45;&gt;u97 -->+<g id="edge169" class="edge"><title>u96&#45;&gt;u97</title>+<path fill="none" stroke="black" d="M3788.88,-2415.98C3458.95,-2412.96 859.811,-2385.52 539.281,-2266.27 525.19,-2261.03 511.796,-2251.24 501.167,-2241.86"/>+<polygon fill="black" stroke="black" points="503.324,-2239.09 493.613,-2234.86 498.563,-2244.22 503.324,-2239.09"/>+</g>+<!-- u96&#45;&gt;u95 -->+<g id="edge170" class="edge"><title>u96&#45;&gt;u95</title>+<path fill="none" stroke="black" d="M3807.46,-2401.06C3771.82,-2366.81 3685.03,-2283.39 3642.13,-2242.15"/>+<polygon fill="black" stroke="black" points="3644.53,-2239.61 3634.89,-2235.2 3639.68,-2244.65 3644.53,-2239.61"/>+</g>+<!-- u96&#45;&gt;u98 -->+<g id="edge171" class="edge"><title>u96&#45;&gt;u98</title>+<path fill="none" stroke="black" d="M3849.79,-2405.77C4000.47,-2345.91 4742.28,-2048.66 4742.28,-1998.27 4742.28,-1998.27 4742.28,-1998.27 4742.28,-743.272 4742.28,-583.432 4681.38,-398.111 4657.1,-330.588"/>+<polygon fill="black" stroke="black" points="4660.37,-329.342 4653.66,-321.14 4653.79,-331.735 4660.37,-329.342"/>+</g>+<!-- u96&#45;&gt;u99 -->+<g id="edge172" class="edge"><title>u96&#45;&gt;u99</title>+<path fill="none" stroke="black" d="M3790.07,-2411.86C3595.11,-2385.95 2600.29,-2253.75 2377.56,-2224.16"/>+<polygon fill="black" stroke="black" points="2377.92,-2220.67 2367.54,-2222.83 2377,-2227.61 2377.92,-2220.67"/>+</g>+<!-- u96&#45;&gt;u63 -->+<g id="edge173" class="edge"><title>u96&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M3789.46,-2413.66C3515.26,-2392.48 1657.4,-2248.95 1314.6,-2222.47"/>+<polygon fill="black" stroke="black" points="1314.68,-2218.96 1304.44,-2221.68 1314.14,-2225.94 1314.68,-2218.96"/>+</g>+<!-- u101 -->+<g id="node99" class="node"><title>u101</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3902.28" cy="-2217.27" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="3902.28" y="-2213.57" font-family="Times,serif" font-size="14.00">Command</text>+</g>+<!-- u96&#45;&gt;u101 -->+<g id="edge174" class="edge"><title>u96&#45;&gt;u101</title>+<path fill="none" stroke="black" d="M3830.02,-2399.39C3843.8,-2364.83 3875.33,-2285.81 3891.81,-2244.51"/>+<polygon fill="black" stroke="black" points="3895.11,-2245.7 3895.56,-2235.11 3888.61,-2243.1 3895.11,-2245.7"/>+</g>+<!-- u101&#45;&gt;u85 -->+<g id="edge175" class="edge"><title>u101&#45;&gt;u85</title>+<path fill="none" stroke="black" d="M3918.87,-2199.81C3946.17,-2171.44 3999.59,-2110.19 4020.28,-2046.27 4072.05,-1886.32 4046.02,-1679.26 4034.13,-1605.68"/>+<polygon fill="black" stroke="black" points="4037.52,-1604.72 4032.42,-1595.43 4030.61,-1605.87 4037.52,-1604.72"/>+</g>+<!-- u102 -->+<g id="node100" class="node"><title>u102</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3843.28" cy="-1997.27" rx="53.8905" ry="18"/>+<text text-anchor="middle" x="3843.28" y="-1993.57" font-family="Times,serif" font-size="14.00">PrintObject</text>+</g>+<!-- u101&#45;&gt;u102 -->+<g id="edge176" class="edge"><title>u101&#45;&gt;u102</title>+<path fill="none" stroke="black" d="M3897.65,-2199.17C3887.42,-2161.36 3862.82,-2070.45 3850.52,-2025.04"/>+<polygon fill="black" stroke="black" points="3853.88,-2024.04 3847.89,-2015.3 3847.12,-2025.87 3853.88,-2024.04"/>+</g>+<!-- u103 -->+<g id="node101" class="node"><title>u103</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3963.28" cy="-1997.27" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="3963.28" y="-1993.57" font-family="Times,serif" font-size="14.00">SetObject</text>+</g>+<!-- u101&#45;&gt;u103 -->+<g id="edge177" class="edge"><title>u101&#45;&gt;u103</title>+<path fill="none" stroke="black" d="M3907.07,-2199.17C3917.65,-2161.36 3943.08,-2070.45 3955.79,-2025.04"/>+<polygon fill="black" stroke="black" points="3959.19,-2025.87 3958.52,-2015.3 3952.45,-2023.99 3959.19,-2025.87"/>+</g>+<!-- u103&#45;&gt;u75 -->+<g id="edge178" class="edge"><title>u103&#45;&gt;u75</title>+<path fill="none" stroke="black" d="M3962.66,-1979.18C3960.75,-1919.73 3956.52,-1716.57 3980.28,-1551.27 3989.02,-1490.46 4009.08,-1421.07 4020.64,-1383.99"/>+<polygon fill="black" stroke="black" points="4023.98,-1385.01 4023.66,-1374.42 4017.31,-1382.9 4023.98,-1385.01"/>+</g>+<!-- u104 -->+<g id="node102" class="node"><title>u104</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3902.28" cy="-2417.27" rx="27" ry="18"/>+<text text-anchor="middle" x="3902.28" y="-2413.57" font-family="Times,serif" font-size="14.00">Raw</text>+</g>+<!-- u104&#45;&gt;u97 -->+<g id="edge179" class="edge"><title>u104&#45;&gt;u97</title>+<path fill="none" stroke="black" d="M3882.25,-2405.08C3877.18,-2402.74 3871.65,-2400.59 3866.28,-2399.27 3147.66,-2222.98 1233.5,-2522.3 539.281,-2266.27 525.175,-2261.07 511.779,-2251.29 501.153,-2241.9"/>+<polygon fill="black" stroke="black" points="503.31,-2239.13 493.601,-2234.89 498.545,-2244.26 503.31,-2239.13"/>+</g>+<!-- u104&#45;&gt;u95 -->+<g id="edge180" class="edge"><title>u104&#45;&gt;u95</title>+<path fill="none" stroke="black" d="M3884.02,-2403.59C3836.83,-2370.8 3710.32,-2282.91 3650.06,-2241.05"/>+<polygon fill="black" stroke="black" points="3651.88,-2238.05 3641.67,-2235.22 3647.88,-2243.8 3651.88,-2238.05"/>+</g>+<!-- u104&#45;&gt;u98 -->+<g id="edge181" class="edge"><title>u104&#45;&gt;u98</title>+<path fill="none" stroke="black" d="M3929.33,-2415.78C4061.27,-2412.74 4635.44,-2392.38 4747.28,-2266.27 4786.86,-2221.65 4762.28,-2057.92 4762.28,-1998.27 4762.28,-1998.27 4762.28,-1998.27 4762.28,-743.272 4762.28,-634.18 4776.23,-603.455 4747.28,-498.272 4729.38,-433.211 4687.99,-364.788 4664.46,-329.165"/>+<polygon fill="black" stroke="black" points="4667.08,-326.788 4658.6,-320.426 4661.26,-330.683 4667.08,-326.788"/>+</g>+<!-- u104&#45;&gt;u99 -->+<g id="edge182" class="edge"><title>u104&#45;&gt;u99</title>+<path fill="none" stroke="black" d="M3881.79,-2405.2C3876.83,-2402.92 3871.46,-2400.76 3866.28,-2399.27 3296.79,-2235.91 2567.67,-2219.72 2379.3,-2218.34"/>+<polygon fill="black" stroke="black" points="2379.23,-2214.84 2369.21,-2218.27 2379.18,-2221.84 2379.23,-2214.84"/>+</g>+<!-- u104&#45;&gt;u63 -->+<g id="edge183" class="edge"><title>u104&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M3882.22,-2405.2C3877.15,-2402.85 3871.63,-2400.67 3866.28,-2399.27 3802.2,-2382.55 1684.64,-2245.6 1315.04,-2221.79"/>+<polygon fill="black" stroke="black" points="1315.07,-2218.29 1304.86,-2221.14 1314.62,-2225.27 1315.07,-2218.29"/>+</g>+<!-- u104&#45;&gt;u3 -->+<g id="edge184" class="edge"><title>u104&#45;&gt;u3</title>+<path fill="none" stroke="black" d="M3894.28,-2399.72C3860.21,-2328.19 3731.25,-2045.93 3780.28,-1971.27 3992.18,-1648.65 4351.75,-1939.51 4577.28,-1626.27 4695.18,-1462.52 4709.74,-870.483 4577.28,-718.272 4349.82,-456.898 4128.84,-711.888 3811.28,-573.272 3796.28,-566.724 3781.45,-556.174 3769.75,-546.63"/>+<polygon fill="black" stroke="black" points="3771.73,-543.715 3761.83,-539.93 3767.21,-549.06 3771.73,-543.715"/>+</g>+<!-- u104&#45;&gt;u101 -->+<g id="edge185" class="edge"><title>u104&#45;&gt;u101</title>+<path fill="none" stroke="black" d="M3902.28,-2399.05C3902.28,-2364.59 3902.28,-2286.92 3902.28,-2245.5"/>+<polygon fill="black" stroke="black" points="3905.78,-2245.32 3902.28,-2235.32 3898.78,-2245.32 3905.78,-2245.32"/>+</g>+<!-- u94 -->+<g id="node104" class="node"><title>u94</title>+<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="3902.28" cy="-2616.27" rx="27.0966" ry="18"/>+<text text-anchor="middle" x="3902.28" y="-2612.57" font-family="Times,serif" font-size="14.00">Play</text>+</g>+<!-- u94&#45;&gt;u96 -->+<g id="edge5" class="edge"><title>u94&#45;&gt;u96</title>+<path fill="none" stroke="black" d="M3895.55,-2598.48C3881.76,-2564.09 3850.23,-2485.47 3833.75,-2444.38"/>+<polygon fill="black" stroke="black" points="3836.97,-2443 3830,-2435.03 3830.47,-2445.61 3836.97,-2443"/>+</g>+<!-- u94&#45;&gt;u104 -->+<g id="edge6" class="edge"><title>u94&#45;&gt;u104</title>+<path fill="none" stroke="black" d="M3902.28,-2598.13C3902.28,-2563.93 3902.28,-2486.96 3902.28,-2445.67"/>+<polygon fill="black" stroke="black" points="3905.78,-2445.51 3902.28,-2435.51 3898.78,-2445.51 3905.78,-2445.51"/>+</g>+<!-- u0 -->+<g id="node105" class="node"><title>u0</title>+<ellipse fill="#bbffbb" stroke="black" stroke-width="0" cx="4346.28" cy="-2816.27" rx="29.795" ry="18"/>+<text text-anchor="middle" x="4346.28" y="-2812.57" font-family="Times,serif" font-size="14.00">Main</text>+</g>+<!-- u0&#45;&gt;u2 -->+<g id="edge2" class="edge"><title>u0&#45;&gt;u2</title>+<path fill="none" stroke="black" d="M4316.2,-2815.24C4118.05,-2814.61 2980.06,-2804.81 2067.28,-2665.27 1322.76,-2551.45 1113.85,-2559.92 420.281,-2266.27 404.248,-2259.48 387.756,-2249.5 374.249,-2240.39"/>+<polygon fill="black" stroke="black" points="376.055,-2237.38 365.84,-2234.57 372.073,-2243.14 376.055,-2237.38"/>+</g>+<!-- u0&#45;&gt;u1 -->+<g id="edge3" class="edge"><title>u0&#45;&gt;u1</title>+<path fill="none" stroke="black" d="M4376.23,-2815.78C4459.67,-2815.41 4695.8,-2801.8 4805.28,-2665.27 4874.28,-2579.23 4829.28,-2528.57 4829.28,-2418.27 4829.28,-2418.27 4829.28,-2418.27 4829.28,-743.272 4829.28,-582.724 4762.61,-397.828 4736.03,-330.504"/>+<polygon fill="black" stroke="black" points="4739.22,-329.073 4732.27,-321.085 4732.72,-331.67 4739.22,-329.073"/>+</g>+<!-- u0&#45;&gt;u93 -->+<g id="edge4" class="edge"><title>u0&#45;&gt;u93</title>+<path fill="none" stroke="black" d="M4376.27,-2815.19C4456.44,-2813.18 4676.38,-2795.49 4775.28,-2665.27 4841.82,-2577.67 4791.28,-2528.28 4791.28,-2418.27 4791.28,-2418.27 4791.28,-2418.27 4791.28,-1996.27 4791.28,-1810.64 4590.17,-1655.91 4507.82,-1600.32"/>+<polygon fill="black" stroke="black" points="4509.57,-1597.28 4499.3,-1594.64 4505.68,-1603.1 4509.57,-1597.28"/>+</g>+<!-- u0&#45;&gt;u94 -->+<g id="edge1" class="edge"><title>u0&#45;&gt;u94</title>+<path fill="none" stroke="black" d="M4323.03,-2804.91C4248.89,-2771.84 4017.94,-2668.85 3933.56,-2631.22"/>+<polygon fill="black" stroke="black" points="3934.8,-2627.94 3924.24,-2627.07 3931.95,-2634.34 3934.8,-2627.94"/>+</g>+</g>+</svg>
+ changelog.markdown view
@@ -0,0 +1,4 @@+# 2018-01-01 Dr. Alistair Ward <bishbosh@functionalley.eu>++## 0.0.0.1+* First version of the package.
+ config/CECP/bishbosh_black.xml view
@@ -0,0 +1,70 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<options>+	<evaluationOptions>+		<criteriaWeights material="1" mobility="0.024" pieceSquareValue="0.043" castlingPotential="0.005" defence="0" doubledPawns="0" isolatedPawns="0" passedPawns="0"/>+		<pieceSquareTables>+			<pieceSquareTable>+<!--+								a1   b1   c1   d1   a2   b2   c2   d2   a3   b3   c3   d3   a4   b4   c4   d4   a5   b5   c5   d5   a6   b6   c6   d6   a7   b7   c7   d7   a8   b8   c8   d8+-->+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.55 0.60 0.60 0.30 0.55 0.45 0.40 0.50 0.50 0.50 0.50 0.70 0.55 0.55 0.60 0.75 0.60 0.60 0.70 0.80 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="r" byCoordinates="0.50 0.50 0.50 0.55 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.55 0.60 0.60 0.60 0.50 0.50 0.50 0.50"/>+				<byRank rank="n" byCoordinates="0.00 0.10 0.20 0.20 0.10 0.30 0.50 0.55 0.20 0.55 0.60 0.65 0.20 0.50 0.65 0.70 0.20 0.55 0.65 0.70 0.20 0.50 0.60 0.65 0.10 0.30 0.50 0.50 0.00 0.10 0.20 0.20"/>+				<byRank rank="b" byCoordinates="0.30 0.40 0.40 0.40 0.40 0.55 0.50 0.50 0.40 0.60 0.60 0.60 0.40 0.50 0.60 0.60 0.40 0.55 0.55 0.60 0.40 0.50 0.55 0.60 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.40"/>+				<byRank rank="q" byCoordinates="0.30 0.40 0.40 0.45 0.40 0.50 0.50 0.50 0.40 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.40 0.50 0.55 0.55 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.45"/>+				<byRank rank="k" byCoordinates="0.70 0.80 0.60 0.50 0.70 0.70 0.50 0.50 0.40 0.30 0.30 0.30 0.30 0.20 0.20 0.10 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00"/>+			</pieceSquareTable>+			<pieceSquareTableEndGame>+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.00 0.00 0.00 0.00 0.10 0.10 0.10 0.10 0.20 0.20 0.20 0.20 0.30 0.30 0.30 0.30 0.60 0.60 0.60 0.60 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="k" byCoordinates="0.00 0.20 0.20 0.20 0.20 0.20 0.50 0.50 0.20 0.40 0.70 0.80 0.20 0.40 0.80 0.90 0.20 0.40 0.80 0.90 0.20 0.40 0.70 0.80 0.20 0.30 0.40 0.50 0.00 0.10 0.20 0.30"/>+			</pieceSquareTableEndGame>+		</pieceSquareTables>+	</evaluationOptions>+	<searchOptions preferMovesTowardsCentre="False" sortOnStandardOpeningMoveFrequency="True" captureMoveSortAlgorithm="MVVLVA" retireKillerMovesAfter="3" usePondering="True">+		<transpositions retireTranspositionsAfter="1" minimumTranspositionSearchDepth="2"/>+		<searchDepthByLogicalColour>+			<byLogicalColour logicalColour="Black" searchDepth="4"/>+		</searchDepthByLogicalColour>+	</searchOptions>+	<ioOptions maximumPGNNames="8">+		<pgnOptions databaseFilePath="pgn/scid_fr.pgn" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+<!--+		</pgnOptions><pgnOptions databaseFilePath="pgn/scid.pgn" isStrictlySequential="False" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+		</pgnOptions><pgnOptions databaseFilePath="pgn/bundesliga2000.pgn" validateMoves="False">+			<identificationTag tag="Event"/>+			<identificationTag tag="Round"/>+		</pgnOptions><pgnOptions databaseFilePath="pgn/ficsgamesdb_201601_standard2000_nomovetimes_1403205.pgn" validateMoves="False" minimumPlies="8">+			<identificationTag tag="FICSGamesDBGameNo"/>+-->+		</pgnOptions>+		<persistence filePath="/dev/null" automatic="False"/>+		<uiOptions moveNotation="Coordinate" verbosity="Silent">+			<cecpOptions/>+		</uiOptions>+	</ioOptions>+</options>
+ config/Raw/bishbosh_black.xml view
@@ -0,0 +1,69 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<options>+	<evaluationOptions>+		<criteriaWeights material="1" mobility="0.024" pieceSquareValue="0.043" castlingPotential="0.005" defence="0" doubledPawns="0" isolatedPawns="0" passedPawns="0"/>+		<pieceSquareTables>+			<pieceSquareTable>+<!--+								a1   b1   c1   d1   a2   b2   c2   d2   a3   b3   c3   d3   a4   b4   c4   d4   a5   b5   c5   d5   a6   b6   c6   d6   a7   b7   c7   d7   a8   b8   c8   d8+-->+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.55 0.60 0.60 0.30 0.55 0.45 0.40 0.50 0.50 0.50 0.50 0.70 0.55 0.55 0.60 0.75 0.60 0.60 0.70 0.80 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="r" byCoordinates="0.50 0.50 0.50 0.55 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.55 0.60 0.60 0.60 0.50 0.50 0.50 0.50"/>+				<byRank rank="n" byCoordinates="0.00 0.10 0.20 0.20 0.10 0.30 0.50 0.55 0.20 0.55 0.60 0.65 0.20 0.50 0.65 0.70 0.20 0.55 0.65 0.70 0.20 0.50 0.60 0.65 0.10 0.30 0.50 0.50 0.00 0.10 0.20 0.20"/>+				<byRank rank="b" byCoordinates="0.30 0.40 0.40 0.40 0.40 0.55 0.50 0.50 0.40 0.60 0.60 0.60 0.40 0.50 0.60 0.60 0.40 0.55 0.55 0.60 0.40 0.50 0.55 0.60 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.40"/>+				<byRank rank="q" byCoordinates="0.30 0.40 0.40 0.45 0.40 0.50 0.50 0.50 0.40 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.40 0.50 0.55 0.55 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.45"/>+				<byRank rank="k" byCoordinates="0.70 0.80 0.60 0.50 0.70 0.70 0.50 0.50 0.40 0.30 0.30 0.30 0.30 0.20 0.20 0.10 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00"/>+			</pieceSquareTable>+			<pieceSquareTableEndGame>+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.00 0.00 0.00 0.00 0.10 0.10 0.10 0.10 0.20 0.20 0.20 0.20 0.30 0.30 0.30 0.30 0.60 0.60 0.60 0.60 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="k" byCoordinates="0.00 0.20 0.20 0.20 0.20 0.20 0.50 0.50 0.20 0.40 0.70 0.80 0.20 0.40 0.80 0.90 0.20 0.40 0.80 0.90 0.20 0.40 0.70 0.80 0.20 0.30 0.40 0.50 0.00 0.10 0.20 0.30"/>+			</pieceSquareTableEndGame>+		</pieceSquareTables>+	</evaluationOptions>+	<searchOptions preferMovesTowardsCentre="False" sortOnStandardOpeningMoveFrequency="True" captureMoveSortAlgorithm="MVVLVA" retireKillerMovesAfter="3" usePondering="True">+		<transpositions retireTranspositionsAfter="1" minimumTranspositionSearchDepth="2"/>+		<searchDepthByLogicalColour>+			<byLogicalColour logicalColour="Black" searchDepth="4"/>+		</searchDepthByLogicalColour>+	</searchOptions>+	<ioOptions maximumPGNNames="8">+		<pgnOptions databaseFilePath="pgn/scid.pgn" isStrictlySequential="False" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+<!--+		</pgnOptions><pgnOptions databaseFilePath="pgn/scid_fr.pgn" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+		</pgnOptions><pgnOptions databaseFilePath="pgn/bundesliga2000.pgn" validateMoves="False">+			<identificationTag tag="Event"/>+			<identificationTag tag="Round"/>+		</pgnOptions><pgnOptions databaseFilePath="pgn/ficsgamesdb_201601_standard2000_nomovetimes_1403205.pgn" validateMoves="False" minimumPlies="8">+			<identificationTag tag="FICSGamesDBGameNo"/>+-->+		</pgnOptions>+		<uiOptions>+			<nativeUIOptions/>+		</uiOptions>+	</ioOptions>+</options>
+ config/Raw/bishbosh_both.xml view
@@ -0,0 +1,60 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<options>+	<evaluationOptions>+		<criteriaWeights material="1" mobility="0.024" pieceSquareValue="0.043" castlingPotential="0.005" defence="0" doubledPawns="0" isolatedPawns="0" passedPawns="0"/>+		<pieceSquareTables>+			<pieceSquareTable>+<!--+								a1   b1   c1   d1   a2   b2   c2   d2   a3   b3   c3   d3   a4   b4   c4   d4   a5   b5   c5   d5   a6   b6   c6   d6   a7   b7   c7   d7   a8   b8   c8   d8+-->+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.55 0.60 0.60 0.30 0.55 0.45 0.40 0.50 0.50 0.50 0.50 0.70 0.55 0.55 0.60 0.75 0.60 0.60 0.70 0.80 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="r" byCoordinates="0.50 0.50 0.50 0.55 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.55 0.60 0.60 0.60 0.50 0.50 0.50 0.50"/>+				<byRank rank="n" byCoordinates="0.00 0.10 0.20 0.20 0.10 0.30 0.50 0.55 0.20 0.55 0.60 0.65 0.20 0.50 0.65 0.70 0.20 0.55 0.65 0.70 0.20 0.50 0.60 0.65 0.10 0.30 0.50 0.50 0.00 0.10 0.20 0.20"/>+				<byRank rank="b" byCoordinates="0.30 0.40 0.40 0.40 0.40 0.55 0.50 0.50 0.40 0.60 0.60 0.60 0.40 0.50 0.60 0.60 0.40 0.55 0.55 0.60 0.40 0.50 0.55 0.60 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.40"/>+				<byRank rank="q" byCoordinates="0.30 0.40 0.40 0.45 0.40 0.50 0.50 0.50 0.40 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.40 0.50 0.55 0.55 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.45"/>+				<byRank rank="k" byCoordinates="0.70 0.80 0.60 0.50 0.70 0.70 0.50 0.50 0.40 0.30 0.30 0.30 0.30 0.20 0.20 0.10 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00"/>+			</pieceSquareTable>+			<pieceSquareTableEndGame>+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.00 0.00 0.00 0.00 0.10 0.10 0.10 0.10 0.20 0.20 0.20 0.20 0.30 0.30 0.30 0.30 0.60 0.60 0.60 0.60 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="k" byCoordinates="0.00 0.20 0.20 0.20 0.20 0.20 0.50 0.50 0.20 0.40 0.70 0.80 0.20 0.40 0.80 0.90 0.20 0.40 0.80 0.90 0.20 0.40 0.70 0.80 0.20 0.30 0.40 0.50 0.00 0.10 0.20 0.30"/>+			</pieceSquareTableEndGame>+		</pieceSquareTables>+	</evaluationOptions>+	<searchOptions preferMovesTowardsCentre="False" sortOnStandardOpeningMoveFrequency="True" captureMoveSortAlgorithm="MVVLVA" retireKillerMovesAfter="3">+		<transpositions retireTranspositionsAfter="1" minimumTranspositionSearchDepth="2"/>+		<searchDepthByLogicalColour>+			<byLogicalColour logicalColour="Black" searchDepth="4"/>+			<byLogicalColour logicalColour="White" searchDepth="4"/>+		</searchDepthByLogicalColour>+	</searchOptions>+	<ioOptions maximumPGNNames="8">+		<pgnOptions databaseFilePath="pgn/scid.pgn" isStrictlySequential="False" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+		</pgnOptions>+		<uiOptions>+			<nativeUIOptions/>+		</uiOptions>+	</ioOptions>+</options>
+ config/Raw/bishbosh_neither.xml view
@@ -0,0 +1,29 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<options>+	<ioOptions>+		<uiOptions>+			<nativeUIOptions/>+		</uiOptions>+	</ioOptions>+</options>
+ config/Raw/bishbosh_prof.xml view
@@ -0,0 +1,66 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<!-- e2e3 e7e5 c2c4 d7d6 b1c3 b8c6 b2b3 g8f6 f1d3 c6b4 d3e2 f8e7 a2a3 b4c6 f2f4 e5f4p e3f4p c6d4 g1f3 c7c5 -->+<options maximumPlies="20" randomSeed="-1">+	<evaluationOptions>+		<rankValues rank="p" value="0.1"/>+		<rankValues rank="r" value="0.5"/>+		<rankValues rank="n" value="0.3"/>+		<rankValues rank="b" value="0.3"/>+		<rankValues rank="q" value="0.9"/>+		<rankValues rank="k" value="0"/>+		<criteriaWeights material="1" mobility="0.01" pieceSquareValue="0.01" castlingPotential="0.01" defence="0.0001" doubledPawns="0.0001" isolatedPawns="0.0001" passedPawns="0.0001"/>+		<pieceSquareTables>+			<pieceSquareTable>+<!--+								a1   b1   c1   d1   a2   b2   c2   d2   a3   b3   c3   d3   a4   b4   c4   d4   a5   b5   c5   d5   a6   b6   c6   d6   a7   b7   c7   d7   a8   b8   c8   d8+-->+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.55 0.60 0.60 0.30 0.55 0.45 0.40 0.50 0.50 0.50 0.50 0.70 0.55 0.55 0.60 0.75 0.60 0.60 0.70 0.80 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="r" byCoordinates="0.50 0.50 0.50 0.55 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.55 0.60 0.60 0.60 0.50 0.50 0.50 0.50"/>+				<byRank rank="n" byCoordinates="0.00 0.10 0.20 0.20 0.10 0.30 0.50 0.55 0.20 0.55 0.60 0.65 0.20 0.50 0.65 0.70 0.20 0.55 0.65 0.70 0.20 0.50 0.60 0.65 0.10 0.30 0.50 0.50 0.00 0.10 0.20 0.20"/>+				<byRank rank="b" byCoordinates="0.30 0.40 0.40 0.40 0.40 0.55 0.50 0.50 0.40 0.60 0.60 0.60 0.40 0.50 0.60 0.60 0.40 0.55 0.55 0.60 0.40 0.50 0.55 0.60 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.40"/>+				<byRank rank="q" byCoordinates="0.30 0.40 0.40 0.45 0.40 0.50 0.50 0.50 0.40 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.40 0.50 0.55 0.55 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.45"/>+				<byRank rank="k" byCoordinates="0.70 0.80 0.60 0.50 0.70 0.70 0.50 0.50 0.40 0.30 0.30 0.30 0.30 0.20 0.20 0.10 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00"/>+			</pieceSquareTable>+			<pieceSquareTableEndGame>+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.00 0.00 0.00 0.00 0.10 0.10 0.10 0.10 0.20 0.20 0.20 0.20 0.30 0.30 0.30 0.30 0.60 0.60 0.60 0.60 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="k" byCoordinates="0.00 0.20 0.20 0.20 0.20 0.20 0.50 0.50 0.20 0.40 0.70 0.80 0.20 0.40 0.80 0.90 0.20 0.40 0.80 0.90 0.20 0.40 0.70 0.80 0.20 0.30 0.40 0.50 0.00 0.10 0.20 0.30"/>+			</pieceSquareTableEndGame>+		</pieceSquareTables>+	</evaluationOptions>+	<searchOptions preferMovesTowardsCentre="False" sortOnStandardOpeningMoveFrequency="True" captureMoveSortAlgorithm="MVVLVA" retireKillerMovesAfter="3">+		<transpositions retireTranspositionsAfter="1" minimumTranspositionSearchDepth="2"/>+		<searchDepthByLogicalColour>+			<byLogicalColour logicalColour="Black" searchDepth="4"/>+			<byLogicalColour logicalColour="White" searchDepth="4"/>+		</searchDepthByLogicalColour>+	</searchOptions>+	<ioOptions maximumPGNNames="8">+		<pgnOptions databaseFilePath="pgn/scid_fr.pgn" validateMoves="True">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+		</pgnOptions>+		<persistence filePath="/dev/null" automatic="False"/>+		<uiOptions verbosity="Silent"/>+	</ioOptions>+</options>
+ config/Raw/bishbosh_white.xml view
@@ -0,0 +1,59 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../bishbosh.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<options>+	<evaluationOptions>+		<criteriaWeights material="1" mobility="0.024" pieceSquareValue="0.043" castlingPotential="0.005" defence="0" doubledPawns="0" isolatedPawns="0" passedPawns="0"/>+		<pieceSquareTables>+			<pieceSquareTable>+<!--+								a1   b1   c1   d1   a2   b2   c2   d2   a3   b3   c3   d3   a4   b4   c4   d4   a5   b5   c5   d5   a6   b6   c6   d6   a7   b7   c7   d7   a8   b8   c8   d8+-->+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.55 0.60 0.60 0.30 0.55 0.45 0.40 0.50 0.50 0.50 0.50 0.70 0.55 0.55 0.60 0.75 0.60 0.60 0.70 0.80 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="r" byCoordinates="0.50 0.50 0.50 0.55 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.45 0.50 0.50 0.50 0.55 0.60 0.60 0.60 0.50 0.50 0.50 0.50"/>+				<byRank rank="n" byCoordinates="0.00 0.10 0.20 0.20 0.10 0.30 0.50 0.55 0.20 0.55 0.60 0.65 0.20 0.50 0.65 0.70 0.20 0.55 0.65 0.70 0.20 0.50 0.60 0.65 0.10 0.30 0.50 0.50 0.00 0.10 0.20 0.20"/>+				<byRank rank="b" byCoordinates="0.30 0.40 0.40 0.40 0.40 0.55 0.50 0.50 0.40 0.60 0.60 0.60 0.40 0.50 0.60 0.60 0.40 0.55 0.55 0.60 0.40 0.50 0.55 0.60 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.40"/>+				<byRank rank="q" byCoordinates="0.30 0.40 0.40 0.45 0.40 0.50 0.50 0.50 0.40 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.45 0.50 0.55 0.55 0.40 0.50 0.55 0.55 0.40 0.50 0.50 0.50 0.30 0.40 0.40 0.45"/>+				<byRank rank="k" byCoordinates="0.70 0.80 0.60 0.50 0.70 0.70 0.50 0.50 0.40 0.30 0.30 0.30 0.30 0.20 0.20 0.10 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00 0.20 0.10 0.10 0.00"/>+			</pieceSquareTable>+			<pieceSquareTableEndGame>+				<byRank rank="p" byCoordinates="0.50 0.50 0.50 0.50 0.00 0.00 0.00 0.00 0.10 0.10 0.10 0.10 0.20 0.20 0.20 0.20 0.30 0.30 0.30 0.30 0.60 0.60 0.60 0.60 1.00 1.00 1.00 1.00 0.50 0.50 0.50 0.50"/>+				<byRank rank="k" byCoordinates="0.00 0.20 0.20 0.20 0.20 0.20 0.50 0.50 0.20 0.40 0.70 0.80 0.20 0.40 0.80 0.90 0.20 0.40 0.80 0.90 0.20 0.40 0.70 0.80 0.20 0.30 0.40 0.50 0.00 0.10 0.20 0.30"/>+			</pieceSquareTableEndGame>+		</pieceSquareTables>+	</evaluationOptions>+	<searchOptions captureMoveSortAlgorithm="MVVLVA" retireKillerMovesAfter="3" usePondering="True">+		<transpositions retireTranspositionsAfter="1" minimumTranspositionSearchDepth="2"/>+		<searchDepthByLogicalColour>+			<byLogicalColour logicalColour="White" searchDepth="4"/>+		</searchDepthByLogicalColour>+	</searchOptions>+	<ioOptions maximumPGNNames="8">+		<pgnOptions databaseFilePath="pgn/scid.pgn" isStrictlySequential="False" validateMoves="False">+			<identificationTag tag="ECO"/>+			<identificationTag tag="Variation"/>+		</pgnOptions>+		<uiOptions>+			<nativeUIOptions/>+		</uiOptions>+	</ioOptions>+</options>
+ config/bishbosh.dtd view
@@ -0,0 +1,149 @@+<?xml version="1.0" encoding="UTF-8"?>+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-->+<!ELEMENT options ((evaluationOptions)?, (searchOptions)?, (ioOptions)?)>+	<!ATTLIST options+		maximumPlies	CDATA	#IMPLIED+		randomSeed	CDATA	#IMPLIED+	>+	<!ELEMENT evaluationOptions ((rankValues)*, (criteriaWeights)?, (pieceSquareTables)?)>+		<!ATTLIST evaluationOptions+			incrementalEvaluation	(False | True)	#IMPLIED+		>+		<!ELEMENT rankValues EMPTY>+			<!ATTLIST rankValues+				rank	(p | r | n | b | q | k)	#REQUIRED+				value	CDATA			#REQUIRED+			>+		<!ELEMENT criteriaWeights EMPTY>+			<!ATTLIST criteriaWeights+				material		CDATA	#IMPLIED+				mobility		CDATA	#IMPLIED+				pieceSquareValue	CDATA	#IMPLIED+				castlingPotential	CDATA	#IMPLIED+				defence			CDATA	#IMPLIED+				doubledPawns		CDATA	#IMPLIED+				isolatedPawns		CDATA	#IMPLIED+				passedPawns		CDATA	#IMPLIED+			>+		<!ELEMENT pieceSquareTables (pieceSquareTable, pieceSquareTableEndGame)>+			<!ELEMENT pieceSquareTable (byRank)+>+				<!ATTLIST pieceSquareTable+					reflectOnY	(False | True)	#IMPLIED+				>+			<!ELEMENT pieceSquareTableEndGame (byRank)+>+				<!ATTLIST pieceSquareTableEndGame+					reflectOnY	(False | True)	#IMPLIED+				>+		<!ELEMENT byRank EMPTY>+			<!ATTLIST byRank+				rank		(p | r | n | b | q | k)	#REQUIRED+				byCoordinates	CDATA			#REQUIRED+			>+	<!ELEMENT searchOptions ((transpositions)?, (standardOpeningOptions)?, searchDepthByLogicalColour)>+		<!ATTLIST searchOptions+			preferMovesTowardsCentre		(False | True)	#IMPLIED+			sortOnStandardOpeningMoveFrequency	(False | True)	#IMPLIED+			captureMoveSortAlgorithm		(MVVLVA | SEE)	#IMPLIED+			minimumHammingDistance			CDATA		#IMPLIED+			retireKillerMovesAfter			CDATA		#IMPLIED+			trapRepeatedPositions			(False | True)	#IMPLIED+			usePondering				(False | True)	#IMPLIED+		>+		<!ELEMENT standardOpeningOptions EMPTY>+			<!ATTLIST standardOpeningOptions+				tryToMatchMoves			(False | True)	#IMPLIED+				tryToMatchViaJoiningMove	(False | True)	#IMPLIED+				tryToMatchColourFlippedPosition	(False | True)	#IMPLIED+			>+		<!ELEMENT searchDepthByLogicalColour (byLogicalColour)*>+			<!ELEMENT byLogicalColour EMPTY>+				<!ATTLIST byLogicalColour+					logicalColour	(Black | White) #REQUIRED+					searchDepth	CDATA		#REQUIRED+				>+		<!ELEMENT transpositions EMPTY>+			<!ATTLIST transpositions+				retireTranspositionsAfter	CDATA	#REQUIRED+				minimumTranspositionSearchDepth	CDATA	#REQUIRED+			>+	<!ELEMENT ioOptions ((pgnOptions)*, (persistence)?, (uiOptions)?)>+		<!ATTLIST ioOptions+			outputConfigFilePath	CDATA	#IMPLIED+			maximumPGNNames		CDATA	#IMPLIED+		>+		<!ELEMENT pgnOptions (identificationTag)*>+			<!ATTLIST pgnOptions+				databaseFilePath	CDATA		#REQUIRED+				minimumPlies		CDATA		#IMPLIED+				isStrictlySequential	(False | True)	#IMPLIED+				validateMoves		(False | True)	#IMPLIED+			>+			<!ELEMENT identificationTag EMPTY>+				<!ATTLIST identificationTag+					tag	CDATA	#REQUIRED+				>+		<!ELEMENT persistence EMPTY>+			<!ATTLIST persistence+				filePath	CDATA		#REQUIRED+				automatic	(False | True)	#IMPLIED+			>+		<!ELEMENT uiOptions ((nativeUIOptions | cecpOptions)?)>+			<!ATTLIST uiOptions+				moveNotation	(Coordinate | ICCFNumeric | Smith)	#IMPLIED+				printMoveTree	CDATA					#IMPLIED+				nDecimalDigits	CDATA					#IMPLIED+				verbosity	(Silent | Normal | Verbose | Deafening)	#IMPLIED+			>+			<!ELEMENT nativeUIOptions ((boardMagnification)?, (colourScheme)?)>+				<!ELEMENT boardMagnification EMPTY>+					<!ATTLIST boardMagnification+						nRows		CDATA	#REQUIRED+						nColumns	CDATA	#REQUIRED+					>+				<!ELEMENT colourScheme EMPTY>+					<!ATTLIST colourScheme+						darkPieceColour		(Black | Red | Green | Blue | Magenta | Cyan)	#IMPLIED+						darkSquareColour	(Black | Red | Green | Blue | Magenta | Cyan)	#IMPLIED+						lightPieceColour	(Red | Green | Yellow | Magenta | Cyan | White)	#IMPLIED+						lightSquareColour	(Red | Green | Yellow | Magenta | Cyan | White)	#IMPLIED+					>+			<!ELEMENT cecpOptions (cecpFeatures)?>+				<!ATTLIST cecpOptions+					analyseMode	(False | True)	#IMPLIED+					displaySAN	(False | True)	#IMPLIED+					editMode	(False | True)	#IMPLIED+					forceMode	(False | True)	#IMPLIED+					pause		CDATA		#IMPLIED+					ponderMode	(False | True)	#IMPLIED+					postMode	(False | True)	#IMPLIED+					protocolVersion	CDATA		#IMPLIED+				>+				<!ELEMENT cecpFeatures (feature)*>+					<!ATTLIST cecpFeatures+						done	(False | True)	#IMPLIED+					>+					<!ELEMENT feature EMPTY>+						<!ATTLIST feature+							key	ID	#REQUIRED+							value	CDATA	#REQUIRED+						>+
+ config/bishbosh.rng view
@@ -0,0 +1,364 @@+<?xml version="1.0" encoding="UTF-8"?>+<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">+	<start>+		<element name="options">+			<optional>+				<attribute name="maximumPlies">+					<data type="positiveInteger"/>+				</attribute>+			</optional><optional>+				<attribute name="randomSeed">+					<data type="integer"/>+				</attribute>+			</optional><optional>+				<element name="evaluationOptions">+					<optional>+						<attribute name="incrementalEvaluation">+							<ref name="Boolean"/>+						</attribute>+					</optional>+					<zeroOrMore>+						<element name="rankValues">+							<ref name="Rank"/>+							<attribute name="value">+								<ref name="ClosedUnitInterval"/>+							</attribute>+						</element>+					</zeroOrMore>+					<optional>+						<element name="criteriaWeights">+							<oneOrMore>+								<attribute>+									<choice>+										<name>material</name>+										<name>mobility</name>+										<name>pieceSquareValue</name>+										<name>castlingPotential</name>+										<name>defence</name>+										<name>doubledPawns</name>+										<name>isolatedPawns</name>+										<name>passedPawns</name>+									</choice>+									<ref name="ClosedUnitInterval"/>+								</attribute>+							</oneOrMore>+						</element>+					</optional><optional>+						<element name="pieceSquareTables">+							<element name="pieceSquareTable">+								<ref name="PieceSquareTable"/>+							</element><element name="pieceSquareTableEndGame">+								<ref name="PieceSquareTable"/>+							</element>+						</element>	<!-- pieceSquareTables -->+					</optional>+				</element>	<!-- evaluationOptions -->+			</optional><optional>+				<element name="searchOptions">+					<optional>+						<attribute name="preferMovesTowardsCentre">+							<ref name="Boolean"/>+						</attribute>+					</optional><optional>+						<attribute name="sortOnStandardOpeningMoveFrequency">+							<ref name="Boolean"/>+						</attribute>+					</optional><optional>+						<attribute name="captureMoveSortAlgorithm">+							<choice>+								<value>MVVLVA</value>+								<value>SEE</value>+							</choice>+						</attribute>+					</optional><optional>+						<attribute name="minimumHammingDistance">+							<data type="positiveInteger"/>+						</attribute>+					</optional><optional>+						<attribute name="retireKillerMovesAfter">+							<data type="nonNegativeInteger"/>+						</attribute>+					</optional><optional>+						<attribute name="trapRepeatedPositions">+							<ref name="Boolean"/>+						</attribute>+					</optional><optional>+						<attribute name="usePondering">+							<ref name="Boolean"/>+						</attribute>+					</optional><optional>+						<element name="transpositions">+							<attribute name="retireTranspositionsAfter">+								<data type="nonNegativeInteger"/>+							</attribute><attribute name="minimumTranspositionSearchDepth">+								<data type="positiveInteger"/>+							</attribute>+						</element>+					</optional><optional>+						<element name="standardOpeningOptions">+							<optional>+								<attribute name="tryToMatchMoves">+									<ref name="Boolean"/>+								</attribute>+							</optional><optional>+								<attribute name="tryToMatchViaJoiningMove">+									<ref name="Boolean"/>+								</attribute>+							</optional><optional>+								<attribute name="tryToMatchColourFlippedPosition">+									<ref name="Boolean"/>+								</attribute>+							</optional>+						</element>	<!-- standardOpeningOptions -->+					</optional>+					<element name="searchDepthByLogicalColour">+						<zeroOrMore>+							<element name="byLogicalColour">+								<attribute name="logicalColour">+									<choice>+										<value>Black</value>+										<value>White</value>+									</choice>+								</attribute><attribute name="searchDepth">+									<data type="nonNegativeInteger"/>+								</attribute>+							</element>	<!-- byLogicalColour -->+						</zeroOrMore>+					</element>	<!-- searchDepthByLogicalColour -->+				</element>	<!-- searchOptions -->+			</optional><optional>+				<element name="ioOptions">+					<optional>+						<attribute name="outputConfigFilePath"/>+					</optional><optional>+						<attribute name="maximumPGNNames">+							<data type="nonNegativeInteger"/>+						</attribute>+					</optional>+					<zeroOrMore>+						<element name="pgnOptions">+							<attribute name="databaseFilePath"/>+							<optional>+								<attribute name="minimumPlies">+									<data type="nonNegativeInteger"/>+								</attribute>+							</optional>+							<zeroOrMore>+								<attribute>+									<choice>+										<name>isStrictlySequential</name>+										<name>validateMoves</name>+									</choice>+									<ref name="Boolean"/>+								</attribute>+							</zeroOrMore><zeroOrMore>+								<element name="identificationTag">+									<attribute name="tag"/>+								</element>+							</zeroOrMore>+						</element>+					</zeroOrMore>+					<optional>+						<element name="persistence">+							<attribute name="filePath"/>+							<optional>+								<attribute name="automatic">+									<ref name="Boolean"/>+								</attribute>+							</optional>+						</element>+					</optional><optional>+						<element name="uiOptions">+							<optional>+								<attribute name="moveNotation">+									<choice>+										<value>Coordinate</value>+										<value>ICCFNumeric</value>+										<value>Smith</value>+									</choice>+								</attribute>+							</optional><optional>+								<attribute name="printMoveTree">+									<data type="positiveInteger"/>+								</attribute>+							</optional><optional>+								<attribute name="nDecimalDigits">+									<data type="positiveInteger">+										<param name="maxInclusive">15</param>+									</data>+								</attribute>+							</optional><optional>+								<attribute name="verbosity">+									<choice>+										<value>Silent</value>+										<value>Normal</value>+										<value>Verbose</value>+										<value>Deafening</value>+									</choice>+								</attribute>+							</optional><optional>+								<choice>+									<element name="nativeUIOptions">+										<optional>+											<element name="boardMagnification">+												<attribute name="nRows">+													<data type="positiveInteger"/>+												</attribute><attribute name="nColumns">+													<data type="positiveInteger"/>+												</attribute>+											</element>+										</optional><optional>+											<element name="colourScheme">+												<zeroOrMore>+													<attribute>+														<choice>+															<name>darkPieceColour</name>+															<name>darkSquareColour</name>+														</choice><choice>+															<value>Black</value>+															<value>Red</value>+															<value>Green</value>+															<value>Blue</value>+															<value>Magenta</value>+															<value>Cyan</value>+														</choice>+													</attribute>+												</zeroOrMore><zeroOrMore>+													<attribute>+														<choice>+															<name>lightPieceColour</name>+															<name>lightSquareColour</name>+														</choice><choice>+															<value>Red</value>+															<value>Green</value>+															<value>Yellow</value>+															<value>Magenta</value>+															<value>Cyan</value>+															<value>White</value>+														</choice>+													</attribute>+												</zeroOrMore>+											</element>	<!-- colourScheme -->+										</optional>+									</element><element name="cecpOptions">+										<zeroOrMore>+											<attribute>+												<choice>+													<name>analyseMode</name>+													<name>displaySAN</name>+													<name>editMode</name>+													<name>forceMode</name>+													<name>pause</name>+													<name>ponderMode</name>+													<name>postMode</name>+												</choice>+												<ref name="Boolean"/>+											</attribute>+										</zeroOrMore>+										<optional>+											<attribute name="protocolVersion">+												<data type="positiveInteger"/>+											</attribute>+										</optional><optional>+											<element name="cecpFeatures">+												<optional>+													<attribute name="done">+														<ref name="Boolean"/>+													</attribute>+												</optional>+												<zeroOrMore>+													<element name="feature">+														<attribute name="key">+															<choice>+																<value>analyze</value>+																<value>colors</value>+																<value>debug</value>+																<value>draw</value>+																<value>egt</value>+																<value>exclude</value>+																<value>highlight</value>+																<value>ics</value>+																<value>memory</value>+																<value>myname</value>+																<value>name</value>+																<value>nps</value>+																<value>pause</value>+																<value>ping</value>+																<value>playother</value>+																<value>reuse</value>+																<value>san</value>+																<value>setboard</value>+																<value>setscore</value>+																<value>sigint</value>+																<value>sigterm</value>+																<value>smp</value>+																<value>time</value>+																<value>usermove</value>+																<value>variants</value>+															</choice>+														</attribute><attribute name="value">+															<data type="string">+																<param name="pattern">[^"]*</param>+															</data>+														</attribute>+													</element>+												</zeroOrMore>+											</element>	<!-- cecpFeatures -->+										</optional>+									</element>	<!-- cecpOptions -->+								</choice>+							</optional>+						</element>	<!-- uiOptions -->+					</optional>+				</element>	<!-- ioOptions -->+			</optional>+		</element>	<!-- options -->+	</start>+	<define name="Boolean">+		<choice>+			<value>False</value>+			<value>True</value>+		</choice>+	</define><define name="ClosedUnitInterval">+		<data type="decimal">+			<param name="minInclusive">0</param>+			<param name="maxInclusive">1</param>+		</data>+	</define><define name="PieceSquareTable">+		<optional>+			<attribute name="reflectOnY">+				<ref name="Boolean"/>+			</attribute>+		</optional>+		<oneOrMore>+			<element name="byRank">+				<ref name="Rank"/>+				<attribute name="byCoordinates">+					<list>+						<oneOrMore>+							<ref name="ClosedUnitInterval"/>+						</oneOrMore>+					</list>+				</attribute>+			</element>+		</oneOrMore>+	</define><define name="Rank">+		<attribute name="rank">+			<choice>+				<value>p</value>+				<value>r</value>+				<value>n</value>+				<value>b</value>+				<value>q</value>+				<value>k</value>+			</choice>+		</attribute>+	</define><define name="ScreenCoordinates">+		<attribute name="nRows">+			<data type="nonNegativeInteger"/>+		</attribute><attribute name="nColumns">+			<data type="nonNegativeInteger"/>+		</attribute>+	</define>+</grammar>+
@@ -0,0 +1,11 @@+Author:+	Dr. Alistair Ward <bishbosh@functionalley.eu>.++Copyright:+	Copyright (C) 2018 Dr. Alistair Ward. All Rights Reserved.++Home-page:+	http://functionalley.eu++License:+	GNU GENERAL PUBLIC LICENSE Version 3; see '/usr/share/common-licenses/GPL-3' or '/usr/share/doc/licenses/gpl-3.0.txt' where available, or the local packaged file 'LICENSE'.
+ man/man1/bishbosh.1 view
@@ -0,0 +1,182 @@+\" AUTHOR: Dr. Alistair Ward+\" Copyright (C) 2018 Dr. Alistair Ward+\"+\" This file is part of BishBosh.+\" +\" BishBosh 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 3 of the License, or+\" (at your option) any later version.+\" +\" BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.++.TH bishbosh 1+.SH NAME+\fBbishbosh\fR - Plays Chess+.SH SYNOPSIS+\fBbishbosh\fR [\fIOPTIONS\fR]+.SH DESCRIPTION+.PP+A chess-game which can be rendered natively in a terminal (emulator) using raw ASCII, or used as a chess-engine by a separate GUI (\fBxboard\fR).+.PP+It permits:+.IP \(bu+Castling+.IP \(bu+En-passant+.IP \(bu+Resignation+.IP \(bu+Draw by \fIStale-mate\fR, the \fISeventy-five move rule\fR, \fIFive-fold Repetition\fR, or \fIInsufficient Material\fR.+.PP+It features:+.IP \(bu+Unlimited roll-back of moves.+.IP \(bu+Comprehension of a variety of \fBhttps://en.wikipedia.org/wiki/Chess_notation\fRs.+.IP \(bu+The ability to read PGN-databases of standard openings & archived games,+in which it can match both \fBhttps://chessprogramming.wikispaces.com/Transposition\fRs & colour-flipped (\fBhttps://chessprogramming.wikispaces.com/Color+Flipping\fR) positions.+.IP \(bu+Automation of the moves for either, neither, or both players.+Both the evaluation of moves & the search for the optimum, are highly configurable; see \fBsection-5\fR of the man-pages.+.IP \(bu+Optional hints for manual players.+.IP \(bu+\fBhttps://chessprogramming.wikispaces.com/Pondering\fR.+.SS Implementation+Some understanding of the algorithm used to automatically select moves, is useful either when configuring this application or when interpreting the esoteric feedback available after move-selection (given "\fB--verbosity=Deafening\fR").+The algorithm first compares the position with those in the referenced PGN-databases; a looser criterion than whether a matching move-sequence exists.+It then partitions all matching archived positions, based on whether the current side was ultimately victorious.+The next move will be selected randomly from the subset of victorious matching positions, in preference to the non-victorious subset.+.PP+On failure to match the position with an archived game, the tree of all possible moves until the end of the game, is constructed & statically sorted to advance the subsequent evaluation of capture-moves,+using either \fBhttps://chessprogramming.wikispaces.com/MVV-LVA\fR or \fBhttps://chessprogramming.wikispaces.com/Static+Exchange+Evaluation\fR.+On each move, this tree's non-capture moves are dynamically sorted using the \fBhttps://chessprogramming.wikispaces.com/Killer+Heuristic\fR & the \fBhttps://chessprogramming.wikispaces.com/History+Heuristic\fR.+This tree is then searched using a \fBhttps://chessprogramming.wikispaces.com/Negamax\fR algorithm with \fBhttp://chessprogramming.wikispaces.com/Alpha-Beta\fR pruning,+over a constant configurable number of plies, to find the optimal move according to the weighted-mean of various criteria described in \fBsection-5\fR of the man-pages.+Shortcuts in the search for the optimal move are taken on encountering either \fBhttps://chessprogramming.wikispaces.com/Repetitions\fR in the move-sequence or \fBhttps://chessprogramming.wikispaces.com/Transposition\fRs of sibling games.+.SH OPTIONS+.SS "Input"+.TP+\fB-i\fR \fIFile-path\fR, \fB--inputConfigFilePath=\fR\fIFile-path\fR; there is no default.+Read the mandatory configuration from the specified XML-file,+.SS "Execution"+.TP+\fB-r\fR[\fIInt\fR], \fB--randomSeed\fR[\fB=\fR\fIInt\fR]+Optionally takes an argument with which to seed the single pseudo-random number-generator used for all random operations.+See "\fBrandomSeed\fR" in \fBsection-5\fR of the man-pages.+.br+In the absence of the whole field, the random-number generator will be seeded unpredictably from the operating-system.+In the absence of just the argument, "\fB0\fR" will be inferred.+.br+N.B.: this application only makes significant use of the random-generator when selecting a move from any configured PGN-databases (see "\fBpgnOptions\fR" in \fBsection-5\fR of the man-pages); automated move-selection is deterministic.+.SS "Output"+.TP+\fB--verbosity=\fR(\fBSilent\fR|\fBNormal\fR|\fBVerbose\fR|\fBDeafening\fR), defaulting to "\fBNormal\fR".+Defines the quantity of ancillary output required. See "\fBverbosity\fR" in \fBsection-5\fR of the man-pages.+.TP+\fB--printMoveTree\fR=\fI<Int>\fR+Print the tree of all possible moves in the game, truncated to the specified depth; see \fBsection-5\fR of the man-pages for details.+.SS "Generic Program-information"+.TP+\fB-v\fR, \fB--version\fR+Outputs version-information & then exits.+.TP+\fB-?\fR, \fB--help\fR+Displays a usage-message & then exits.+.SH RUNTIME+.SS Command-line Interpreter+This application understands a simple command-language, consisting of:+.IP \(bu+a move specified in the configured notation.+.IP \(bu+a '\fB?\fR', to generate a usage-message.+.IP \(bu+a case-insensitive command (which one may abbreviate), prefixed by a '\fB:\fR'.+The available commands are:+.TS+lb	lb	lb+l	l	l+lb	li	.+Command	Arguments	Description+=======	=========	===========+:hint		Request a move-suggestion.+:print	object	Print the value of one of "\fBboard\fR", "\fBconfiguration\fR", "\fBFEN\fR", "\fBgame\fR", "\fBhelp\fR", "\fBmoves\fR", "\fBPGN\fR".+:quit		Exit the application. The current game-state will be saved, provided \fBpersistence\fR (see "\fBpgnOptions\fR" in \fBsection-5\fR of the man-pages) hasn't been disabled.+:resign		Resign the game.+:restart		Start a new game.+:rollBack	[Int]	Roll-back the optionally specified number of plies (half moves), defaulting to "\fB2\fR" when there's one manual player & "\fB1\fR" when both players are manual.+:save		Save the current game-state in "\fB~/.bishbosh\fR"; this is automatic unless explicitly un-configured.+:set	\fBsearchDepth\fR \fIInt\fR	Mutate the value of "\fBsearchDepth\fR", (see "\fBsearchOptions\fR" in \fBsection-5\fR of the man-pages).+:swap		Swap sides. If the moves of one side were automated, then this will cause automation of the moves of the other side.+.TE+.SS Hardware-requirements.+.IP \(bu+This application benefits from the availability of multiple cores (see the "\fB+RTS -N\fR" option).+.IP \(bu+If one references large PGN-databases from the configuration (see "\fBpgnOptions\fR" in \fBsection-5\fR of the man-pages), or configures a large "\fBsearchDepth\fR" (see "\fBsearchOptions\fR" in \fBsection-5\fR of the man-pages), then correspondingly large amounts of RAM will be required.+.SH EXIT-STATUS+\fB0\fR on success, & >\fB0\fR if an error occurs.+.SH EXAMPLES+.nf+.B bishbosh --verbosity=Verbose -i '/usr/share/bishbosh/config/Raw/bishbosh_white.xml'+.fi+.IP \(bu+The application has been instructed to provide a relatively large amount of feedback.+.IP \(bu+One of the packaged configuration-files has been referenced (you'll need to adjust this if run from the build-directory), which automates White's moves & specifies a raw ASCII interface.+.PP+.nf+.B bishbosh --verbosity=Deafening -i '/usr/share/bishbosh/config/Raw/bishbosh_black.xml' +RTS -N -H100M -RTS+.IP \(bu+The application has been instructed to provide maximal feedback.+.IP \(bu+One of the packaged configuration-files has been referenced, which automates Black's moves & also references some packaged PGN-databases.+.IP \(bu+For performance, the run-time system has been explicitly instructed to fully utilise the available CPU-cores to satisfy the massively parallel implementation, & to set a large minimum size for the heap to satisfy its craving for RAM; actually similar defaults have been predefined.+.PP+.nf+.B xboard -fcp 'bishbosh -i /usr/share/bishbosh/config/CECP/bishbosh_black.xml'+.IP \(bu+Instruct the \fBxboard\fR GUI to use \fBbishbosh\fR as its first engine.+.SH FILES+.TS+lb	lb+l	l+lb	l	.+File-name	Contents+=========	========+bishbosh.svg	A module-dependency graph for this application.+config/{CECP,Raw}/*.xml	Sample configuration-files.+man/man5/bishbosh.5	\fBSection-5\fR of the man-pages for this product, describing the configuration-file format.+pgn/*.pgn	Sample PGN-databases; \fBhttps://en.wikipedia.org/wiki/Portable_Game_Notation\fR.+~/.bishbosh/*.txt	Persisted games, stored in a user-specific directory.+https://www.gnu.org/software/xboard	A GUI for chess-engines.+.TE+.SH AUTHOR+Written by Dr. Alistair Ward.+.SH BUGS+.IP \(bu+The implementation of commands is synchronous.+.IP \(bu+The implementation of CECP is minimal.+.IP \(bu+Performance is uncompetitive with imperative implementions of similar algorithms.+.SS "REPORTING BUGS"+Report bugs to "\fBbishbosh@functionalley.eu\fR".+.SH COPYRIGHT+Copyright \(co 2018 Dr. Alistair Ward+.PP+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 3 of the License, or (at your option) any later version.+.PP+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.+.PP+You should have received a copy of the GNU General Public License along with this program. If not, see \fBhttp://www.gnu.org/licenses/\fR.+
+ man/man5/bishbosh.5 view
@@ -0,0 +1,261 @@+\" AUTHOR: Dr. Alistair Ward+\" Copyright (C) 2018 Dr. Alistair Ward+\"+\" This file is part of BishBosh.+\" +\" BishBosh 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 3 of the License, or+\" (at your option) any later version.+\" +\" BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.++.TH bishbosh 5+.SH DESCRIPTION+This man-page describes the configuration of the application; its invocation is described in \fBsection-1\fR of the man-pages.+.SH CONFIGURATION+Configuration is read from an XML-file referenced from the command-line.+The grammar of this file is defined in "\fBconfig/bishbosh.dtd\fR" or more precisely using \fBRELAX NG\fR in "\fBconfig/bishbosh.rng\fR", but the semantics of the more important fields are described below.+.SS Options+.IP \(bu+\fBmaximumPlies\fR \fIInt\fR: the optional maximum number of plies (half moves) before the game is terminated.+.IP \(bu+\fBrandomSeed\fR \fIInt\fR: optionally seed the pseudo-random number-generator to produce a repeatable game. See "\fB--randomSeed\fR" in \fBsection-1\fR of the man-pages.+.SS Evaluation-options+Each field governs automatic move-evaluation:+.TE+.IP \(bu+\fBincrementalEvaluation\fR \fIBool\fR; default \fBTrue\fR.+Whether to incrementally generate position-hashes & evaluate the piece-square value, from the previous values; otherwise these quantities are evaluated from scratch.+This option slightly reduces memory-requirement, but doesn't affect the result.+.IP \(bu+\fBrankValues\fR: defines the value within the closed unit interval "\fB[0, 1]\fR", of each type of piece, defaulting (ref. \fBhttps://chessprogramming.wikispaces.com/Point+Value\fR) to:+.TS+lb	lb+l	l+lb	l	.+Piece	Value+=====	=====+Rook	0.525+Knight	0.35+Bishop	0.35+Queen	1+King	\fIMoot, since it can't be taken.\fR+.TE+.IP \(bu+\fBcriteriaWeights\fR: the weights in the closed unit-interval "\fB[0,1]\fR", each associated with a criterion used to evaluate a move;+at the lower bound, the corresponding criterion is not even evaluated.+The criteria to which these weights correspond, are:+.TS+lb	lb	lb	lb+l	l	l	l+lb	l	lb	l	.+Criterion	Metric	Ref	Notes+=========	======	===	=====+material	Quantifies the value of the pieces remaining per side.	https://chessprogramming.wikispaces.com/Material	This is dependent on the value of each type of piece; see "\fBrankValues\fR".+mobility	The difference between the number of moves available per side.	https://chessprogramming.wikispaces.com/Mobility	Actually the reciprocal is measured, to emphasis the reduction caused by checking one's opponent.+pieceSquareValue	Quantifies the position held by the pieces per side.	https://chessprogramming.wikispaces.com/Piece-Square+Tables	This metric includes aspects of both "\fBmaterial\fR" & "\fBmobility\fR". The value can be made linearly dependent on progress through the game.+castlingPotential	Whether each player has been permanently prevented from castling.		Reflects the disadvantage of moving one's King, thus preventing subsequent castling.+defence	The difference between the number of pieces defending one's own, per side.		There's neither any penalty for gaps in this defence nor account made of the value of the defended piece; it's just the total number of defenders.+doubledPawns	The difference between the total number of doubled Pawns per side.	https://chessprogramming.wikispaces.com/Doubled+Pawn	Reflects the reduced mobility of such Pawns.+isolatedPawns	The difference between the total number of isolated Pawns per side.	https://chessprogramming.wikispaces.com/Isolated+Pawn	Reflects the lack of defence from adjacent Pawns.+passedPawns	The difference between the total number of passed Pawns per side.	https://chessprogramming.wikispaces.com/Passed+Pawn	Reflects improved promotion-prospects.+.TE+.IP+Other criteria could be measured, but orthogonality is problematic.+One could reasonably argue that most of these criteria are ultimately reflected in "\fBmaterial\fR",+but often they quantify some strategic advantage which manifests further into the future than it is feasible to predict the likely exchange of pieces.+.br+N.B.: "\fBdefence\fR" & the three Pawn-related criteria typically can't justify their existence; even if one ignores the time required to calculate them, their value is dubious.+This is the nub of the esoteric choice of whether to accurately quantify each board, or to accept a vague quantification in order to explore deeper in the same time.+.IP \(bu+\fBpieceSquareTables\fR: defines the value within the closed unit interval "\fB[0, 1]\fR", of each type of piece occupying every square.+.br+N.B.: the values defined for a Pawn occupying any square in the first or last rank, are irrelevant.+.br+Values are defined for just the White pieces, which are then used to generate by reflection, those for the Black pieces.+.br+Values are optionally defined for just the left-hand side of the board, which are then used to generate by reflection, the right-hand side.+.br+For each type of piece, the values are defined in a SAN-coordinate-order list, rastering over the board from left to right, bottom to top; "\fIa1 b1 c1 d1 a2 b2 c3 ... c7 d8\fR".+.br+For each type of piece, an alternative definition may be provided for use during the end-game, to account for the different criteria relevant to that phase of the game.+Under such circumstances, the two piece-square tables for that type of piece will be interpolated between, according to the number of pieces remaining (which is used to measure progress towards the end-game).+The packaged configuration-files define modified tables for both Pawn & King.+.SS Search-options+.IP \(bu+\fBpreferMovesTowardsCentre\fR: whether to sort moves on the magnitude of the progress towards the centre of the board.+.IP \(bu+\fBsortOnStandardOpeningMoveFrequency\fR: whether to sort moves on the frequency with which they occur in referenced standard openings.+This is performed after \fBpreferMovesTowardsCentre\fR,+but since the sort-algorithms are stable, i.e. they don't affect the order of those moves which compare equal, they can usefully be sequentially applied.+.IP \(bu+\fBcaptureMoveSortAlgorithm\fR: the optional algorithm by which to partition & sort capture-moves for preferential evaluation when searching for the optimum amongst available moves.+If unspecified, the order of capture-moves will remain unaltered both wrt each other & wrt other moves.+.br+Neither of these sort-algorithms affects the relative order of non-capture moves; cf. \fBpreferMovesTowardsCentre\fR & \fBsortOnStandardOpeningMoveFrequency\fR.+This is performed after \fBsortOnStandardOpeningMoveFrequency\fR.+.TS+lb	lb+l	l+lb	l	.+Value	Meaning+=====	=======+MVVLVA	moves are advanced depending on the value of rank of the piece they capture, but where this is equal, those which achieve this using a less valuable piece are preferred. This is highly effective.+SEE	moves are advanced depending on the net material gain resulting from any battle at the destination. This is not currently competitive.+.TE+.IP \(bu+\fBminimumHammingDistance\fR \fIInt\fR: the optional positive lower bound on the Hamming-distance between any of the random numbers used to generate Zobrist hashes from positions.+.br+CAVEAT: Linear independence of the bit-vectors is a better measure than Hamming distance, of the quality of the selected random numbers.+.IP \(bu+\fBretireKillerMovesAfter\fR \fIInt\fR: the optional non-negative number of full moves (one by each player) after which killer-moves are retired.+If unspecified, killer-moves won't even be recorded.+.br+N.B.: this is highly effective up to about \fB3\fR, beyond which returns diminish.+.br+Killer-moves can be used to reorder the evaluation of moves, based on whether similar moves triggered beta-cutoff in sibling games.+.IP \(bu+\fBtrapRepeatedPositions\fR: whether to short-circuit the fitness-evaluation of \fIposition\fRs which have been visited before in the current game.+These situations result from loops of reversible moves, in the tree of moves which defines the game of chess.+The fitness of such \fIposition\fRs can be derived by induction, since were one to search from this \fIposition\fR,+one would ultimately arrive back another time, so the fitness of this future \fIposition\fR equals the current fitness.+.br+N.B.: this doesn't typically improve performance in either space or time.+.IP \(bu+\fBusePondering\fR: whether an automated player should plan their next move, based on a prediction of the opponent's response, & thus make use their opponent's thinking-time.+.IP \(bu+\fBtranspositions\fR: these can be used to reorder the evaluation of moves,+based on the results previously found for identical \fIposition\fRs in sibling games reached by an alternative sequence of arbitrary moves.+.TS+lb	lb	lb+l	l	l+lb	l	l	.+Value	Type	Meaning+=====	====	=======+retireTranspositionsAfter	\fIInt\fR	the non-negative number of full moves (one by each player) after which transpositions are retired. N.B.: this is highly effective at about \fB1\fR, beyond which returns diminish.+minimumTranspositionSearchDepth	\fIInt\fR	the search-depth beneath which transpositions are not recorded. When the remaining search-depth is low, the potential gain from finding a recorded transposition of the current position, doesn't justify the effort. N.B.: this is most effective at about \fB2\fR.+.TE+.IP \(bu+.B standardOpeningOptions+.TS+lb	lb	lb	lb+l	l	l	l+lb	l	lb	l	.+Field	Type	Default	Meaning+=========	====	=======	=======+tryToMatchMoves	Bool	True	whether to attempt to exactly match the moves already made with a standard opening; i.e. without matching transpositions.+tryToMatchViaJoiningMove	Bool	True	whether to attempt to join the current position (irrespective of the means by which it was achieved) to a standard opening that's only one ply away.+tryToMatchColourFlippedPosition	Bool	True	whether to attempt to match a colour-flipped version of the current position with a standard opening.+.TE+.IP \(bu+\fBsearchDepth\fR \fIInt\fR, defaulting to "\fB4\fR" (minimum "\fB1\fR"): the number of plies (half moves) to search ahead, when selecting the next move.+This is defined for each of zero, one or two logical colours, corresponding to the players;+it is the absence of any specification, from which the application infers manual move-selection.+This value can be changed dynamically, see "\fBset searchDepth\fR" in \fBsection-1\fR of the man-pages.+.br+CAVEAT: the space & time complexity of the application are exponentially related to this quantity.+.SS IO-options+The application defines a set of "\fBioOptions\fR", in which one can define:+.IP \(bu+\fBmaximumPGNNames\fR \fIInt\fR: the optional maximum number of names, with which to annotate moves matching games from the configured PGN-databases.+.IP \(bu+\fBpgnOptions\fR: these options allow one to reference PGN-databases, which the application can leverage during move-selection.+.TS+lb	lb	lb	lb+l	l	l	l+lb	l	lb	l	.+Field	Type	Default	Meaning+=========	====	=======	=======+databaseFilePath	\fIFile-path\fR		The path in the local file-system, to a PGN-database.+minimumPlies	\fIInt\fR	1	The minimum number of half moves, for an archived game to be considered valuable.+isStrictlySequential	(\fBTrue\fR|\fBFalse\fR)	True	Whether the recorded move-numbers are accurate.+validateMoves	(\fBTrue\fR|\fBFalse\fR)	False	Whether to validate all the moves. In the absence of validation, PGN-databases can be read faster, but the consequence of reading invalid moves is unpredictable. This option is required to read games which continued after a draw can be inferred.+identificationTags	String		The PGN-field(s) from which to construct a composite identifier for a game.+.TE+.IP \(bu+\fBpersistence\fR: these options govern how the application persists its state, so that a game may span multiple sessions.+.TS+lb	lb	lb	lb+l	l	l	l+lb	l	lb	l	.+Field	Type	Default	Meaning+=========	====	=======	=======+filePath	\fIFile-path\fR		The local file in which game-state will be persisted.+automatic	(\fBTrue\fR|\fBFalse\fR)	True	Whether the game-state is automatically saved.+.TE+.P+"\fBioOptions\fR" has a sub-section "\fBuiOptions\fR", which defines the user-interface.+.IP \(bu+\fBmoveNotation\fR (\fBCoordinate\fR|\fBICCFNumeric\fR|\fBSmith\fR), defaulting to "\fBSmith\fR": the expected syntax used to define a move.+This application also understands \fBStandard Algebraic\fR notation, but it is only used to read the PGN-databases used to define standard openings.+.IP \(bu+\fBprintMoveTree\fR \fIInt\fR.+Print the tree of all possible moves in the game, truncated to the specified depth.+The forest of moves available at each node, is sequentially sorted according to; \fBpreferMovesTowardsCentre\fR, \fBsortOnStandardOpeningMoveFrequency\fR, \fBcaptureMoveSortAlgorithm\fR; since the sort-algorithm is stable, the relative order of moves which compare equal, remains unchanged.+The fitness of each move, from the perspective of the player of the move, is also printed to the configured number of decimal places; see \fBnDecimalDigits\fR.+See "\fB--printMoveTree\fR" in \fBsection-1\fR of the man-pages.+.IP \(bu+\fBnDecimalDigits\fR \fIInt\fR, defaulting to "\fB3\fR".+Defines the precision with which fractional ancillary data is displayed.+.IP \(bu+\fBverbosity\fR (\fBSilent\fR|\fBNormal\fR|\fBVerbose\fR|\fBDeafening\fR), defaulting to "\fBNormal\fR": +Defines the quantity of ancillary output required. See "\fB--verbosity\fR" in \fBsection-1\fR on the man-pages.+.IP \(bu+\fBboardMagnification\fR: the size-multiplier used when rendering the board.+.TS+lb	lb	lb+l	l	l+lb	l	l	.+Field	Type	Meaning+=========	=======	=======+nRows	\fIInt\fR	The vertical magnification of the board-image.+nColumns	\fIInt\fR	The horizontal magnification of the board-image.+.TE+.IP \(bu+\fBcolourScheme\fR: defines the physical colour of each component of the display.+.TS+lb	lb+l	l+lb	l	.+Field	Options+=========	=======+axisLabelColour	(\fBBlack\fR|\fBRed\fR|\fBGreen\fR|\fBYellow\fR|\fBBlue\fR|\fBMagenta\fR|\fBCyan\fR|\fBWhite\fR)+darkPieceColour	(\fBBlack\fR|\fBRed\fR|\fBGreen\fR|\fBBlue\fR|\fBMagenta\fR|\fBCyan\fR)+lightPieceColour	(\fBRed\fR|\fBGreen\fR|\fBYellow\fR|\fBMagenta\fR|\fBCyan\fR|\fBWhite\fR)+darkSquareColour	(\fBBlack\fR|\fBRed\fR|\fBGreen\fR|\fBBlue\fR|\fBMagenta\fR|\fBCyan\fR)+lightSquareColour	(\fBRed\fR|\fBGreen\fR|\fBYellow\fR|\fBMagenta\fR|\fBCyan\fR|\fBWhite\fR)+menuLabelColour	(\fBBlack\fR|\fBRed\fR|\fBGreen\fR|\fBYellow\fR|\fBBlue\fR|\fBMagenta\fR|\fBCyan\fR|\fBWhite\fR)+menuBackgroundColour	(\fBBlack\fR|\fBRed\fR|\fBGreen\fR|\fBYellow\fR|\fBBlue\fR|\fBMagenta\fR|\fBCyan\fR|\fBWhite\fR)+.TE+.SH FILES+.TS+lb	lb+l	l+lb	l	.+File-name	Contents+=========	========+config/bishbosh.dtd	A basic formal description of the XML-format for the configuration-file.+config/bishbosh.rng	A more sophisticated, but slower, \fBRELAX NG\fR definition of the XML-format for the configuration-file.+config/{CECP,Raw}/*.xml	Sample configuration-files.+man/man1/bishbosh.1	Section-1 of the man-pages for this product, describing the command-line.+pgn/*.pgn	Standard openings & archived games, as described in \fBhttps://en.wikipedia.org/wiki/Portable_Game_Notation\fR.+https://www.oasis-open.org/committees/relax-ng/tutorial-20011203.html	A \fBRELAX NG\fR tutorial.+.TE+.SH AUTHOR+Written by Dr. Alistair Ward.+.SH COPYRIGHT+Copyright \(co 2018 Dr. Alistair Ward+.PP+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 3 of the License, or (at your option) any later version.+.PP+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.+.PP+You should have received a copy of the GNU General Public License along with this program. If not, see \fBhttp://www.gnu.org/licenses/\fR.+
+ pgn/bundesliga2000.pgn view

file too large to diff

+ pgn/ficsgamesdb_201601_standard2000_nomovetimes_1403205.pgn view

file too large to diff

+ pgn/scid.pgn view
@@ -0,0 +1,51809 @@+{+	Converted from 'scid.eco'.++	Copyright (C) 1999-2003 Shane Hudson (sgh@users.sourceforge.net)+	Created: June 1999.+	Last update: January 2011.+	Scid website: http://scid.sourceforge.net/+}++[ECO "A00a"]+[Variation "Start position"]+[Result "*"]+*++[ECO "A00b"]+[Variation "Barnes Opening"]+[Result "*"]+1.f3 *++[ECO "A00b"]+[Variation "Fried fox"]+[Result "*"]+1.f3 e5 2.Kf2 *++[ECO "A00c"]+[Variation "Kadas Opening"]+[Result "*"]+1.h4 *++[ECO "A00d"]+[Variation "Clemenz Opening"]+[Result "*"]+1.h3 *++[ECO "A00e"]+[Variation "Ware Opening"]+[Result "*"]+1.a4 *++[ECO "A00f"]+[Variation "Anderssen Opening"]+[Result "*"]+1.a3 *++[ECO "A00f"]+[Variation "Creepy Crawly Opening (Basman)"]+[Result "*"]+1.a3 e5 2.h3 d5 *++[ECO "A00g"]+[Variation "Amar/Paris Opening"]+[Result "*"]+1.Nh3 *++[ECO "A00g"]+[Variation "Amar: Paris Gambit"]+[Result "*"]+1.Nh3 d5 2.g3 e5 3.f4 *++[ECO "A00h"]+[Variation "Durkin"]+[Result "*"]+1.Na3 *++[ECO "A00i"]+[Variation "Saragossa"]+[Result "*"]+1.c3 *++[ECO "A00j"]+[Variation "Mieses"]+[Result "*"]+1.d3 *++[ECO "A00j"]+[Variation "Mieses: 1...e5"]+[Result "*"]+1.d3 e5 *++[ECO "A00j"]+[Variation "Mieses: 1...d5"]+[Result "*"]+1.d3 d5 *++[ECO "A00j"]+[Variation "Spike Deferred"]+[Result "*"]+1.d3 g6 2.g4 *++[ECO "A00k"]+[Variation "Van Kruijs"]+[Result "*"]+1.e3 *++[ECO "A00l"]+[Variation "Van Geet (Dunst) Opening"]+[Result "*"]+1.Nc3 *++[ECO "A00l"]+[Variation "Van Geet: 1...Nf6"]+[Result "*"]+1.Nc3 Nf6 *++[ECO "A00l"]+[Variation "Van Geet: 1...Nf6 2.Nf3"]+[Result "*"]+1.Nc3 Nf6 2.Nf3 *++[ECO "A00l"]+[Variation "Van Geet: Tuebingen Gambit"]+[Result "*"]+1.Nc3 Nf6 2.g4 *++[ECO "A00l"]+[Variation "Van Geet: 1...e5"]+[Result "*"]+1.Nc3 e5 *++[ECO "A00l"]+[Variation "Van Geet: 1...e5 2.Nf3"]+[Result "*"]+1.Nc3 e5 2.Nf3 *++[ECO "A00l"]+[Variation "Van Geet: Sicilian Variation"]+[Result "*"]+1.Nc3 c5 *++[ECO "A00l"]+[Variation "Van Geet: Sicilian Variation, 2.Nf3"]+[Result "*"]+1.Nc3 c5 2.Nf3 *++[ECO "A00l"]+[Variation "Van Geet: Sicilian Variation, 2.Nf3 Nc6"]+[Result "*"]+1.Nc3 c5 2.Nf3 Nc6 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5"]+[Result "*"]+1.Nc3 d5 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5 2.Nf3"]+[Result "*"]+1.Nc3 d5 2.Nf3 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5 2.Nf3 Nf6"]+[Result "*"]+1.Nc3 d5 2.Nf3 Nf6 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5 2.e4"]+[Result "*"]+1.Nc3 d5 2.e4 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5 2.e4 d4"]+[Result "*"]+1.Nc3 d5 2.e4 d4 *++[ECO "A00m"]+[Variation "Van Geet: 1...d5 2.e4 dxe4"]+[Result "*"]+1.Nc3 d5 2.e4 dxe4 *++[ECO "A00m"]+[Variation "Van Geet: Hector Gambit"]+[Result "*"]+1.Nc3 d5 2.e4 dxe4 3.Bc4 *++[ECO "A00n"]+[Variation "Grob"]+[Result "*"]+1.g4 *++[ECO "A00n"]+[Variation "Grob: Alessi Gambit"]+[Result "*"]+1.g4 f5 *++[ECO "A00n"]+[Variation "Grob: Double Grob"]+[Result "*"]+1.g4 g5 *++[ECO "A00n"]+[Variation "Grob: 1...e5"]+[Result "*"]+1.g4 e5 *++[ECO "A00o"]+[Variation "Grob: 1...d5"]+[Result "*"]+1.g4 d5 *++[ECO "A00o"]+[Variation "Grob Gambit"]+[Result "*"]+1.g4 d5 2.Bg2 *++[ECO "A00o"]+[Variation "Grob Gambit: e5"]+[Result "*"]+1.g4 d5 2.Bg2 e5 *++[ECO "A00o"]+[Variation "Grob Gambit: Hurst Attack"]+[Result "*"]+1.g4 d5 2.Bg2 e5 3.c4 *++[ECO "A00o"]+[Variation "Grob Gambit: 2...c6"]+[Result "*"]+1.g4 d5 2.Bg2 c6 *++[ECO "A00o"]+[Variation "Grob Gambit: Spike Attack"]+[Result "*"]+1.g4 d5 2.Bg2 c6 3.g5 *++[ECO "A00o"]+[Variation "Grob Gambit Accepted"]+[Result "*"]+1.g4 d5 2.Bg2 Bxg4 *++[ECO "A00o"]+[Variation "Grob Gambit Accepted: Fritz Gambit"]+[Result "*"]+1.g4 d5 2.Bg2 Bxg4 3.c4 *++[ECO "A00p"]+[Variation "Polish (Sokolsky; Orang-Utan)"]+[Result "*"]+1.b4 *++[ECO "A00p"]+[Variation "Polish: Birmingham Gambit"]+[Result "*"]+1.b4 c5 *++[ECO "A00p"]+[Variation "Polish: 1...Nf6"]+[Result "*"]+1.b4 Nf6 *++[ECO "A00p"]+[Variation "Polish: 1...Nf6 2.Bb2"]+[Result "*"]+1.b4 Nf6 2.Bb2 *++[ECO "A00p"]+[Variation "Polish: 1...Nf6 2.Bb2 e6"]+[Result "*"]+1.b4 Nf6 2.Bb2 e6 *++[ECO "A00p"]+[Variation "Polish: 1...c6"]+[Result "*"]+1.b4 c6 *++[ECO "A00p"]+[Variation "Polish: Schuehler Gambit"]+[Result "*"]+1.b4 c6 2.Bb2 a5 3.b5 *++[ECO "A00q"]+[Variation "Polish: 1...d5"]+[Result "*"]+1.b4 d5 *++[ECO "A00q"]+[Variation "Polish: 1...d5 2.Bb2"]+[Result "*"]+1.b4 d5 2.Bb2 *++[ECO "A00q"]+[Variation "Polish: 1...d5 2.Bb2 Bf5"]+[Result "*"]+1.b4 d5 2.Bb2 Bf5 *++[ECO "A00q"]+[Variation "Polish: 1...d5 2.Bb2 Nf6"]+[Result "*"]+1.b4 d5 2.Bb2 Nf6 *++[ECO "A00q"]+[Variation "Polish: 1...d5 2.Bb2 Nf6 3.e3"]+[Result "*"]+1.b4 d5 2.Bb2 Nf6 3.e3 *++[ECO "A00r"]+[Variation "Polish: 1...e5"]+[Result "*"]+1.b4 e5 *++[ECO "A00r"]+[Variation "Polish: Bugayev Attack"]+[Result "*"]+1.b4 e5 2.a3 *++[ECO "A00r"]+[Variation "Polish: 1...e5 2.Bb2"]+[Result "*"]+1.b4 e5 2.Bb2 *++[ECO "A00r"]+[Variation "Polish: Wolfertz Gambit"]+[Result "*"]+1.b4 e5 2.Bb2 c5 *++[ECO "A00r"]+[Variation "Polish: 1...e5 2.Bb2 f6"]+[Result "*"]+1.b4 e5 2.Bb2 f6 *++[ECO "A00r"]+[Variation "Polish: Tartakower Gambit"]+[Result "*"]+1.b4 e5 2.Bb2 f6 3.e4 Bxb4 *++[ECO "A00r"]+[Variation "Polish: 1...e5 2.Bb2 d6"]+[Result "*"]+1.b4 e5 2.Bb2 d6 *++[ECO "A00s"]+[Variation "Polish: 2...Bxb4"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 *++[ECO "A00s"]+[Variation "Polish: 2...Bxb4 3.Bxe5"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 3.Bxe5 *++[ECO "A00s"]+[Variation "Polish: 2...Bxb4 3.Bxe5 Nf6"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 3.Bxe5 Nf6 *++[ECO "A00s"]+[Variation "Polish: 2...Bxb4 3.Bxe5 Nf6 4.c4"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 3.Bxe5 Nf6 4.c4 *++[ECO "A00s"]+[Variation "Polish: 2...Bxb4 3.Bxe5 Nf6 4.Nf3"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 3.Bxe5 Nf6 4.Nf3 *++[ECO "A00t"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 *++[ECO "A00t"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 Nf6 *++[ECO "A00t"]+[Variation "Benko Opening: Symmetrical"]+[Result "*"]+1.g3 g6 *++[ECO "A00u"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 e5 *++[ECO "A00v"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 d5 *++[ECO "A00v"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 d5 2.Bg2 *++[ECO "A00v"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 d5 2.Bg2 c6 *++[ECO "A00v"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 d5 2.Bg2 e5 *++[ECO "A00v"]+[Variation "Benko Opening"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen Attack"]+[Result "*"]+1.b3 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Polish Variation"]+[Result "*"]+1.b3 b5 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Symmetrical"]+[Result "*"]+1.b3 b6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Dutch Variation"]+[Result "*"]+1.b3 f5 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Ringelbach Gambit"]+[Result "*"]+1.b3 f5 2.Bb2 e6 3.e4 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: English Variation"]+[Result "*"]+1.b3 c5 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Indian Variation"]+[Result "*"]+1.b3 Nf6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Indian Variation"]+[Result "*"]+1.b3 Nf6 2.Bb2 g6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Spike Variation"]+[Result "*"]+1.b3 Nf6 2.Bb2 g6 3.g4 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...d5"]+[Result "*"]+1.b3 d5 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...d5 2.Bb2"]+[Result "*"]+1.b3 d5 2.Bb2 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...e5"]+[Result "*"]+1.b3 e5 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...e5 2.Bb2"]+[Result "*"]+1.b3 e5 2.Bb2 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...e5 2.Bb2 d6"]+[Result "*"]+1.b3 e5 2.Bb2 d6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...e5 2.Bb2 Nc6"]+[Result "*"]+1.b3 e5 2.Bb2 Nc6 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: Paschmann Gambit"]+[Result "*"]+1.b3 e5 2.Bb2 Nc6 3.f4 *++[ECO "A01"]+[Variation "Nimzowitsch-Larsen: 1...e5 2.Bb2 Nc6 3.e3"]+[Result "*"]+1.b3 e5 2.Bb2 Nc6 3.e3 *++[ECO "A02"]+[Variation "Bird"]+[Result "*"]+1.f4 *++[ECO "A02"]+[Variation "Bird: Hobbs Gambit"]+[Result "*"]+1.f4 g5 *++[ECO "A02"]+[Variation "Bird: Symmetrical"]+[Result "*"]+1.f4 f5 *++[ECO "A02"]+[Variation "Bird: Swiss Gambit"]+[Result "*"]+1.f4 f5 2.e4 *++[ECO "A02"]+[Variation "Bird: Swiss Gambit"]+[Result "*"]+1.f4 f5 2.e4 fxe4 3.Nc3 Nf6 4.g4 *++[ECO "A02"]+[Variation "Bird: 1..d6"]+[Result "*"]+1.f4 d6 *++[ECO "A02"]+[Variation "Bird: 1..g6"]+[Result "*"]+1.f4 g6 *++[ECO "A02"]+[Variation "Bird: 1..g6"]+[Result "*"]+1.f4 g6 2.Nf3 Bg7 3.e3 *++[ECO "A02"]+[Variation "Bird: 1..g6"]+[Result "*"]+1.f4 g6 2.Nf3 Bg7 3.g3 *++[ECO "A02"]+[Variation "Bird: 1..c5"]+[Result "*"]+1.f4 c5 *++[ECO "A02"]+[Variation "Bird: 1..c5 2.Nf3 Nc6"]+[Result "*"]+1.f4 c5 2.Nf3 Nc6 *++[ECO "A02"]+[Variation "Bird: From Gambit"]+[Result "*"]+1.f4 e5 *++[ECO "A02"]+[Variation "Bird: From Gambit Accepted"]+[Result "*"]+1.f4 e5 2.fxe5 *++[ECO "A02"]+[Variation "Bird: From Gambit, Schlecter"]+[Result "*"]+1.f4 e5 2.fxe5 Nc6 *++[ECO "A02"]+[Variation "Bird: From Gambit, 2...d6"]+[Result "*"]+1.f4 e5 2.fxe5 d6 *++[ECO "A02"]+[Variation "Bird: From Gambit, 3.exd6"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 *++[ECO "A02"]+[Variation "Bird: From Gambit, Langheld Gambit"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Nf6 *++[ECO "A02"]+[Variation "Bird: From Gambit, 3...Bxd6"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 *++[ECO "A02"]+[Variation "Bird: From Gambit, Lipke"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 Nh6 5.d4 *++[ECO "A02"]+[Variation "Bird: From Gambit, Lasker Variation"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 g5 *++[ECO "A02"]+[Variation "Bird: From Gambit, Lasker, 5.d4"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 g5 5.d4 *++[ECO "A02"]+[Variation "Bird: From Gambit, Lasker, Queenswap Line"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 g5 5.d4 g4 6.Ne5 Bxe5 7.dxe5 Qxd1+ *++[ECO "A02"]+[Variation "Bird: From Gambit, Lasker, 5.g3"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 g5 5.g3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6"]+[Result "*"]+1.f4 Nf6 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.g3"]+[Result "*"]+1.f4 Nf6 2.g3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.e3"]+[Result "*"]+1.f4 Nf6 2.e3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.b3"]+[Result "*"]+1.f4 Nf6 2.b3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3"]+[Result "*"]+1.f4 Nf6 2.Nf3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 d6"]+[Result "*"]+1.f4 Nf6 2.Nf3 d6 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 c5"]+[Result "*"]+1.f4 Nf6 2.Nf3 c5 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 g6"]+[Result "*"]+1.f4 Nf6 2.Nf3 g6 *++[ECO "A02"]+[Variation "Bird: Batavo Polish Attack"]+[Result "*"]+1.f4 Nf6 2.Nf3 g6 3.b4 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 g6 3.g3"]+[Result "*"]+1.f4 Nf6 2.Nf3 g6 3.g3 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 g6 3.g3"]+[Result "*"]+1.f4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A02"]+[Variation "Bird: 1..Nf6 2.Nf3 g6 3.g3"]+[Result "*"]+1.f4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 d6 *++[ECO "A03"]+[Variation "Bird: 1...d5"]+[Result "*"]+1.f4 d5 *++[ECO "A03"]+[Variation "Bird: Dudweiler Gambit"]+[Result "*"]+1.f4 d5 2.g4 *++[ECO "A03"]+[Variation "Bird: Sturm Gambit"]+[Result "*"]+1.f4 d5 2.c4 *++[ECO "A03"]+[Variation "Bird: Williams Gambit"]+[Result "*"]+1.f4 d5 2.e4 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.b3"]+[Result "*"]+1.f4 d5 2.b3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.b3"]+[Result "*"]+1.f4 d5 2.b3 Nf6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.b3"]+[Result "*"]+1.f4 d5 2.b3 Nf6 3.Bb2 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.g3"]+[Result "*"]+1.f4 d5 2.g3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.g3"]+[Result "*"]+1.f4 d5 2.g3 Nf6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.g3"]+[Result "*"]+1.f4 d5 2.g3 Nf6 3.Bg2 *++[ECO "A03"]+[Variation "Bird: Lasker Variation"]+[Result "*"]+1.f4 d5 2.e3 *++[ECO "A03"]+[Variation "Bird: Lasker Variation"]+[Result "*"]+1.f4 d5 2.e3 Nf6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3"]+[Result "*"]+1.f4 d5 2.Nf3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 c5"]+[Result "*"]+1.f4 d5 2.Nf3 c5 *++[ECO "A03"]+[Variation "Bird: Batavo Gambit"]+[Result "*"]+1.f4 d5 2.Nf3 c5 3.e4 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 c5 3.e3"]+[Result "*"]+1.f4 d5 2.Nf3 c5 3.e3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 g6"]+[Result "*"]+1.f4 d5 2.Nf3 g6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 g6 3.e3"]+[Result "*"]+1.f4 d5 2.Nf3 g6 3.e3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 g6 3.g3"]+[Result "*"]+1.f4 d5 2.Nf3 g6 3.g3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 g6 3.g3"]+[Result "*"]+1.f4 d5 2.Nf3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.b3"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.b3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 5.d3"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 5.O-O"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 5.O-O O-O"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O O-O *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 5.O-O O-O 6.d3"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O O-O 6.d3 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 6.d3 c6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O O-O 6.d3 c6 *++[ECO "A03"]+[Variation "Bird: 1...d5 2.Nf3 Nf6 3.g3 g6: 6.d3 c5"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O O-O 6.d3 c5 *++[ECO "A03"]+[Variation "Bird: Lasker Variation"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 *++[ECO "A03"]+[Variation "Bird: Lasker, 3...Bg4"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 Bg4 *++[ECO "A03"]+[Variation "Bird: Lasker, 3...e6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 e6 *++[ECO "A03"]+[Variation "Bird: Lasker, 3...c5"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 c5 *++[ECO "A03"]+[Variation "Bird: Lasker, 3...c5 4.b3"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 c5 4.b3 *++[ECO "A03"]+[Variation "Bird: Lasker, 3...g6"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 g6 *++[ECO "A04"]+[Variation "Reti"]+[Result "*"]+1.Nf3 *++[ECO "A04"]+[Variation "Reti: Herrstrom Gambit"]+[Result "*"]+1.Nf3 g5 *++[ECO "A04"]+[Variation "Reti: 1...b6"]+[Result "*"]+1.Nf3 b6 *++[ECO "A04"]+[Variation "Reti: 1...b5"]+[Result "*"]+1.Nf3 b5 *++[ECO "A04"]+[Variation "Reti: 1...Nc6"]+[Result "*"]+1.Nf3 Nc6 *++[ECO "A04"]+[Variation "Reti: 1...e6"]+[Result "*"]+1.Nf3 e6 *++[ECO "A04"]+[Variation "Reti: 1...e6"]+[Result "*"]+1.Nf3 e6 2.g3 *++[ECO "A04"]+[Variation "Reti: 1...g6"]+[Result "*"]+1.Nf3 g6 *++[ECO "A04"]+[Variation "Reti: 1...g6"]+[Result "*"]+1.Nf3 g6 2.g3 *++[ECO "A04"]+[Variation "Reti: 1...g6"]+[Result "*"]+1.Nf3 g6 2.g3 Bg7 *++[ECO "A04"]+[Variation "Reti: 1...g6"]+[Result "*"]+1.Nf3 g6 2.g3 Bg7 3.Bg2 *++[ECO "A04"]+[Variation "Reti: 1...f5"]+[Result "*"]+1.Nf3 f5 *++[ECO "A04"]+[Variation "Reti: 1...f5 2.d3"]+[Result "*"]+1.Nf3 f5 2.d3 *++[ECO "A04"]+[Variation "Reti: 1...f5 2.d3 Nf6"]+[Result "*"]+1.Nf3 f5 2.d3 Nf6 *++[ECO "A04"]+[Variation "Reti: Lisitsin Deferred"]+[Result "*"]+1.Nf3 f5 2.d3 Nf6 3.e4 *++[ECO "A04"]+[Variation "Reti: 1...f5 2.g3"]+[Result "*"]+1.Nf3 f5 2.g3 *++[ECO "A04"]+[Variation "Reti: Lisitsin"]+[Result "*"]+1.Nf3 f5 2.e4 *++[ECO "A04"]+[Variation "Reti: Lisitsin: 3.Ng5 Nf6"]+[Result "*"]+1.Nf3 f5 2.e4 fxe4 3.Ng5 Nf6 *++[ECO "A04"]+[Variation "Reti: Lisitsin: 3.Ng5 Nf6"]+[Result "*"]+1.Nf3 f5 2.e4 fxe4 3.Ng5 Nf6 4.d3 e5 *++[ECO "A04"]+[Variation "Reti: Lisitsin: 3.Ng5 Nf6"]+[Result "*"]+1.Nf3 f5 2.e4 fxe4 3.Ng5 Nf6 4.d3 e3 *++[ECO "A04"]+[Variation "Reti: Lisitsin: 3.Ng5 e5"]+[Result "*"]+1.Nf3 f5 2.e4 fxe4 3.Ng5 e5 *++[ECO "A04"]+[Variation "Reti: Lisitsin: 3.Ng5 d5"]+[Result "*"]+1.Nf3 f5 2.e4 fxe4 3.Ng5 d5 *++[ECO "A04"]+[Variation "Reti: 1...d6"]+[Result "*"]+1.Nf3 d6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 *++[ECO "A04"]+[Variation "Reti: 1...c5, Nimzowitsch-Larsen"]+[Result "*"]+1.Nf3 c5 2.b3 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 b6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 b6 3.Bg2 Bb7 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 5.d3 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 5.d3 Nf6 6.e4 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 5.d3 Nf6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 5.d3 d6 6.e4 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.Bg2 Bg7 4.O-O Nc6 5.d3 e6 6.e4 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 Nc6 *++[ECO "A04"]+[Variation "Reti: 1...c5"]+[Result "*"]+1.Nf3 c5 2.g3 Nc6 3.Bg2 *++[ECO "A05"]+[Variation "Reti: 1...Nf6"]+[Result "*"]+1.Nf3 Nf6 *++[ECO "A05"]+[Variation "Reti: 1...Nf6 2.b3"]+[Result "*"]+1.Nf3 Nf6 2.b3 *++[ECO "A05"]+[Variation "Reti: Santasiere's folly"]+[Result "*"]+1.Nf3 Nf6 2.b4 *++[ECO "A05"]+[Variation "Reti: 1...Nf6 2.e3"]+[Result "*"]+1.Nf3 Nf6 2.e3 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 c5 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 c5 3.Bg2 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 c5 3.Bg2 Nc6 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 b6 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 b6 3.Bg2 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 b6 3.Bg2 Bb7 *++[ECO "A05"]+[Variation "Reti: KIA, Spassky"]+[Result "*"]+1.Nf3 Nf6 2.g3 b5 *++[ECO "A05"]+[Variation "Reti: KIA, Spassky"]+[Result "*"]+1.Nf3 Nf6 2.g3 b5 3.Bg2 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 *++[ECO "A05"]+[Variation "Reti: KIA, Reti-Smyslov Variation"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.b4 *++[ECO "A05"]+[Variation "Reti: KIA, Reti-Smyslov Variation"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.b4 Bg7 5.Bb2 *	; Move-number error ?++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O O-O *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O O-O 5.d3 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O O-O 5.d3 c5 *++[ECO "A05"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O O-O 5.d3 d6 *++[ECO "A06"]+[Variation "Reti: 1...d5"]+[Result "*"]+1.Nf3 d5 *++[ECO "A06"]+[Variation "Reti: Ampel Variation"]+[Result "*"]+1.Nf3 d5 2.Rg1 *++[ECO "A06"]+[Variation "Reti: Old Indian Attack"]+[Result "*"]+1.Nf3 d5 2.d3 *++[ECO "A06"]+[Variation "Reti: Old Indian Attack"]+[Result "*"]+1.Nf3 d5 2.d3 Nf6 *++[ECO "A06"]+[Variation "Reti: 1...d5 2.e3"]+[Result "*"]+1.Nf3 d5 2.e3 *++[ECO "A06"]+[Variation "Reti: Santasiere's folly"]+[Result "*"]+1.Nf3 d5 2.b4 *++[ECO "A06"]+[Variation "Reti: Santasiere's folly"]+[Result "*"]+1.Nf3 d5 2.b4 Nf6 *++[ECO "A06"]+[Variation "Reti: Tennison/Zukertort Gambit"]+[Result "*"]+1.Nf3 d5 2.e4 *++[ECO "A06"]+[Variation "Reti: Tennison Gambit Accepted"]+[Result "*"]+1.Nf3 d5 2.e4 dxe4 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen"]+[Result "*"]+1.Nf3 d5 2.b3 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...c5"]+[Result "*"]+1.Nf3 d5 2.b3 c5 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Bg4"]+[Result "*"]+1.Nf3 d5 2.b3 Bg4 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Bg4"]+[Result "*"]+1.Nf3 d5 2.b3 Bg4 3.Bb2 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Bg4"]+[Result "*"]+1.Nf3 d5 2.b3 Bg4 3.Bb2 Nd7 4.e3 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Nf6"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Nf6"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Nf6"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 e6 *++[ECO "A06"]+[Variation "Reti: Nimzowitsch-Larsen, 2...Nf6"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 e6 4.e3 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nc6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nc6 3.Bg2 e5 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nc6 3.Bg2 e5 4.d3 Nf6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nc6 3.Bg2 e5 4.d3 Nf6 5.O-O *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nc6 3.Bg2 e5 4.d3 Nf6 5.O-O Be7 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 c6 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 c6 3.Bg2 Bg4 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 c6 3.Bg2 Bg4 4.O-O *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 c6 3.Bg2 Bg4 4.O-O Nd7 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 c6 3.Bg2 Bg4 4.O-O Nd7 5.d3 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.d3 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav, Main Line"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.d3 Nbd7 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav, Main Line, 6.Nbd2"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.d3 Nbd7 6.Nbd2 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav, Main Line, 6.Nbd2 e6"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.d3 Nbd7 6.Nbd2 e6 *++[ECO "A07"]+[Variation "Reti: KIA, Yugoslav, Main Line, 6.Nbd2 e5"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.d3 Nbd7 6.Nbd2 e5 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Bg4 *++[ECO "A07"]+[Variation "Reti: KIA, Keres Variation"]+[Result "*"]+1.Nf3 d5 2.g3 Bg4 3.Bg2 Nd7 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 *++[ECO "A07"]+[Variation "Reti: KIA, Neo-Gruenfeld"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 g6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 Bf5 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 e6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 *++[ECO "A07"]+[Variation "Reti: KIA, Petrosian Variation"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bf5 5.d3 e6 6.Nbd2 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 g6 *++[ECO "A07"]+[Variation "Reti: KIA"]+[Result "*"]+1.Nf3 d5 2.g3 g6 3.Bg2 *++[ECO "A07"]+[Variation "Reti: KIA, Pachman"]+[Result "*"]+1.Nf3 d5 2.g3 g6 3.Bg2 Bg7 4.O-O e5 5.d3 Ne7 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5"]+[Result "*"]+1.Nf3 d5 2.g3 c5 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 + 3...g6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 g6 4.O-O Bg7 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 + 3...g6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 g6 4.O-O Bg7 5.d3 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 + 3...g6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 g6 4.O-O Bg7 5.d3 Nf6 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 + 3...g6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 g6 4.O-O Bg7 5.d3 Nf6 6.Nbd2 O-O *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 + 3...g6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 g6 4.O-O Nc6 5.d3 Nf6 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 3.Bg2 Nc6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5, 3.Bg2 Nc6 4.O-O"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5, 3.Bg2 Nc6 4.d4"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.d4 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 3.Bg2 Nf6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nf6 *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 3.Bg2 Nf6 4.O-O"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nf6 4.O-O *++[ECO "A08"]+[Variation "Reti: KIA, 2...c5 3.Bg2 Nf6 4.O-O Nc6"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nf6 4.O-O Nc6 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nge7 6.Nbd2 b6 7.e4 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nf6 6.Nbd2 b6 7.e4 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nge7 6.Nbd2 g6 7.e4 Bg7 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nf6 6.Nbd2 g6 7.e4 Bg7 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nf6 6.Nbd2 Be7 7.e4 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nf6 6.Nbd2 Be7 7.e4 O-O 8.Re1 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Bd6 6.Nbd2 Nge7 7.e4 *++[ECO "A08"]+[Variation "Reti: KIA, French Variation"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Bd6 6.Nbd2 Nge7 7.e4 O-O 8.Re1 *++[ECO "A09a"]+[Variation "Reti: 2.c4"]+[Result "*"]+1.Nf3 d5 2.c4 *++[ECO "A09b"]+[Variation "Reti: Advance Variation"]+[Result "*"]+1.Nf3 d5 2.c4 d4 *++[ECO "A09c"]+[Variation "Reti: Advance, Anglo-Polish Attack"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.b4 *++[ECO "A09c"]+[Variation "Reti: Advance, Anglo-Polish, 3...g6"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.b4 g6 *++[ECO "A09d"]+[Variation "Reti: Advance, 3.e3"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.e3 *++[ECO "A09e"]+[Variation "Reti: Advance, 3.e3 c5"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.e3 c5 *++[ECO "A09f"]+[Variation "Reti: Advance, 3.e3 Nc6"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.e3 Nc6 *++[ECO "A09f"]+[Variation "Reti: Advance, 3.e3 Nc6 4.exd4 Nxd4"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.e3 Nc6 4.exd4 Nxd4 *++[ECO "A09g"]+[Variation "Reti: Advance, 3.g3"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 *++[ECO "A09h"]+[Variation "Reti: Advance, 3.g3 Nc6"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 Nc6 *++[ECO "A09h"]+[Variation "Reti: Advance, 3.g3 Nc6 4.Bg2 e5"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 Nc6 4.Bg2 e5 *++[ECO "A09i"]+[Variation "Reti: Advance, 3.g3 g6"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 g6 *++[ECO "A09i"]+[Variation "Reti: Advance, 3.g3 g6 4.Bg2 Bg7"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 g6 4.Bg2 Bg7 *++[ECO "A09j"]+[Variation "Reti: Advance, 3.g3 c5"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 c5 *++[ECO "A09j"]+[Variation "Reti: Advance, 3.g3 c5 4.Bg2 Nc6"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 c5 4.Bg2 Nc6 *++[ECO "A09j"]+[Variation "Reti: Advance, 3.g3 c5 4.Bg2 Nc6 5.d3 e5"]+[Result "*"]+1.Nf3 d5 2.c4 d4 3.g3 c5 4.Bg2 Nc6 5.d3 e5 *++[ECO "A09k"]+[Variation "Reti: Accepted"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 *++[ECO "A09l"]+[Variation "Reti: Accepted, 3.g3"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.g3 *++[ECO "A09m"]+[Variation "Reti: Accepted, 3.g3 e6"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.g3 e6 *++[ECO "A09n"]+[Variation "Reti: Accepted, 3.Qa4+"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.Qa4+ *++[ECO "A09o"]+[Variation "Reti: Accepted, 3.Na3"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.Na3 *++[ECO "A09p"]+[Variation "Reti: Accepted, 3.Na3 a6"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.Na3 a6 *++[ECO "A09q"]+[Variation "Reti: Accepted, 3.Na3 c5"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.Na3 c5 *++[ECO "A09r"]+[Variation "Reti: Accepted, 3.e3"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.e3 *++[ECO "A09s"]+[Variation "Reti: Accepted, Keres Variation"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.e3 Be6 *++[ECO "A09t"]+[Variation "Reti: Accepted, 3.e3 Nf6"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.e3 Nf6 *++[ECO "A09u"]+[Variation "Reti: Accepted, 3.e3 Nf6 4.Bxc4 e6"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.e3 Nf6 4.Bxc4 e6 *++[ECO "A10"]+[Variation "English"]+[Result "*"]+1.c4 *++[ECO "A10"]+[Variation "English: 1...g5"]+[Result "*"]+1.c4 g5 *++[ECO "A10"]+[Variation "English: 1...g5 2.d4"]+[Result "*"]+1.c4 g5 2.d4 *++[ECO "A10"]+[Variation "English: Myers Gambit"]+[Result "*"]+1.c4 g5 2.d4 Bg7 *++[ECO "A10"]+[Variation "English: 1...Nc6"]+[Result "*"]+1.c4 Nc6 *++[ECO "A10"]+[Variation "English: 1...Nc6 2.Nc3"]+[Result "*"]+1.c4 Nc6 2.Nc3 *++[ECO "A10"]+[Variation "English: Jaenisch Gambit"]+[Result "*"]+1.c4 b5 *++[ECO "A10"]+[Variation "English: Vector"]+[Result "*"]+1.c4 d5 *++[ECO "A10"]+[Variation "English: 1...b6"]+[Result "*"]+1.c4 b6 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nf3"]+[Result "*"]+1.c4 b6 2.Nf3 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nf3 Bb7"]+[Result "*"]+1.c4 b6 2.Nf3 Bb7 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3"]+[Result "*"]+1.c4 b6 2.Nc3 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3 e6"]+[Result "*"]+1.c4 b6 2.Nc3 e6 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3 e6 3.e4"]+[Result "*"]+1.c4 b6 2.Nc3 e6 3.e4 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3 Bb7"]+[Result "*"]+1.c4 b6 2.Nc3 Bb7 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3 Bb7 3.e4"]+[Result "*"]+1.c4 b6 2.Nc3 Bb7 3.e4 *++[ECO "A10"]+[Variation "English: 1...b6 2.Nc3 Bb7 3.e4 e6"]+[Result "*"]+1.c4 b6 2.Nc3 Bb7 3.e4 e6 *++[ECO "A10"]+[Variation "English: 1...d6"]+[Result "*"]+1.c4 d6 *++[ECO "A10"]+[Variation "English: 1...d6"]+[Result "*"]+1.c4 d6 2.Nc3 *++[ECO "A10"]+[Variation "English: 1...d6"]+[Result "*"]+1.c4 d6 2.Nf3 *++[ECO "A10"]+[Variation "English: 1...g6"]+[Result "*"]+1.c4 g6 *++[ECO "A10"]+[Variation "English: 1...g6 2.g3"]+[Result "*"]+1.c4 g6 2.g3 *++[ECO "A10"]+[Variation "English: 1...g6 2.Nc3"]+[Result "*"]+1.c4 g6 2.Nc3 *++[ECO "A10"]+[Variation "English: 1...g6 2.Nc3 Bg7"]+[Result "*"]+1.c4 g6 2.Nc3 Bg7 *++[ECO "A10"]+[Variation "English: 1...g6 2.Nc3 Bg7 3.g3"]+[Result "*"]+1.c4 g6 2.Nc3 Bg7 3.g3 *++[ECO "A10"]+[Variation "English: 1...g6"]+[Result "*"]+1.c4 g6 2.Nf3 *++[ECO "A10"]+[Variation "English: 1...g6"]+[Result "*"]+1.c4 g6 2.Nf3 Bg7 *++[ECO "A10"]+[Variation "English: 1...g6 2.e4"]+[Result "*"]+1.c4 g6 2.e4 *++[ECO "A10"]+[Variation "English: Adorjan Defence"]+[Result "*"]+1.c4 g6 2.e4 e5 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 *++[ECO "A10"]+[Variation "English: Wade Gambit"]+[Result "*"]+1.c4 f5 2.g4 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.g3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.g3 Nf6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.g3 Nf6 3.Bg2 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nc3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nc3 Nf6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nc3 Nf6 3.g3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nc3 Nf6 3.g3 g6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 e6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.Nc3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 c6 5.O-O d5 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 Be7 *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 Be7 5.O-O *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 Be7 5.O-O O-O *++[ECO "A10"]+[Variation "English: Anglo-Dutch"]+[Result "*"]+1.c4 f5 2.Nf3 Nf6 3.g3 e6 4.Bg2 Be7 5.O-O O-O 6.Nc3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 Bf5 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 Bf5 5.O-O *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 Bf5 5.O-O e6 6.d3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 Bg4 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.g3 Nf6 3.Bg2 d5 4.Nf3 Bg4 5.O-O *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.Nc3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.Nc3 d5 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.Nf3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.Nf3 Nf6 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.g3"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.g3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.g3 Bg4"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.g3 Bg4 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.g3 Bg4"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.g3 Bg4 4.Bg2 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.e3"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.e3 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.e3 Nf6"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.e3 Nf6 *++[ECO "A11"]+[Variation "English: Caro-Kann Defence, 3.e3 Nf6 4.Nc3"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.e3 Nf6 4.Nc3 *++[ECO "A12"]+[Variation "English: Caro-Kann Defence, 3.b3"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 *++[ECO "A12"]+[Variation "English: Torre Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bg4 *++[ECO "A12"]+[Variation "English: Torre Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bg4 5.Bg2 *++[ECO "A12"]+[Variation "English: Torre Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bg4 5.Bg2 e6 *++[ECO "A12"]+[Variation "English: Torre Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bg4 5.Bg2 e6 6.Bb2 *++[ECO "A12"]+[Variation "English: London Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bf5 *++[ECO "A12"]+[Variation "English: London Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bf5 5.Bg2 *++[ECO "A12"]+[Variation "English: London Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bf5 5.Bg2 e6 *++[ECO "A12"]+[Variation "English: London Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bf5 5.Bg2 e6 6.Bb2 *++[ECO "A12"]+[Variation "English: Caro-Kann Defence, 3.b3"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 *++[ECO "A12"]+[Variation "English: Bled Variation"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 g6 *++[ECO "A12"]+[Variation "English: Bled Variation"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 g6 5.e3 Bg7 *++[ECO "A12"]+[Variation "English: New York/London Defence"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 Bf5 *++[ECO "A12"]+[Variation "English: Capablanca"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 Bg4 *++[ECO "A12"]+[Variation "English: Bogoljubow Variation"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Bg4 *++[ECO "A13a"]+[Variation "English: 1...e6"]+[Result "*"]+1.c4 e6 *++[ECO "A13b"]+[Variation "English: 1...e6 2.g3"]+[Result "*"]+1.c4 e6 2.g3 *++[ECO "A13c"]+[Variation "English: 1...e6 2.g3 d5"]+[Result "*"]+1.c4 e6 2.g3 d5 *++[ECO "A13d"]+[Variation "English: 1...e6 2.g3 d5"]+[Result "*"]+1.c4 e6 2.g3 d5 3.Bg2 *++[ECO "A13e"]+[Variation "English: 1...e6 2.Nc3"]+[Result "*"]+1.c4 e6 2.Nc3 *++[ECO "A13f"]+[Variation "English: 1...e6 2.Nc3 Bb4"]+[Result "*"]+1.c4 e6 2.Nc3 Bb4 *++[ECO "A13g"]+[Variation "English: 1...e6 2.Nc3 d5"]+[Result "*"]+1.c4 e6 2.Nc3 d5 *++[ECO "A13h"]+[Variation "English: 1...e6 2.Nf3"]+[Result "*"]+1.c4 e6 2.Nf3 *++[ECO "A13i"]+[Variation "English: 1...e6 2.Nf3 Nf6"]+[Result "*"]+1.c4 e6 2.Nf3 Nf6 *++[ECO "A13j"]+[Variation "English: 1...e6 2.Nf3 Nf6 3.g3"]+[Result "*"]+1.c4 e6 2.Nf3 Nf6 3.g3 *++[ECO "A13k"]+[Variation "English: Romanishin Gambit"]+[Result "*"]+1.c4 e6 2.Nf3 Nf6 3.g3 a6 4.Bg2 b5 *++[ECO "A13l"]+[Variation "English: 1...e6 2.Nf3 d5"]+[Result "*"]+1.c4 e6 2.Nf3 d5 *++[ECO "A13m"]+[Variation "English: Agincourt Variation"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.b3 *++[ECO "A13n"]+[Variation "English: Wimpey System"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.b3 Nf6 4.Bb2 c5 5.e3 *++[ECO "A13n"]+[Variation "English: Wimpey System"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.b3 Nf6 4.Bb2 c5 5.e3 Nc6 *++[ECO "A13o"]+[Variation "English: Agincourt Variation"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 *++[ECO "A13p"]+[Variation "English: Kurajica Defence"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 c6 *++[ECO "A13q"]+[Variation "English: Kurajica Defence"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 c6 4.Qc2 *++[ECO "A13r"]+[Variation "English: Neo-Catalan"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 *++[ECO "A13s"]+[Variation "English: Neo-Catalan"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 *++[ECO "A13s"]+[Variation "English: Neo-Catalan, 4...c6"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 c6 *++[ECO "A13s"]+[Variation "English: Neo-Catalan, 4...c6 5.b3"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 c6 5.b3 *++[ECO "A13t"]+[Variation "English: Neo-Catalan, 4...c5"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 c5 *++[ECO "A13t"]+[Variation "English: Neo-Catalan, 4...c5 5.O-O"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 c5 5.O-O *++[ECO "A13u"]+[Variation "English: Neo-Catalan Accepted"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 *++[ECO "A13v"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ *++[ECO "A13v"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+ Nbd7"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 *++[ECO "A13v"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+ Nbd7 6.O-O"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 6.O-O *++[ECO "A13w"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+ Nbd7 6.Qxc4"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 *++[ECO "A13w"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+ Nbd7 6.Qxc4 a6"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 *++[ECO "A13w"]+[Variation "English: Neo-Catalan Accepted, 5.Qa4+ Nbd7 6.Qxc4 c5"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...c6"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O c6 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...c5"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O c5 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 b6"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 b6 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 b6 7.Bb2 Bb7"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 b6 7.Bb2 Bb7 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 b6 7.Bb2 Bb7 8.e3"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 b6 7.Bb2 Bb7 8.e3 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 c5"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 c5 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 c5 7.Bb2"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 c5 7.Bb2 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 c5 7.Bb2 Nc6"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 c5 7.Bb2 Nc6 *++[ECO "A14"]+[Variation "English: Neo-Catalan Declined, 5...O-O 6.b3 c5 7.Bb2 Nc6 8.e3"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O O-O 6.b3 c5 7.Bb2 Nc6 8.e3 *++[ECO "A15"]+[Variation "English: Anglo-Indian"]+[Result "*"]+1.c4 Nf6 *++[ECO "A15"]+[Variation "English: Anglo-Indian, Polish"]+[Result "*"]+1.c4 Nf6 2.b4 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.g3"]+[Result "*"]+1.c4 Nf6 2.g3 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.g3 e6"]+[Result "*"]+1.c4 Nf6 2.g3 e6 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.g3 e6"]+[Result "*"]+1.c4 Nf6 2.g3 e6 3.Bg2 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.g3 g6"]+[Result "*"]+1.c4 Nf6 2.g3 g6 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.g3 g6"]+[Result "*"]+1.c4 Nf6 2.g3 g6 3.Bg2 Bg7 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.Nf3"]+[Result "*"]+1.c4 Nf6 2.Nf3 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.Nf3 g6"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.Nf3 g6"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A15"]+[Variation "English: Anglo-Indian, 2.Nf3 g6"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3"]+[Result "*"]+1.c4 Nf6 2.Nc3 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 Nc6"]+[Result "*"]+1.c4 Nf6 2.Nc3 Nc6 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 c6"]+[Result "*"]+1.c4 Nf6 2.Nc3 c6 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 c6 3.e4"]+[Result "*"]+1.c4 Nf6 2.Nc3 c6 3.e4 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 c6 3.e4 d5"]+[Result "*"]+1.c4 Nf6 2.Nc3 c6 3.e4 d5 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 c6 3.e4 e5"]+[Result "*"]+1.c4 Nf6 2.Nc3 c6 3.e4 e5 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 d6"]+[Result "*"]+1.c4 Nf6 2.Nc3 d6 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.e4"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.e4 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.e4 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.Nf3 *++[ECO "A16"]+[Variation "English: Anglo-Indian, 2.Nc3 g6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.Nf3 d6 6.O-O *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.Nf3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.Nf3 g6 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.Nf3 g6 4.Qa4+ *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.Nf3 g6 4.g3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 3.cxd5"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Smyslov Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nxc3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Smyslov Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nxc3 6.bxc3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Smyslov Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nxc3 6.bxc3 Bg7 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Smyslov, 7.Rb1"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nxc3 6.bxc3 Bg7 7.Rb1 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Czech Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nb6 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 4.Nf3"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 4.Nf3 g6"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 4.Nf3 g6 5.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.g3 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 4.Nf3 g6 5.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.g3 Bg7 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Korchnoi Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.g3 Bg7 6.Bg2 e5 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Andersson-Boeoek Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.e4 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, Andersson-Boeoek, Queenswap"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.e4 Nxc3 6.dxc3 Qxd1+ 7.Kxd1 *++[ECO "A16"]+[Variation "English: Anglo-Gruenfeld, 4.Nf3 g6 5.Qa4+"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.Qa4+ *++[ECO "A17"]+[Variation "English: Anglo-Indian, 2.Nc3 e6"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 *++[ECO "A17"]+[Variation "English: Anglo-Indian, 2.Nc3 e6 3.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.g3 *++[ECO "A17"]+[Variation "English: Anglo-Indian, 2.Nc3 e6 3.Nf3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 *++[ECO "A17"]+[Variation "English: Anglo-Indian, 2.Nc3 e6 3.Nf3 d5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 d5 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, 4.e4"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.e4 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, Romanishin"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.e4 Bb7 5.Bd3 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, 4.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.g3 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, 4.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, 4.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O *++[ECO "A17"]+[Variation "English: Anglo-Queen's Indian, 4.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Re1 *++[ECO "A17"]+[Variation "English: Nimzo-English"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 Bb4 *++[ECO "A17"]+[Variation "English: Nimzo-English, 4.g3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 Bb4 4.g3 *++[ECO "A17"]+[Variation "English: Nimzo-English, 4.Qc2"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 Bb4 4.Qc2 *++[ECO "A17"]+[Variation "English: Nimzo-English, 4.Qc2 O-O"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 Bb4 4.Qc2 O-O *++[ECO "A18"]+[Variation "English: Mikenas"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 *++[ECO "A18"]+[Variation "English: Mikenas, Kevitz Defence"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 Nc6 *++[ECO "A18"]+[Variation "English: Mikenas, 3...d6"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d6 *++[ECO "A18"]+[Variation "English: Mikenas, 3...d6 4.d4 Be7"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d6 4.d4 Be7 *++[ECO "A18"]+[Variation "English: Mikenas, French Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 *++[ECO "A18"]+[Variation "English: Mikenas, French, 4.cxd5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.cxd5 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 4...Ne4"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 Ne4 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 4...d4"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 d4 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 7.Nf3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 d4 5.exf6 dxc3 6.bxc3 Qxf6 7.Nf3 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 7.d4"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 d4 5.exf6 dxc3 6.bxc3 Qxf6 7.d4 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 7.d4 c5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 d4 5.exf6 dxc3 6.bxc3 Qxf6 7.d4 c5 *++[ECO "A18"]+[Variation "English: Mikenas, Flohr, 7.d4 e5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 d4 5.exf6 dxc3 6.bxc3 Qxf6 7.d4 e5 *++[ECO "A19"]+[Variation "English: Mikenas, Sicilian Variation"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 *++[ECO "A19"]+[Variation "English: Mikenas, Sicilian, 4.e5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 *++[ECO "A19"]+[Variation "English: Mikenas, Sicilian, 4.e5 Ng8"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 *++[ECO "A19"]+[Variation "English: Mikenas, Nei Gambit"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 5.d4 *++[ECO "A19"]+[Variation "English: Mikenas, 5.Nf3"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 5.Nf3 *++[ECO "A19"]+[Variation "English: Mikenas, 5.Nf3 Nc6"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 5.Nf3 Nc6 *++[ECO "A19"]+[Variation "English: Mikenas, 5.Nf3 Nc6 6.d4"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 5.Nf3 Nc6 6.d4 *++[ECO "A19"]+[Variation "English: Mikenas, 6.d4 cxd4 7.Nxd4 Nxe5"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 4.e5 Ng8 5.Nf3 Nc6 6.d4 cxd4 7.Nxd4 Nxe5 *++[ECO "A20"]+[Variation "English: King's (1...e5)"]+[Result "*"]+1.c4 e5 *++[ECO "A20"]+[Variation "English: King's, 2.d3"]+[Result "*"]+1.c4 e5 2.d3 *++[ECO "A20"]+[Variation "English: King's, 2.e3"]+[Result "*"]+1.c4 e5 2.e3 *++[ECO "A20"]+[Variation "English: King's, 2.g3"]+[Result "*"]+1.c4 e5 2.g3 *++[ECO "A20"]+[Variation "English: King's, 2.g3 f5"]+[Result "*"]+1.c4 e5 2.g3 f5 *++[ECO "A20"]+[Variation "English: King's, 2.g3 g6"]+[Result "*"]+1.c4 e5 2.g3 g6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 g6"]+[Result "*"]+1.c4 e5 2.g3 g6 3.Bg2 *++[ECO "A20"]+[Variation "English: King's, 2.g3 g6"]+[Result "*"]+1.c4 e5 2.g3 g6 3.Bg2 Bg7 *++[ECO "A20"]+[Variation "English: King's, 2.g3 c6"]+[Result "*"]+1.c4 e5 2.g3 c6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 c6 3.d4"]+[Result "*"]+1.c4 e5 2.g3 c6 3.d4 *++[ECO "A20"]+[Variation "English: King's, 2.g3 d6"]+[Result "*"]+1.c4 e5 2.g3 d6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 d6"]+[Result "*"]+1.c4 e5 2.g3 d6 3.Bg2 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nc6"]+[Result "*"]+1.c4 e5 2.g3 Nc6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nc6 3.Bg2"]+[Result "*"]+1.c4 e5 2.g3 Nc6 3.Bg2 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6"]+[Result "*"]+1.c4 e5 2.g3 Nf6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6 3.Bg2"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6 3.Bg2 Bc5"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 Bc5 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6 3.Bg2 Nc6"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 Nc6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6 3.Bg2 c6"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 c6 *++[ECO "A20"]+[Variation "English: King's, 2.g3 Nf6 3.Bg2 d5"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 d5 *++[ECO "A20"]+[Variation "English: King's, Nimzowitsch"]+[Result "*"]+1.c4 e5 2.Nf3 *++[ECO "A20"]+[Variation "English: King's, Nimzowitsch, 2...Nc6"]+[Result "*"]+1.c4 e5 2.Nf3 Nc6 *++[ECO "A20"]+[Variation "English: King's, Nimzowitsch, Flohr Variation"]+[Result "*"]+1.c4 e5 2.Nf3 e4 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3"]+[Result "*"]+1.c4 e5 2.Nc3 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 f5"]+[Result "*"]+1.c4 e5 2.Nc3 f5 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 f5"]+[Result "*"]+1.c4 e5 2.Nc3 f5 3.g3 Nf6 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 f5"]+[Result "*"]+1.c4 e5 2.Nc3 f5 3.g3 Nf6 4.Bg2 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 g6"]+[Result "*"]+1.c4 e5 2.Nc3 g6 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 g6"]+[Result "*"]+1.c4 e5 2.Nc3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 d6"]+[Result "*"]+1.c4 e5 2.Nc3 d6 *++[ECO "A21"]+[Variation "English: King's, Keres Variation"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.g3 c6 *++[ECO "A21"]+[Variation "English: King's, Keres Variation"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.g3 c6 4.Bg2 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 d6 3.d4"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.d4 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 d6 3.g3"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.g3 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 d6 3.Nf3"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 *++[ECO "A21"]+[Variation "English: King's, 2.Nc3 d6 3.Nf3 g6"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 g6 *++[ECO "A21"]+[Variation "English: Lukin Variation"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 *++[ECO "A21"]+[Variation "English: Lukin, 4.d4 e4"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 *++[ECO "A21"]+[Variation "English: Lukin, 5.Nd2"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Nd2 *++[ECO "A21"]+[Variation "English: Lukin, 5.Nd2 Nf6 6.e3"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Nd2 Nf6 6.e3 *++[ECO "A21"]+[Variation "English: Lukin, 5.Ng5"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Ng5 *++[ECO "A21"]+[Variation "English: Lukin, 5.Ng5 Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Ng5 Nf6 *++[ECO "A21"]+[Variation "English: Lukin, 5.Ng5 Be7"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Ng5 Be7 *++[ECO "A21"]+[Variation "English: Lukin, 5.Ng5 c6"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 f5 4.d4 e4 5.Ng5 c6 *++[ECO "A21"]+[Variation "English: Smyslov Defence"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 Bg4 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov Counterattack"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.g3"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.g3 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.g3 Bxc3"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.g3 Bxc3 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.g3 Bxc3 4.bxc3"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.g3 Bxc3 4.bxc3 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5 a5"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 a5 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5 Ba5"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 Ba5 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 Bc5 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5 Be7"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 Be7 *++[ECO "A21"]+[Variation "English: Kramnik-Shirov, 3.Nd5 Be7 4.d4"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 3.Nd5 Be7 4.d4 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.e4 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.e3"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.e3 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.e3 Bb4"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.e3 Bb4 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.Nf3"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.Nf3 d6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 d6 *++[ECO "A22"]+[Variation "English: King's, 2.Nc3 Nf6 3.Nf3 e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 e4 *++[ECO "A22"]+[Variation "English: Bellon Gambit"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 e4 4.Ng5 b5 *++[ECO "A22"]+[Variation "English: Bremen System"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 *++[ECO "A22"]+[Variation "English: Bremen, 3...Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bc5 *++[ECO "A22"]+[Variation "English: Bremen, Reverse Dragon"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 *++[ECO "A22"]+[Variation "English: Bremen, Reverse Dragon, 4.cxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 4.cxd5 *++[ECO "A22"]+[Variation "English: Bremen, Reverse Dragon, 4.cxd5 Nxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 *++[ECO "A22"]+[Variation "English: Bremen, Reverse Dragon, 4.cxd5 Nxd5 5.Bg2"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 *++[ECO "A22"]+[Variation "English: Bremen, Reverse Dragon, 4.cxd5 Nxd5 5.Bg2 Nb6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 Nb6 *++[ECO "A22"]+[Variation "English: Bremen, Smyslov System"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 *++[ECO "A22"]+[Variation "English: Bremen, Smyslov, 4.Bg2"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 4.Bg2 *++[ECO "A22"]+[Variation "English: Bremen, Smyslov, 4.Bg2 Bxc3"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 4.Bg2 Bxc3 *++[ECO "A22"]+[Variation "English: Bremen, Smyslov, 4.Bg2 O-O"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 4.Bg2 O-O *++[ECO "A22"]+[Variation "English: Bremen, Smyslov, 4.Bg2 O-O 5.e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 4.Bg2 O-O 5.e4 *++[ECO "A23"]+[Variation "English: Bremen, Keres System"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Nf3"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Nf3 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Nf3 d6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Nf3 d6 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Nf3 d6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Nf3 d6 5.Bg2 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Nf3 e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Nf3 e4 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Bg2"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Bg2 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Bg2 d5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Bg2 d5 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Bg2 d5 5.cxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Bg2 d5 5.cxd5 *++[ECO "A23"]+[Variation "English: Bremen, Keres, 4.Bg2 d5 5.cxd5 cxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 4.Bg2 d5 5.cxd5 cxd5 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e3 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 O-O *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e4 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nf3 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 O-O *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 O-O 7.d3 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.O-O O-O *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.d3 O-O 7.O-O *++[ECO "A24"]+[Variation "English: Bremen, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.d3 O-O 7.O-O c6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.e3 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.e3 Nf6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 f5 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 f5 4.Bg2 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 f5 4.Bg2 Nf6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 f5 4.Bg2 Nf6 5.e3 g6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 f5 4.Bg2 Nf6 5.d3 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 4.Bg2 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 4.Bg2 Bc5 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 4.Bg2 Bc5 5.e3 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 4.Bg2 Bb4 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 Nf6 4.Bg2 Bb4 5.Nd5 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 d6 4.Bg2 *++[ECO "A25"]+[Variation "English: Closed, Troeger Defence"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 d6 4.Bg2 Be6 *++[ECO "A25"]+[Variation "English: Closed, Troeger, 5.d3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 d6 4.Bg2 Be6 5.d3 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 *++[ECO "A25"]+[Variation "English: Closed"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A25"]+[Variation "English: Closed, 5.e3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 *++[ECO "A25"]+[Variation "English: Closed, Taimanov Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 Nh6 *++[ECO "A25"]+[Variation "English: Closed, Hort Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 Be6 *++[ECO "A25"]+[Variation "English: Closed, Hort, 7.d3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 Be6 7.d3 *++[ECO "A25"]+[Variation "English: Closed, 5.Rb1"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Rb1 *++[ECO "A25"]+[Variation "English: Closed, 5.Rb1, Taimanov Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Rb1 Nh6 *++[ECO "A25"]+[Variation "English: Closed, 5.Rb1"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Rb1 a5 *++[ECO "A25"]+[Variation "English: Closed, 5.e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 *++[ECO "A25"]+[Variation "English: Closed, 5.d3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "A25"]+[Variation "English: Closed, 5.d3 Nge7"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 Nge7 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.e3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e3 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Rb1"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Rb1 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Rb1 f5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Rb1 f5 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Rb1 a5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Rb1 a5 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O O-O"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O O-O *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5 9.a3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5 9.a3 *++[ECO "A26"]+[Variation "English: Closed, 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5 9.a3 h6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nf3 Nf6 7.O-O O-O 8.Rb1 a5 9.a3 h6 *++[ECO "A26"]+[Variation "English: Botvinnik System"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nf6 *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nf6 7.Nf3 *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nf6 7.Nf3 O-O 8.O-O *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nf6 7.Nge2 *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nf6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nf6 7.Nge2 O-O 8.O-O *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nge7"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nge7 *++[ECO "A26"]+[Variation "English: Botvinnik System, 6...Nge7 7.Nge2"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nge7 7.Nge2 *++[ECO "A27"]+[Variation "English: Three Knights"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 *++[ECO "A27"]+[Variation "English: Three Knights, 3...Bb4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Bb4 *++[ECO "A27"]+[Variation "English: Three Knights, 3...d6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 d6 *++[ECO "A27"]+[Variation "English: Three Knights, 3...f5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 f5 *++[ECO "A27"]+[Variation "English: Three Knights, 3...f5 4.d4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 f5 4.d4 *++[ECO "A27"]+[Variation "English: Three Knights, 3...f5 4.d4 e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 f5 4.d4 e4 *++[ECO "A27"]+[Variation "English: Three Knights, 3...g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 g6 *++[ECO "A27"]+[Variation "English: Three Knights, 3...g6 4.d4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 g6 4.d4 *++[ECO "A27"]+[Variation "English: Three Knights, 3...g6 4.d4 exd4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 g6 4.d4 exd4 *++[ECO "A27"]+[Variation "English: Three Knights, 3...g6 4.d4 exd4 5.Nxd4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 g6 4.d4 exd4 5.Nxd4 *++[ECO "A28"]+[Variation "English: Four Knights"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 *++[ECO "A28"]+[Variation "English: Four Knights, Nimzowitsch Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e4 *++[ECO "A28"]+[Variation "English: Four Knights, Marini Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.a3 *++[ECO "A28"]+[Variation "English: Four Knights, Capablanca Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d3 *++[ECO "A28"]+[Variation "English: Four Knights, 4.d4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 *++[ECO "A28"]+[Variation "English: Four Knights, Nenarokov Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Bg5 h6 7.Bh4 Bxc3+ 8.bxc3 Ne5 *++[ECO "A28"]+[Variation "English: Four Knights, Bradley Beach Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 e4 *++[ECO "A28"]+[Variation "English: Four Knights, 4.e3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 *++[ECO "A28"]+[Variation "English: Four Knights, 4.e3 Bb4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 *++[ECO "A28"]+[Variation "English: Four Knights, 4.e3 Bb4 5.Qc2"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 5.Qc2 *++[ECO "A28"]+[Variation "English: Four Knights, Stean Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 5.Qc2 O-O 6.Nd5 Re8 7.Qf5 *++[ECO "A28"]+[Variation "English: Four Knights, Romanishin Variation"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 5.Qc2 Bxc3 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 g6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 g6 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 g6 5.d4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 g6 5.d4 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Be6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Be6 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.Rb1"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.Rb1 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.a3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.a3 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.d3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.d3 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.d3"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nb6 7.O-O Be7 8.d3 O-O *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bc5 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bc5 5.Bg2 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bc5 5.Bg2 d6 6.O-O *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bc5 5.Bg2 d6 6.O-O O-O *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bc5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bc5 5.Bg2 d6 6.O-O O-O 7.d3 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bb4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bb4 5.Nd5"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 5.Nd5 *++[ECO "A29"]+[Variation "English: Four Knights, 4.g3 Bb4 5.Bg2"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 5.Bg2 *++[ECO "A29"]+[Variation "English: Four Knights, Main Line 6.O-O"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 5.Bg2 O-O 6.O-O *++[ECO "A29"]+[Variation "English: Four Knights, Main Line 6.O-O e4"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 5.Bg2 O-O 6.O-O e4 *++[ECO "A30a"]+[Variation "English: Symmetrical"]+[Result "*"]+1.c4 c5 *++[ECO "A30a"]+[Variation "English: Symmetrical, 2.b3"]+[Result "*"]+1.c4 c5 2.b3 *++[ECO "A30a"]+[Variation "English: Symmetrical, 2.g3"]+[Result "*"]+1.c4 c5 2.g3 *++[ECO "A30a"]+[Variation "English: Symmetrical, 2.g3 g6"]+[Result "*"]+1.c4 c5 2.g3 g6 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3"]+[Result "*"]+1.c4 c5 2.Nf3 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3 b6"]+[Result "*"]+1.c4 c5 2.Nf3 b6 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3 b6 3.g3"]+[Result "*"]+1.c4 c5 2.Nf3 b6 3.g3 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3 b6 3.g3 Bb7 4.Bg2"]+[Result "*"]+1.c4 c5 2.Nf3 b6 3.g3 Bb7 4.Bg2 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3 g6"]+[Result "*"]+1.c4 c5 2.Nf3 g6 *++[ECO "A30b"]+[Variation "English: Symmetrical, 2.Nf3 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nc6 *++[ECO "A30c"]+[Variation "English: Symmetrical, 2.Nf3 Nf6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 *++[ECO "A30d"]+[Variation "English: Symmetrical, 2.Nf3 Nf6 3.g3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 *++[ECO "A30e"]+[Variation "English: Symmetrical, b6 System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 *++[ECO "A30e"]+[Variation "English: Symmetrical, b6 System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 *++[ECO "A30e"]+[Variation "English: Symmetrical, b6 System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.Nc3 *++[ECO "A30e"]+[Variation "English: Symmetrical, b6 System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O *++[ECO "A30f"]+[Variation "English: Symmetrical, Double Fianchetto"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 *++[ECO "A30f"]+[Variation "English: Symmetrical, Double Fianchetto"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 6.Nc3 Bg7 *++[ECO "A30g"]+[Variation "English: Symmetrical, Mutual Double Fianchetto"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 6.b3 *++[ECO "A30g"]+[Variation "English: Symmetrical, Mutual Double Fianchetto"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 6.b3 Bg7 7.Bb2 O-O *++[ECO "A30g"]+[Variation "English: Symmetrical, Mutual Double Fianchetto"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 6.b3 Bg7 7.Bb2 O-O 8.Nc3 *++[ECO "A30g"]+[Variation "English: Symmetrical, Mutual Double Fianchetto with ...d5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O g6 6.b3 Bg7 7.Bb2 O-O 8.Nc3 d5 *++[ECO "A30h"]+[Variation "English: Symmetrical, Hedgehog System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 *++[ECO "A30h"]+[Variation "English: Symmetrical, Hedgehog System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 *++[ECO "A30i"]+[Variation "English: Symmetrical, Hedgehog, 6...a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 a6 *++[ECO "A30j"]+[Variation "English: Symmetrical, Hedgehog, 6...d6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 d6 *++[ECO "A30k"]+[Variation "English: Symmetrical, Hedgehog, 6...d6 7.b3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 d6 7.b3 *++[ECO "A30l"]+[Variation "English: Symmetrical, Hedgehog, 6...d6 7.d4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 d6 7.d4 *++[ECO "A30m"]+[Variation "English: Symmetrical, Hedgehog System"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 *++[ECO "A30n"]+[Variation "English: Symmetrical, Hedgehog, 7.Re1"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.Re1 *++[ECO "A30o"]+[Variation "English: Symmetrical, Hedgehog, 7.Re1 d5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.Re1 d5 *++[ECO "A30p"]+[Variation "English: Symmetrical, Hedgehog, 7.b3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.b3 *++[ECO "A30p"]+[Variation "English: Symmetrical, Hedgehog, 7.b3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.b3 O-O *++[ECO "A30p"]+[Variation "English: Symmetrical, Hedgehog, 7.b3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.b3 O-O 8.Bb2 d6 *++[ECO "A30q"]+[Variation "English: Symmetrical, Hedgehog, 7.d4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 *++[ECO "A30r"]+[Variation "English: Symmetrical, Hedgehog, 8.Qxd4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 *++[ECO "A30s"]+[Variation "English: Symmetrical, Hedgehog, 8.Qxd4 O-O"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 O-O *++[ECO "A30s"]+[Variation "English: Symmetrical, Hedgehog, 8.Qxd4 O-O"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 O-O 9.Rd1 Nc6 *++[ECO "A30t"]+[Variation "English: Symmetrical, Hedgehog, 8.Qxd4 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 Nc6 *++[ECO "A30u"]+[Variation "English: Symmetrical, Hedgehog, 8.Qxd4 d6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 *++[ECO "A30v"]+[Variation "English: Symmetrical, Hedgehog, 9.b3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.b3 *++[ECO "A30v"]+[Variation "English: Symmetrical, Hedgehog, 9.b3 Nbd7"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.b3 Nbd7 *++[ECO "A30v"]+[Variation "English: Symmetrical, Hedgehog, 9.b3 Nbd7 10.Nb5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.b3 Nbd7 10.Nb5 *++[ECO "A30w"]+[Variation "English: Symmetrical, Hedgehog, 9.Rd1"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 *++[ECO "A30x"]+[Variation "English: Symmetrical, Hedgehog, Flexible Formation"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 a6 10.b3 Nbd7 *++[ECO "A30y"]+[Variation "English: Symmetrical, Hedgehog, Flexible Formation"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 a6 10.b3 Nbd7 11.e4 *++[ECO "A30y"]+[Variation "English: Symmetrical, Hedgehog, Flexible Formation, 11.e4 Qc7"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 a6 10.b3 Nbd7 11.e4 Qc7 *++[ECO "A30y"]+[Variation "English: Symmetrical, Hedgehog, Flexible Formation, 11.e4 O-O"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 a6 10.b3 Nbd7 11.e4 O-O *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 3...a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 a6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 3...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 g6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 3...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 g6 4.d5 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 3...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 g6 4.Nc3 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...b6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 b6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...b6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 b6 5.Nc3 Bb7 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 g6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...g6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.e4 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 Nc6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 g6 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...e5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e5 *++[ECO "A31"]+[Variation "English: Symmetrical, Two Knights, 4...e5 5.Nb5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 4...e6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.e3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.e3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 a6 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 a6 6.Bg2 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Qb6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Qb6 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Qb6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Qb6 6.Bg2 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Qc7"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Qc7 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Nc6 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Nc6 6.Bg2 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 Bb4+"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 Bb4+ *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 d5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 d5 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 d5 6.Bg2"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 d5 6.Bg2 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.g3 d5 6.Bg2 e5 7.Nf3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.g3 d5 6.Bg2 e5 7.Nf3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 d5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 d5 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 a6 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 a6 6.g3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 a6 6.g3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Bb4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Bb4 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Bb4 6.Qb3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Bb4 6.Qb3 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Bb4 6.Nb5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Bb4 6.Nb5 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Bb4 6.Bd2"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Bb4 6.Bd2 *++[ECO "A32"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Bb4 6.Bd2 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Bb4 6.Bd2 Nc6 *++[ECO "A33a"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 *++[ECO "A33b"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Bf4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Bf4 *++[ECO "A33c"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Bg5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Bg5 *++[ECO "A33d"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.e3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.e3 *++[ECO "A33e"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.a3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.a3 *++[ECO "A33f"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.a3 Bc5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.a3 Bc5 *++[ECO "A33g"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Ndb5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Ndb5 *++[ECO "A33h"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Ndb5 Bb4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Ndb5 Bb4 *++[ECO "A33i"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Ndb5 d5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Ndb5 d5 *++[ECO "A33j"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.Ndb5 d5 Queenswap"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.Ndb5 d5 7.Bf4 e5 8.cxd5 exf4 9.dxc6 bxc6 10.Qxd8+ Kxd8 *++[ECO "A33k"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.g3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 *++[ECO "A33l"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.g3 a6"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 a6 *++[ECO "A33m"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.g3 Bb4"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Bb4 *++[ECO "A33n"]+[Variation "English: Symmetrical, Two Knights, 5.Nc3 Nc6 6.g3 Bc5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Bc5 *++[ECO "A33o"]+[Variation "English: Symmetrical, Geller Variation"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Qb6 *++[ECO "A33p"]+[Variation "English: Symmetrical, Geller, 7.Nb3"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Qb6 7.Nb3 *++[ECO "A33q"]+[Variation "English: Symmetrical, Geller, 7.Nb3 Ne5"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Qb6 7.Nb3 Ne5 *++[ECO "A34"]+[Variation "English: Symmetrical"]+[Result "*"]+1.c4 c5 2.Nc3 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...b6"]+[Result "*"]+1.c4 c5 2.Nc3 b6 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...b6"]+[Result "*"]+1.c4 c5 2.Nc3 b6 3.Nf3 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...b6"]+[Result "*"]+1.c4 c5 2.Nc3 b6 3.Nf3 Bb7 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...g6"]+[Result "*"]+1.c4 c5 2.Nc3 g6 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...g6"]+[Result "*"]+1.c4 c5 2.Nc3 g6 3.Nf3 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...g6"]+[Result "*"]+1.c4 c5 2.Nc3 g6 3.g3 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...g6"]+[Result "*"]+1.c4 c5 2.Nc3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...Nf6"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...Nf6"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 d5 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...Nf6 3.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 *++[ECO "A34"]+[Variation "English: Symmetrical, 2...Nf6 3.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 *++[ECO "A34"]+[Variation "English: Symmetrical, Rubinstein System"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 Nc7 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 3...b6"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 b6 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 3...e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 e6 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 3...e6 4.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 e6 4.g3 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 3...g6"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 g6 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, Exchange"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.g3 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.e4"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.e4 Nxc3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 Nxc3 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, Queenswap"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.dxc3 Qxd1+ 7.Kxd1 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.e4 Nb4"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 Nb4 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.e4 Nb4 6.Bb5+"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 Nb4 6.Bb5+ *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.e4 Nb4 6.Bc4"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.e4 Nb4 6.Bc4 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.d4 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.d4 cxd4"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.d4 cxd4 *++[ECO "A34"]+[Variation "English: Symmetrical, 3 Knights, 5.d4 Nxc3"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 5.d4 Nxc3 *++[ECO "A35a"]+[Variation "English: Symmetrical"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 *++[ECO "A35b"]+[Variation "English: Symmetrical, 2.Nc3 Nc6 3.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.e3 *++[ECO "A35c"]+[Variation "English: Symmetrical, 2.Nc3 Nc6 3.Nf3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 *++[ECO "A35d"]+[Variation "English: Symmetrical, 2.Nc3 Nc6 3.Nf3 g6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 g6 *++[ECO "A35e"]+[Variation "English: Symmetrical, 2.Nc3 Nc6 3.Nf3 g6 4.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 g6 4.e3 *++[ECO "A35f"]+[Variation "English: Symmetrical, 2.Nc3 Nc6 3.Nf3 g6 4.e3 Bg7"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 g6 4.e3 Bg7 *++[ECO "A35g"]+[Variation "English: Symmetrical, Four Knights"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 *++[ECO "A35g"]+[Variation "English: Symmetrical, Four Knights, 4.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 *++[ECO "A35h"]+[Variation "English: Symmetrical, Four Knights, 4.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 *++[ECO "A35i"]+[Variation "English: Symmetrical, Four Knights, 4.e3 e5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 e5 *++[ECO "A35j"]+[Variation "English: Symmetrical, Four Knights, 4.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 *++[ECO "A35k"]+[Variation "English: Symmetrical, Four Knights, 4.g3 d5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 *++[ECO "A35l"]+[Variation "English: Symmetrical, Four Knights, 4.g3 d5 5.cxd5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 d5 5.cxd5 *++[ECO "A36a"]+[Variation "English: Symmetrical, 3.g3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 *++[ECO "A36b"]+[Variation "English: Symmetrical, 3.g3 Nf6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 Nf6 *++[ECO "A36c"]+[Variation "English: Symmetrical, 3.g3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 e6 *++[ECO "A36c"]+[Variation "English: Symmetrical, 3.g3 e6 4.Nf3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 e6 4.Nf3 *++[ECO "A36c"]+[Variation "English: Symmetrical, Keres-Parma System"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 e6 4.Nf3 Nf6 *++[ECO "A36d"]+[Variation "English: Symmetrical, Keres-Parma, Main Line Exchange"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 e6 4.Nf3 Nf6 5.Bg2 Be7 6.O-O d5 7.cxd5 Nxd5 *++[ECO "A36e"]+[Variation "English: Symmetrical, 3.g3 g6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 *++[ECO "A36e"]+[Variation "English: Symmetrical, 3.g3 g6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 *++[ECO "A36e"]+[Variation "English: Symmetrical, 3.g3 g6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A36f"]+[Variation "English: Symmetrical, 5.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "A36g"]+[Variation "English: Symmetrical, 5.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.a3 *++[ECO "A36h"]+[Variation "English: Symmetrical, 5.a3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.a3 e6 *++[ECO "A36i"]+[Variation "English: Symmetrical, 5.a3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.a3 d6 *++[ECO "A36j"]+[Variation "English: Symmetrical, 5.b3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.b3 *++[ECO "A36k"]+[Variation "English: Symmetrical, 5.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 *++[ECO "A36l"]+[Variation "English: Symmetrical, 5.e3 e5 (Botvinnik Reversed)"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 e5 *++[ECO "A36m"]+[Variation "English: Symmetrical, 5.e3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 e6 *++[ECO "A36m"]+[Variation "English: Symmetrical, 5.e3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 e6 6.Nge2 *++[ECO "A36m"]+[Variation "English: Symmetrical, 5.e3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 e6 6.Nge2 Nge7 *++[ECO "A36n"]+[Variation "English: Symmetrical, Botvinnik System"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 *++[ECO "A36o"]+[Variation "English: Symmetrical, Botvinnik, 5...Nf6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 Nf6 *++[ECO "A36o"]+[Variation "English: Symmetrical, Botvinnik, 5...Nf6 6.Nge2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 Nf6 6.Nge2 *++[ECO "A36p"]+[Variation "English: Symmetrical, Botvinnik, 5...e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 e6 *++[ECO "A36p"]+[Variation "English: Symmetrical, Botvinnik, 5...e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 e6 6.Nge2 Nge7 *++[ECO "A36q"]+[Variation "English: Symmetrical, Botvinnik, 5...e6, 8.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 e6 6.Nge2 Nge7 7.O-O O-O 8.d3 *++[ECO "A36r"]+[Variation "English: Symmetrical, Botvinnik, 5...e6, 8.d3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 e6 6.Nge2 Nge7 7.O-O O-O 8.d3 d6 *++[ECO "A36s"]+[Variation "English: Symmetrical, Botvinnik, 5...d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 *++[ECO "A36t"]+[Variation "English: Symmetrical, Botvinnik, 5...d6 6.Nge2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 *++[ECO "A36u"]+[Variation "English: Symmetrical, Botvinnik, 5...d6 6.Nge2 Nf6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 *++[ECO "A36v"]+[Variation "English: Symmetrical, Botvinnik System, 5...d6, 7.O-O O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 7.O-O O-O *++[ECO "A36w"]+[Variation "English: Symmetrical, Botvinnik System, 5...d6, 8.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 7.O-O O-O 8.d3 *++[ECO "A36x"]+[Variation "English: Symmetrical, Botvinnik System, 5...d6, 8.d3 Rb8"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 7.O-O O-O 8.d3 Rb8 *++[ECO "A36y"]+[Variation "English: Symmetrical, Botvinnik System, 5...d6, 8.d3 Ne8"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 7.O-O O-O 8.d3 Ne8 *++[ECO "A36z"]+[Variation "English: Symmetrical, Botvinnik System, 5...d6, 8.d3 a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 d6 6.Nge2 Nf6 7.O-O O-O 8.d3 a6 *++[ECO "A37a"]+[Variation "English: Symmetrical, 5.Nf3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 *++[ECO "A37b"]+[Variation "English: Symmetrical, 5.Nf3 a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 a6 *++[ECO "A37c"]+[Variation "English: Symmetrical, 5.Nf3 Nh6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nh6 *++[ECO "A37d"]+[Variation "English: Symmetrical, 5.Nf3 Nh6 6.O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nh6 6.O-O *++[ECO "A37e"]+[Variation "English: Symmetrical, 5.Nf3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 *++[ECO "A37f"]+[Variation "English: Symmetrical, 5.Nf3 d6 6.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.d3 *++[ECO "A37g"]+[Variation "English: Symmetrical, 5.Nf3 d6 6.O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.O-O *++[ECO "A37h"]+[Variation "English: Symmetrical, 5.Nf3 d6 6.O-O Nh6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.O-O Nh6 *++[ECO "A37i"]+[Variation "English: Symmetrical, 5.Nf3 e6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 *++[ECO "A37j"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.d3 *++[ECO "A37k"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.e3 *++[ECO "A37l"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O *++[ECO "A37l"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O Nge7"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O Nge7 *++[ECO "A37m"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O Nge7 7.e3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O Nge7 7.e3 *++[ECO "A37n"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O Nge7 7.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O Nge7 7.d3 *++[ECO "A37o"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O Nge7 7.d3 O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O Nge7 7.d3 O-O *++[ECO "A37p"]+[Variation "English: Symmetrical, 5.Nf3 e6 6.O-O Nge7 7.d3 O-O 8.Bd2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e6 6.O-O Nge7 7.d3 O-O 8.Bd2 *++[ECO "A37q"]+[Variation "English: Symmetrical, 5.Nf3 e5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 *++[ECO "A37r"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.a3 *++[ECO "A37s"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.d3 *++[ECO "A37t"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.d3 Nge7"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.d3 Nge7 *++[ECO "A37u"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O *++[ECO "A37u"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O d6 *++[ECO "A37v"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O d6 7.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O d6 7.d3 *++[ECO "A37v"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O d6 7.d3 Nge7"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O d6 7.d3 Nge7 *++[ECO "A37w"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O d6 7.d3 Nge7 8.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O d6 7.d3 Nge7 8.a3 *++[ECO "A37x"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O Nge7"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O Nge7 *++[ECO "A37y"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O Nge7 7.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O Nge7 7.d3 *++[ECO "A37y"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O Nge7 7.d3 O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O Nge7 7.d3 O-O *++[ECO "A37y"]+[Variation "English: Symmetrical, 5.Nf3 e5 6.O-O Nge7 7.d3 O-O 8.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 6.O-O Nge7 7.d3 O-O 8.a3 *++[ECO "A38a"]+[Variation "English: Symmetrical, Main Line"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 *++[ECO "A38b"]+[Variation "English: Symmetrical, Main Line, 6.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.d4 *++[ECO "A38c"]+[Variation "English: Symmetrical, Main Line, 6.O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O *++[ECO "A38d"]+[Variation "English: Symmetrical, Main Line, 6.O-O d5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O d5 *++[ECO "A38e"]+[Variation "English: Symmetrical, Main Line, 6.O-O d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O d6 *++[ECO "A38f"]+[Variation "English: Symmetrical, Main Line, 6.O-O O-O"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O *++[ECO "A38g"]+[Variation "English: Symmetrical, Main Line, 7.Rb1"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.Rb1 *++[ECO "A38h"]+[Variation "English: Symmetrical, Main Line, 7.b3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.b3 *++[ECO "A38i"]+[Variation "English: Symmetrical, Main Line, 7.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.a3 *++[ECO "A38j"]+[Variation "English: Symmetrical, Main Line, 7.a3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.a3 d6 *++[ECO "A38k"]+[Variation "English: Symmetrical, Main Line, 7.d3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 *++[ECO "A38l"]+[Variation "English: Symmetrical, Main Line, 7.d3 a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 a6 *++[ECO "A38m"]+[Variation "English: Symmetrical, Main Line, 7.d3 d5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d5 *++[ECO "A38n"]+[Variation "English: Symmetrical, Main Line, 7.d3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d6 *++[ECO "A38o"]+[Variation "English: Symmetrical, Main Line, 7.d3 d6 8.Rb1"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d6 8.Rb1 *++[ECO "A38p"]+[Variation "English: Symmetrical, Main Line, 7.d3 d6 8.Bd2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d6 8.Bd2 *++[ECO "A38q"]+[Variation "English: Symmetrical, Main Line, 7.d3 d6 8.a3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d6 8.a3 *++[ECO "A38r"]+[Variation "English: Symmetrical, Main Line, 7.d3 d6 8.a3 a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 d6 8.a3 a6 *++[ECO "A39a"]+[Variation "English: Symmetrical, Main Line 7.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 *++[ECO "A39b"]+[Variation "English: Symmetrical, Main Line 7.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 *++[ECO "A39c"]+[Variation "English: Symmetrical, Main Line 7.d4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 *++[ECO "A39d"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Qa5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Qa5 *++[ECO "A39e"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Qb6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Qb6 *++[ECO "A39e"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Qb6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Qb6 9.Nc2 *++[ECO "A39f"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 a6 *++[ECO "A39g"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 d6 *++[ECO "A39h"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Ng4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Ng4 *++[ECO "A39i"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Ng4 9.e3 d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Ng4 9.e3 d6 *++[ECO "A39j"]+[Variation "English: Symmetrical, Main Line 7.d4, 8...Nxd4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 *++[ECO "A39j"]+[Variation "English: Symmetrical, Main Line 7.d4, 9.Qxd4"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 *++[ECO "A39k"]+[Variation "English: Symmetrical, Main Line 7.d4, 9...d6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 *++[ECO "A39l"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd2 *++[ECO "A39m"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 *++[ECO "A39n"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 Bf5"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 Bf5 *++[ECO "A39o"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 Rb8"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 Rb8 *++[ECO "A39p"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 a6"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 a6 *++[ECO "A39q"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 a6 11.Bd2"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 a6 11.Bd2 *++[ECO "A39q"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 a6 11.Bd2 Rb8"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 a6 11.Bd2 Rb8 *++[ECO "A39r"]+[Variation "English: Symmetrical, Main Line 7.d4, 10.Qd3 a6 11.Bd2 Rb8 12.Rac1"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 a6 11.Bd2 Rb8 12.Rac1 *++[ECO "A40a"]+[Variation "Queen's Pawn Game"]+[Result "*"]+1.d4 *++[ECO "A40b"]+[Variation "Queen's Pawn: 1...c6"]+[Result "*"]+1.d4 c6 *++[ECO "A40b"]+[Variation "Queen's Pawn: 1...c6 2.Nf3"]+[Result "*"]+1.d4 c6 2.Nf3 *++[ECO "A40b"]+[Variation "Queen's Pawn: 1...c6 2.c4"]+[Result "*"]+1.d4 c6 2.c4 *++[ECO "A40b"]+[Variation "Queen's Pawn: Jadoul"]+[Result "*"]+1.d4 c6 2.c4 b5 *++[ECO "A40c"]+[Variation "Queen's Pawn: Polish Defence"]+[Result "*"]+1.d4 b5 *++[ECO "A40c"]+[Variation "Queen's Pawn: Polish Defence"]+[Result "*"]+1.d4 b5 2.e4 *++[ECO "A40c"]+[Variation "Queen's Pawn: Polish Defence"]+[Result "*"]+1.d4 b5 2.e4 Bb7 *++[ECO "A40c"]+[Variation "Queen's Pawn: Polish Defence, Spassky Gambit"]+[Result "*"]+1.d4 b5 2.e4 Bb7 3.Bxb5 *++[ECO "A40d"]+[Variation "Queen's Pawn: English Defence"]+[Result "*"]+1.d4 b6 *++[ECO "A40d"]+[Variation "Queen's Pawn: English Defence, 2.c4"]+[Result "*"]+1.d4 b6 2.c4 *++[ECO "A40d"]+[Variation "Queen's Pawn: English Defence, 2.c4 Bb7"]+[Result "*"]+1.d4 b6 2.c4 Bb7 *++[ECO "A40e"]+[Variation "Queen's Pawn: English Defence, 2.c4 e6"]+[Result "*"]+1.d4 b6 2.c4 e6 *++[ECO "A40f"]+[Variation "Queen's Pawn: English Defence, 3.a3"]+[Result "*"]+1.d4 b6 2.c4 e6 3.a3 *++[ECO "A40g"]+[Variation "Queen's Pawn: English Defence, 3.e4"]+[Result "*"]+1.d4 b6 2.c4 e6 3.e4 *++[ECO "A40g"]+[Variation "Queen's Pawn: English Defence, Polli Gambit"]+[Result "*"]+1.d4 b6 2.c4 e6 3.e4 Bb7 4.f3 f5 *++[ECO "A40g"]+[Variation "Queen's Pawn: English Defence, Hartlaub Gambit"]+[Result "*"]+1.d4 b6 2.c4 Bb7 3.Nc3 e6 4.e4 f5 *++[ECO "A40h"]+[Variation "Queen's Pawn: English Defence, 3.Nc3"]+[Result "*"]+1.d4 b6 2.c4 e6 3.Nc3 *++[ECO "A40i"]+[Variation "Englund Gambit"]+[Result "*"]+1.d4 e5 *++[ECO "A40i"]+[Variation "Englund Gambit Accepted"]+[Result "*"]+1.d4 e5 2.dxe5 *++[ECO "A40i"]+[Variation "Englund Gambit: Soller"]+[Result "*"]+1.d4 e5 2.dxe5 f6 *++[ECO "A40i"]+[Variation "Englund Gambit: Hartlaub"]+[Result "*"]+1.d4 e5 2.dxe5 d6 *++[ECO "A40i"]+[Variation "Englund Gambit: 2.dxe5 Nc6"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 *++[ECO "A40i"]+[Variation "Englund Gambit: 2.dxe5 Nc6 3.Nf3"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 3.Nf3 *++[ECO "A40i"]+[Variation "Englund Gambit: Soller Deferred"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 3.Nf3 f6 *++[ECO "A40i"]+[Variation "Englund Gambit: Zilbermints"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 3.Nf3 Nge7 *++[ECO "A40i"]+[Variation "Englund Gambit: 2.dxe5 Nc6 3.Nf3 Qe7"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 3.Nf3 Qe7 *++[ECO "A40j"]+[Variation "Queen's Pawn: Bogoljubow-Miles Defence"]+[Result "*"]+1.d4 Nc6 *++[ECO "A40j"]+[Variation "Queen's Pawn: Bogoljubow-Miles, 2.Bg5"]+[Result "*"]+1.d4 Nc6 2.Bg5 *++[ECO "A40j"]+[Variation "Queen's Pawn: Bogoljubow-Miles, 2.d5"]+[Result "*"]+1.d4 Nc6 2.d5 *++[ECO "A40k"]+[Variation "Queen's Pawn: Bogoljubow-Miles, 2.c4"]+[Result "*"]+1.d4 Nc6 2.c4 *++[ECO "A40k"]+[Variation "Queen's Pawn: Bogoljubow-Miles, Pozarek Gambit"]+[Result "*"]+1.d4 Nc6 2.c4 e5 3.dxe5 Nxe5 4.Nc3 Nxc4 *++[ECO "A40l"]+[Variation "Queen's Pawn: Bogoljubow-Miles, 2.Nf3"]+[Result "*"]+1.d4 Nc6 2.Nf3 *++[ECO "A40m"]+[Variation "Queen's Pawn: 1...e6"]+[Result "*"]+1.d4 e6 *++[ECO "A40n"]+[Variation "Queen's Pawn: 1...e6 2.Nf3"]+[Result "*"]+1.d4 e6 2.Nf3 *++[ECO "A40n"]+[Variation "Queen's Pawn: 1...e6 2.Nf3 c5"]+[Result "*"]+1.d4 e6 2.Nf3 c5 *++[ECO "A40o"]+[Variation "Queen's Pawn: 1...e6 2.c4"]+[Result "*"]+1.d4 e6 2.c4 *++[ECO "A40p"]+[Variation "Queen's Pawn: Keres Defence"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ *++[ECO "A40q"]+[Variation "Queen's Pawn: Keres Defence, 3.Bd2"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ 3.Bd2 *++[ECO "A40q"]+[Variation "Queen's Pawn: Keres Defence, 3.Bd2 Bxd2+"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ 3.Bd2 Bxd2+ *++[ECO "A40q"]+[Variation "Queen's Pawn: Keres Defence, Kangaroo Variation"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ 3.Bd2 Bxd2+ 4.Qxd2 b6 5.Nc3 Bb7 6.e4 Nh6 *++[ECO "A40r"]+[Variation "Queen's Pawn: Keres Defence, 3.Bd2 a5"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ 3.Bd2 a5 *++[ECO "A40s"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 *++[ECO "A40t"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.Nf3 *++[ECO "A40u"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 *++[ECO "A40u"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 *++[ECO "A40v"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.e4 *++[ECO "A40w"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nf3 *++[ECO "A40w"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nf3 c5 *++[ECO "A40x"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nc3 *++[ECO "A40x"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nc3 c5 *++[ECO "A40x"]+[Variation "Queen's Pawn: Modern"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nc3 c5 4.d5 *++[ECO "A40y"]+[Variation "Queen's Pawn: Modern, Beefeater Defence"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nc3 c5 4.d5 Bxc3+ 5.bxc3 f5 *++[ECO "A41a"]+[Variation "Neo-Old Indian"]+[Result "*"]+1.d4 d6 *++[ECO "A41b"]+[Variation "Neo-Old Indian: 2.Bg5"]+[Result "*"]+1.d4 d6 2.Bg5 *++[ECO "A41c"]+[Variation "Neo-Old Indian: 2.g3"]+[Result "*"]+1.d4 d6 2.g3 *++[ECO "A41d"]+[Variation "Neo-Old Indian: 2.Nf3"]+[Result "*"]+1.d4 d6 2.Nf3 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern"]+[Result "*"]+1.d4 d6 2.Nf3 g6 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern: 3.Bf4"]+[Result "*"]+1.d4 d6 2.Nf3 g6 3.Bf4 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern: 3.Bf4"]+[Result "*"]+1.d4 d6 2.Nf3 g6 3.Bf4 Bg7 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern: 3.g3"]+[Result "*"]+1.d4 d6 2.Nf3 g6 3.g3 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern: 3.g3"]+[Result "*"]+1.d4 d6 2.Nf3 g6 3.g3 Bg7 *++[ECO "A41e"]+[Variation "Neo-Old Indian / Modern: 3.g3"]+[Result "*"]+1.d4 d6 2.Nf3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A41f"]+[Variation "Neo-Old Indian: Wade Defence"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 *++[ECO "A41f"]+[Variation "Neo-Old Indian: Wade Defence, 3.e3"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.e3 *++[ECO "A41f"]+[Variation "Neo-Old Indian: Wade Defence, 3.e3 Nd7"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.e3 Nd7 *++[ECO "A41f"]+[Variation "Neo-Old Indian: Wade Defence, 3.e3 Nf6"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.e3 Nf6 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 e5"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 e5 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 e5 4.Nc3"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 e5 4.Nc3 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 e5 4.Nc3 Nc6"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 e5 4.Nc3 Nc6 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 e5 4.dxe5"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 e5 4.dxe5 *++[ECO "A41g"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 e5 4.dxe5 Nc6 Gambit"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 e5 4.dxe5 Nc6 *++[ECO "A41h"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 Nd7"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 Nd7 *++[ECO "A41h"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 Nd7 4.Nc3"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 Nd7 4.Nc3 *++[ECO "A41h"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 Nd7 4.Nc3 e5"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 Nd7 4.Nc3 e5 *++[ECO "A41i"]+[Variation "Neo-Old Indian: Wade Defence, 3.c4 Bxf3"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.c4 Bxf3 *++[ECO "A41j"]+[Variation "Neo-Old Indian: Wade Defence, 3.e4"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.e4 *++[ECO "A41k"]+[Variation "Neo-Old Indian: Wade Defence, 3.e4 Nf6"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 3.e4 Nf6 *++[ECO "A41l"]+[Variation "Neo-Old Indian: 2.c4"]+[Result "*"]+1.d4 d6 2.c4 *++[ECO "A41m"]+[Variation "Neo-Old Indian: 2.c4 e5"]+[Result "*"]+1.d4 d6 2.c4 e5 *++[ECO "A41n"]+[Variation "Neo-Old Indian: 2.c4 e5 3.d5"]+[Result "*"]+1.d4 d6 2.c4 e5 3.d5 *++[ECO "A41o"]+[Variation "Neo-Old Indian: 2.c4 e5 3.dxe5"]+[Result "*"]+1.d4 d6 2.c4 e5 3.dxe5 *++[ECO "A41o"]+[Variation "Neo-Old Indian: Queenswap"]+[Result "*"]+1.d4 d6 2.c4 e5 3.dxe5 dxe5 4.Qxd8+ Kxd8 *++[ECO "A41p"]+[Variation "Neo-Old Indian: 2.c4 e5 3.Nf3"]+[Result "*"]+1.d4 d6 2.c4 e5 3.Nf3 *++[ECO "A41p"]+[Variation "Neo-Old Indian: 2.c4 e5 3.Nf3 e4"]+[Result "*"]+1.d4 d6 2.c4 e5 3.Nf3 e4 *++[ECO "A41q"]+[Variation "Neo-Old Indian: Modern"]+[Result "*"]+1.d4 d6 2.c4 g6 *++[ECO "A41q"]+[Variation "Neo-Old Indian: Modern, 3.e4"]+[Result "*"]+1.d4 d6 2.c4 g6 3.e4 *++[ECO "A41q"]+[Variation "Neo-Old Indian: Modern, 3.e4 Bg7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.e4 Bg7 *++[ECO "A41r"]+[Variation "Neo-Old Indian: Modern, 3.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nf3 *++[ECO "A41r"]+[Variation "Neo-Old Indian: Modern, 3.Nf3 Bg7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nf3 Bg7 *++[ECO "A41r"]+[Variation "Neo-Old Indian: Modern, 3.Nf3 Bg7 4.g3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nf3 Bg7 4.g3 *++[ECO "A41s"]+[Variation "Neo-Old Indian: Modern, 3.Nf3 Bg7 4.e4"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nf3 Bg7 4.e4 *++[ECO "A41s"]+[Variation "Neo-Old Indian: Modern, Rossolimo Variation"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nf3 Bg7 4.e4 Bg4 *++[ECO "A41t"]+[Variation "Neo-Old Indian: Modern, 3.Nc3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 *++[ECO "A41t"]+[Variation "Neo-Old Indian: Modern, 3.Nc3 Bg7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 *++[ECO "A41u"]+[Variation "Neo-Old Indian: Modern, 3.Nc3 Bg7 4.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.Nf3 *++[ECO "A41v"]+[Variation "Neo-Old Indian: Modern, 3.Nc3 Bg7 4.Nf3 Bf4"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.Nf3 Bg4 *++[ECO "A41w"]+[Variation "Neo-Old Indian: Modern, 3.Nc3 Bg7 4.Nf3 Bf4 5.e3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.Nf3 Bg4 5.e3 *++[ECO "A41w"]+[Variation "Neo-Old Indian: Modern, 3.Nc3 Bg7 4.Nf3 Bf4 5.e3 Nc6"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.Nf3 Bg4 5.e3 Nc6 *++[ECO "A42a"]+[Variation "Modern: Averbakh"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 *++[ECO "A42b"]+[Variation "Modern: Averbakh, Randspringer Variation"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 f5 *++[ECO "A42b"]+[Variation "Modern: Averbakh, Randspringer, 5.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 f5 5.Nf3 *++[ECO "A42c"]+[Variation "Modern: c4 Pterodactyl"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c5 *++[ECO "A42c"]+[Variation "Modern: c4 Pterodactyl"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c5 5.Nf3 *++[ECO "A42c"]+[Variation "Modern: c4 Pterodactyl"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c5 5.Nf3 Qa5 *++[ECO "A42d"]+[Variation "Modern: Averbakh, 4...c6"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c6 *++[ECO "A42d"]+[Variation "Modern: Averbakh, 4...c6 5.Be3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c6 5.Be3 *++[ECO "A42e"]+[Variation "Modern: Averbakh, 4...c6 5.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c6 5.Nf3 *++[ECO "A42f"]+[Variation "Modern: Averbakh, 4...Nd7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nd7 *++[ECO "A42f"]+[Variation "Modern: Averbakh, 4...Nd7 5.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nd7 5.Nf3 *++[ECO "A42g"]+[Variation "Modern: Averbakh, Kotov Variation"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 *++[ECO "A42g"]+[Variation "Modern: Averbakh, Kotov, 5.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Nf3 *++[ECO "A42g"]+[Variation "Modern: Averbakh, Kotov, 5.Nge2"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Nge2 *++[ECO "A42h"]+[Variation "Modern: Averbakh, Kotov, 5.d5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.d5 *++[ECO "A42i"]+[Variation "Modern: Averbakh, Kotov, 5.Be3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 *++[ECO "A42j"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 *++[ECO "A42j"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5 6.Nge2"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 6.Nge2 *++[ECO "A42k"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5 6.d5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 6.d5 *++[ECO "A42l"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5 6.d5 Nce7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 6.d5 Nce7 *++[ECO "A42l"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5 6.d5 Nce7 7.c5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 6.d5 Nce7 7.c5 *++[ECO "A42m"]+[Variation "Modern: Averbakh, Kotov, 5.Be3 e5 6.d5 Nce7 7.g4"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 5.Be3 e5 6.d5 Nce7 7.g4 *++[ECO "A42n"]+[Variation "Modern: Averbakh, 4...e5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 *++[ECO "A42o"]+[Variation "Modern: Averbakh, 4...e5 5.Nge2"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.Nge2 *++[ECO "A42p"]+[Variation "Modern: Averbakh, 4...e5 5.Nf3"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.Nf3 *++[ECO "A42q"]+[Variation "Modern: Averbakh, 4...e5 5.Nf3 Nd7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.Nf3 Nd7 *++[ECO "A42r"]+[Variation "Modern: Averbakh, 4...e5 5.Nf3 Nd7 6.Be2"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.Nf3 Nd7 6.Be2 *++[ECO "A42s"]+[Variation "Modern: Averbakh, 4...e5 5.Nf3 Nd7 6.Be2 Ne7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.Nf3 Nd7 6.Be2 Ne7 *++[ECO "A42t"]+[Variation "Modern: Averbakh, 4...e5 5.d5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.d5 *++[ECO "A42u"]+[Variation "Modern: Averbakh, 4...e5 5.d5 Nd7"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.d5 Nd7 *++[ECO "A42v"]+[Variation "Modern: Averbakh, 4...e5 5.dxe5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.dxe5 *++[ECO "A42v"]+[Variation "Modern: Averbakh, 4...e5 5.dxe5 dxe5"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.dxe5 dxe5 *++[ECO "A42v"]+[Variation "Modern: Averbakh, Queenswap"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.dxe5 dxe5 6.Qxd8+ Kxd8 *++[ECO "A42w"]+[Variation "Modern: Averbakh, Queenswap, 7.f4"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 e5 5.dxe5 dxe5 6.Qxd8+ Kxd8 7.f4 *++[ECO "A43a"]+[Variation "Old Benoni"]+[Result "*"]+1.d4 c5 *++[ECO "A43a"]+[Variation "Old Benoni: Nakamura Gambit"]+[Result "*"]+1.d4 c5 2.b4 *++[ECO "A43b"]+[Variation "Old Benoni: 2.dxc5"]+[Result "*"]+1.d4 c5 2.dxc5 *++[ECO "A43b"]+[Variation "Old Benoni: Cormorant Gambit"]+[Result "*"]+1.d4 c5 2.dxc5 b6 *++[ECO "A43c"]+[Variation "Old Benoni: 2.c3"]+[Result "*"]+1.d4 c5 2.c3 *++[ECO "A43d"]+[Variation "Old Benoni: 2.e3"]+[Result "*"]+1.d4 c5 2.e3 *++[ECO "A43e"]+[Variation "Old Benoni: 2.d5"]+[Result "*"]+1.d4 c5 2.d5 *++[ECO "A43e"]+[Variation "Old Benoni: 2.d5 b5"]+[Result "*"]+1.d4 c5 2.d5 b5 *++[ECO "A43f"]+[Variation "Old Benoni: 2.d5 e6"]+[Result "*"]+1.d4 c5 2.d5 e6 *++[ECO "A43g"]+[Variation "Old Benoni: Franco-Benoni"]+[Result "*"]+1.d4 c5 2.d5 e6 3.e4 *++[ECO "A43h"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 *++[ECO "A43h"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 *++[ECO "A43h"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 d6 *++[ECO "A43h"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 d6 5.e4 *++[ECO "A43i"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 d6 5.Nc3 *++[ECO "A43i"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 d6 5.Nc3 g6 6.e4 Bg7 *++[ECO "A43i"]+[Variation "Old Benoni: 2.d5 e6 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e6 3.c4 exd5 4.cxd5 d6 5.Nc3 g6 6.e4 Bg7 7.Nf3 *++[ECO "A43j"]+[Variation "Old Benoni: Clarendon Court Defence"]+[Result "*"]+1.d4 c5 2.d5 f5 *++[ECO "A43j"]+[Variation "Old Benoni: Clarendon Court, 3.c4"]+[Result "*"]+1.d4 c5 2.d5 f5 3.c4 *++[ECO "A43j"]+[Variation "Old Benoni: Clarendon Court, 3.g3"]+[Result "*"]+1.d4 c5 2.d5 f5 3.g3 *++[ECO "A43j"]+[Variation "Old Benoni: Clarendon Court, 3.Nc3"]+[Result "*"]+1.d4 c5 2.d5 f5 3.Nc3 *++[ECO "A43k"]+[Variation "Old Benoni: 2.d5 Nf6"]+[Result "*"]+1.d4 c5 2.d5 Nf6 *++[ECO "A43k"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nc3"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nc3 *++[ECO "A43k"]+[Variation "Old Benoni: Woozle"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nc3 Qa5 *++[ECO "A43l"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nf3"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 *++[ECO "A43l"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nf3 e6"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 e6 *++[ECO "A43l"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nf3 e6 4.Nc3"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 e6 4.Nc3 *++[ECO "A43m"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nf3 g6"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 g6 *++[ECO "A43m"]+[Variation "Old Benoni: 2.d5 Nf6 3.Nf3 g6 4.Nc3"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 g6 4.Nc3 *++[ECO "A43n"]+[Variation "Old Benoni: Neo-Benko"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 b5 *++[ECO "A43o"]+[Variation "Old Benoni: Neo-Benko, 4.Bg5"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 b5 4.Bg5 *++[ECO "A43p"]+[Variation "Old Benoni: Neo-Benko, 4.Bg5 d6"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 b5 4.Bg5 d6 *++[ECO "A43q"]+[Variation "Old Benoni: Neo-Benko, 4.Bg5 Ne4"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 b5 4.Bg5 Ne4 *++[ECO "A43r"]+[Variation "Old Benoni: Hawk"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 c4 *++[ECO "A43r"]+[Variation "Old Benoni: Hawk, 4.e4"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 c4 4.e4 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt"]+[Result "*"]+1.d4 c5 2.d5 d6 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.Nf3"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nf3 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.Nf3 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nf3 Nf6 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.Nc3"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nc3 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.Nc3 g6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nc3 g6 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.Nc3 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nc3 Nf6 *++[ECO "A43s"]+[Variation "Old Benoni: Schmidt, 3.e4"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 *++[ECO "A43t"]+[Variation "Old Benoni: Schmidt, 3.e4 g6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 g6 *++[ECO "A43t"]+[Variation "Old Benoni: Schmidt, 3.e4 g6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 g6 4.Nf3 Bg7 *++[ECO "A43t"]+[Variation "Old Benoni: Schmidt, 3.e4 g6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 g6 4.Nf3 Bg7 5.Be2 *++[ECO "A43t"]+[Variation "Old Benoni: Schmidt, 3.e4 g6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 g6 4.Nc3 Bg7 *++[ECO "A43u"]+[Variation "Old Benoni: Schmidt, 3.e4 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 *++[ECO "A43u"]+[Variation "Old Benoni: Schmidt, 3.e4 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 *++[ECO "A43u"]+[Variation "Old Benoni: Schmidt, 3.e4 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 *++[ECO "A43u"]+[Variation "Old Benoni: Schmidt, 3.e4 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 *++[ECO "A43u"]+[Variation "Old Benoni: Schmidt, 3.e4 Nf6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 *++[ECO "A43v"]+[Variation "Old Benoni: Schmidt, 6.h3"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.h3 *++[ECO "A43v"]+[Variation "Old Benoni: Schmidt, 6.h3"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.h3 O-O *++[ECO "A43w"]+[Variation "Old Benoni: Schmidt, 6.Bb5+"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Bb5+ *++[ECO "A43x"]+[Variation "Old Benoni: Schmidt, 6.Be2"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 *++[ECO "A43x"]+[Variation "Old Benoni: Schmidt, 6.Be2 O-O"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 O-O *++[ECO "A43x"]+[Variation "Old Benoni: Schmidt, 6.Be2 O-O 7.O-O"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 O-O 7.O-O *++[ECO "A43x"]+[Variation "Old Benoni: Schmidt, 6.Be2 O-O 7.O-O e6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 O-O 7.O-O e6 *++[ECO "A43y"]+[Variation "Old Benoni: Schmidt, 6.Be2 O-O 7.O-O Na6"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 O-O 7.O-O Na6 *++[ECO "A43z"]+[Variation "Old Benoni: Schmidt, 6.Be2 O-O 7.O-O Na6 8.h3"]+[Result "*"]+1.d4 c5 2.d5 d6 3.e4 Nf6 4.Nc3 g6 5.Nf3 Bg7 6.Be2 O-O 7.O-O Na6 8.h3 *++[ECO "A44a"]+[Variation "Old Benoni: Czech"]+[Result "*"]+1.d4 c5 2.d5 e5 *++[ECO "A44b"]+[Variation "Old Benoni: Czech, 3.dxe6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.dxe6 *++[ECO "A44c"]+[Variation "Old Benoni: Czech, 3.c4"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 *++[ECO "A44d"]+[Variation "Old Benoni: Czech, 3.c4 d6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 *++[ECO "A44e"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 *++[ECO "A44f"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 Be7"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 Be7 *++[ECO "A44g"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 Be7 5.Nc3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 Be7 5.Nc3 *++[ECO "A44h"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 g6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 g6 *++[ECO "A44h"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 g6 5.Nc3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 g6 5.Nc3 *++[ECO "A44i"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 g6 5.Nc3 Bg7"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 g6 5.Nc3 Bg7 *++[ECO "A44j"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 g6 5.Nc3 Bg7 6.Nf3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 g6 5.Nc3 Bg7 6.Nf3 *++[ECO "A44k"]+[Variation "Old Benoni: Czech, 3.c4 d6 4.e4 g6 5.Nc3 Bg7 6.Bd3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.c4 d6 4.e4 g6 5.Nc3 Bg7 6.Bd3 *++[ECO "A44l"]+[Variation "Old Benoni: Czech, 3.e4"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 *++[ECO "A44m"]+[Variation "Old Benoni: Czech, 3.e4 d6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 *++[ECO "A44n"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nf3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nf3 *++[ECO "A44o"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Bb5+"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Bb5+ *++[ECO "A44p"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Bd3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Bd3 *++[ECO "A44q"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 *++[ECO "A44r"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 Nf6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 Nf6 *++[ECO "A44s"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 g6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 g6 *++[ECO "A44t"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 a6"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 a6 *++[ECO "A44u"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 a6 5.a4 Be7"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 a6 5.a4 Be7 *++[ECO "A44v"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 Be7"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 Be7 *++[ECO "A44w"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 Be7 5.Bb5+"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 Be7 5.Bb5+ *++[ECO "A44x"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 Be7 5.Nf3"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 Be7 5.Nf3 *++[ECO "A44y"]+[Variation "Old Benoni: Czech, 3.e4 d6 4.Nc3 Be7 5.Nf3 Bg4"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 4.Nc3 Be7 5.Nf3 Bg4 *++[ECO "A45a"]+[Variation "Queen's Pawn: Indian"]+[Result "*"]+1.d4 Nf6 *++[ECO "A45a"]+[Variation "Indian: Paleface Attack"]+[Result "*"]+1.d4 Nf6 2.f3 *++[ECO "A45a"]+[Variation "Indian: Blackmar-Diemer Gambit (without Nc3)"]+[Result "*"]+1.d4 Nf6 2.f3 d5 3.e4 *++[ECO "A45a"]+[Variation "Indian: Gedult Attack"]+[Result "*"]+1.d4 Nf6 2.f3 d5 3.g4 *++[ECO "A45a"]+[Variation "Indian: Omega Gambit"]+[Result "*"]+1.d4 Nf6 2.e4 *++[ECO "A45a"]+[Variation "Indian: Arafat Gambit"]+[Result "*"]+1.d4 Nf6 2.e4 Nxe4 3.Bd3 Nf6 4.Nf3 *++[ECO "A45a"]+[Variation "Indian: Gibbins Gambit"]+[Result "*"]+1.d4 Nf6 2.g4 *++[ECO "A45a"]+[Variation "Indian: Gibbins Gambit, Oshima Defence"]+[Result "*"]+1.d4 Nf6 2.g4 e5 *++[ECO "A45a"]+[Variation "Indian: Gibbins Gambit Accepted"]+[Result "*"]+1.d4 Nf6 2.g4 Nxg4 *++[ECO "A45b"]+[Variation "Indian: Canard Opening"]+[Result "*"]+1.d4 Nf6 2.f4 *++[ECO "A45c"]+[Variation "Indian: 2.Nd2"]+[Result "*"]+1.d4 Nf6 2.Nd2 *++[ECO "A45c"]+[Variation "Indian: Lazard Gambit"]+[Result "*"]+1.d4 Nf6 2.Nd2 e5 *++[ECO "A45d"]+[Variation "Indian: 2.e3"]+[Result "*"]+1.d4 Nf6 2.e3 *++[ECO "A45d"]+[Variation "Indian: 2.e3 e6"]+[Result "*"]+1.d4 Nf6 2.e3 e6 *++[ECO "A45d"]+[Variation "Indian: 2.e3 g6"]+[Result "*"]+1.d4 Nf6 2.e3 g6 *++[ECO "A45e"]+[Variation "Indian: 2.c3"]+[Result "*"]+1.d4 Nf6 2.c3 *++[ECO "A45e"]+[Variation "Indian: 2.c3 g6"]+[Result "*"]+1.d4 Nf6 2.c3 g6 *++[ECO "A45e"]+[Variation "Indian: 2.c3 g6 3.Bg5"]+[Result "*"]+1.d4 Nf6 2.c3 g6 3.Bg5 *++[ECO "A45f"]+[Variation "Indian: 2.Nc3"]+[Result "*"]+1.d4 Nf6 2.Nc3 *++[ECO "A45g"]+[Variation "Indian: 2.Bf4"]+[Result "*"]+1.d4 Nf6 2.Bf4 *++[ECO "A45h"]+[Variation "Indian: 2.g3"]+[Result "*"]+1.d4 Nf6 2.g3 *++[ECO "A45h"]+[Variation "Indian: 2.g3 g6"]+[Result "*"]+1.d4 Nf6 2.g3 g6 *++[ECO "A45i"]+[Variation "Indian: 2.g3 c5"]+[Result "*"]+1.d4 Nf6 2.g3 c5 *++[ECO "A45i"]+[Variation "Indian: 2.g3 c5 3.d5 b5"]+[Result "*"]+1.d4 Nf6 2.g3 c5 3.d5 b5 *++[ECO "A45j"]+[Variation "Trompowsky Opening"]+[Result "*"]+1.d4 Nf6 2.Bg5 *++[ECO "A45j"]+[Variation "Trompowsky 2...d6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d6 *++[ECO "A45j"]+[Variation "Trompowsky 2...d6 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 d6 3.Nc3 *++[ECO "A45j"]+[Variation "Trompowsky 2...d6 3.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d6 3.Bxf6 *++[ECO "A45k"]+[Variation "Trompowsky 2...g6"]+[Result "*"]+1.d4 Nf6 2.Bg5 g6 *++[ECO "A45k"]+[Variation "Trompowsky 2...g6 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 g6 3.Nc3 *++[ECO "A45k"]+[Variation "Trompowsky 2...g6 3.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 g6 3.Bxf6 *++[ECO "A45l"]+[Variation "Trompowsky 2...g6 3.Bxf6 exf6 4.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 g6 3.Bxf6 exf6 4.e3 *++[ECO "A45m"]+[Variation "Trompowsky: 2...e6"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 *++[ECO "A45m"]+[Variation "Trompowsky: 2...e6 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.Nc3 *++[ECO "A45m"]+[Variation "Trompowsky: 2...e6 3.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e3 *++[ECO "A45m"]+[Variation "Trompowsky: 2...e6 3.Nd2"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.Nd2 *++[ECO "A45n"]+[Variation "Trompowsky: 2...e6 3.e4"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 *++[ECO "A45n"]+[Variation "Trompowsky: 2...e6 3.e4 h6"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 *++[ECO "A45n"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 *++[ECO "A45n"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 *++[ECO "A45n"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.c3"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.c3 *++[ECO "A45o"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 *++[ECO "A45o"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 Bb4"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 Bb4 *++[ECO "A45o"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6 *++[ECO "A45o"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6 6.Qd2"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6 6.Qd2 *++[ECO "A45o"]+[Variation "Trompowsky: 2...e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6 6.Qd2 g5"]+[Result "*"]+1.d4 Nf6 2.Bg5 e6 3.e4 h6 4.Bxf6 Qxf6 5.Nc3 d6 6.Qd2 g5 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5 3.dxc5"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.dxc5 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Nc3 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5 3.d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.d5 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5 3.d5 Qb6"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.d5 Qb6 *++[ECO "A45p"]+[Variation "Trompowsky: 2...c5 3.d5 Qb6 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.d5 Qb6 4.Nc3 *++[ECO "A45q"]+[Variation "Trompowsky: 2...c5 3.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 *++[ECO "A45q"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 *++[ECO "A45q"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.c4"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.c4 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.g3"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.g3 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.e3 *++[ECO "A45r"]+[Variation "Trompowsky: 2...c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.e3 Bg7"]+[Result "*"]+1.d4 Nf6 2.Bg5 c5 3.Bxf6 gxf6 4.d5 Qb6 5.Qc1 f5 6.e3 Bg7 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4 3.h4"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.h4 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4 3.h4 d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.h4 d5 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4 3.h4 c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.h4 c5 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4 3.h4 c5 4.dxc5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.h4 c5 4.dxc5 *++[ECO "A45s"]+[Variation "Trompowsky: 2...Ne4 3.h4 c5 4.d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.h4 c5 4.d5 *++[ECO "A45t"]+[Variation "Trompowsky: 2...Ne4 3.Bh4"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bh4 *++[ECO "A45t"]+[Variation "Trompowsky: 2...Ne4 3.Bh4 g5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bh4 g5 *++[ECO "A45t"]+[Variation "Trompowsky: 2...Ne4 3.Bh4 d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bh4 d5 *++[ECO "A45t"]+[Variation "Trompowsky: 2...Ne4 3.Bh4 c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bh4 c5 *++[ECO "A45t"]+[Variation "Trompowsky: 2...Ne4 3.Bh4 c5 4.f3"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bh4 c5 4.f3 *++[ECO "A45u"]+[Variation "Trompowsky: 2...Ne4 3.Bf4"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 *++[ECO "A45u"]+[Variation "Trompowsky: Borg Variation"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 g5 *++[ECO "A45u"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 *++[ECO "A45u"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5 4.Nd2"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 4.Nd2 *++[ECO "A45v"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5 4.f3"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 4.f3 *++[ECO "A45v"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5 4.f3 Nf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 4.f3 Nf6 *++[ECO "A45w"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5 4.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 4.e3 *++[ECO "A45w"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 d5 4.e3 c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 d5 4.e3 c5 *++[ECO "A45x"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 *++[ECO "A45x"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.d5 *++[ECO "A45x"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.d5 Qb6"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.d5 Qb6 *++[ECO "A45y"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.f3"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.f3 *++[ECO "A45y"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.f3 Qa5+"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.f3 Qa5+ *++[ECO "A45y"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.f3 Qa5+ 5.c3 Nf6 6.d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.f3 Qa5+ 5.c3 Nf6 6.d5 *++[ECO "A45z"]+[Variation "Trompowsky: 2...Ne4 3.Bf4 c5 4.f3 Qa5+ 5.c3 Nf6 6.Nd2"]+[Result "*"]+1.d4 Nf6 2.Bg5 Ne4 3.Bf4 c5 4.f3 Qa5+ 5.c3 Nf6 6.Nd2 *++[ECO "A46a"]+[Variation "Indian: 2.Nf3"]+[Result "*"]+1.d4 Nf6 2.Nf3 *++[ECO "A46a"]+[Variation "Indian: Doery Defence"]+[Result "*"]+1.d4 Nf6 2.Nf3 Ne4 *++[ECO "A46b"]+[Variation "Indian: 2.Nf3 b5"]+[Result "*"]+1.d4 Nf6 2.Nf3 b5 *++[ECO "A46b"]+[Variation "Indian: 2.Nf3 b5 3.g3"]+[Result "*"]+1.d4 Nf6 2.Nf3 b5 3.g3 *++[ECO "A46c"]+[Variation "Neo-Benoni"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 *++[ECO "A46c"]+[Variation "Neo-Benoni 3.dxc5"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.dxc5 *++[ECO "A46c"]+[Variation "Neo-Benoni: 3.e3"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.e3 *++[ECO "A46c"]+[Variation "Neo-Benoni: 3.e3 cxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.e3 cxd4 *++[ECO "A46d"]+[Variation "Neo-Benoni: 3.c3"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.c3 *++[ECO "A46d"]+[Variation "Neo-Benoni: 3.c3 cxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.c3 cxd4 *++[ECO "A46d"]+[Variation "Neo-Benoni: 3.c3 b6"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.c3 b6 *++[ECO "A46d"]+[Variation "Neo-Benoni: 3.c3 g6"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.c3 g6 *++[ECO "A46e"]+[Variation "Neo-Benoni: 3.c3 e6"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.c3 e6 *++[ECO "A46f"]+[Variation "Neo-Benoni: 3.g3"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.g3 *++[ECO "A46f"]+[Variation "Neo-Benoni: 3.g3 cxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.g3 cxd4 *++[ECO "A46f"]+[Variation "Neo-Benoni: 3.g3 cxd4 4.Nxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 c5 3.g3 cxd4 4.Nxd4 *++[ECO "A46g"]+[Variation "Indian: 2.Nf3 d6"]+[Result "*"]+1.d4 Nf6 2.Nf3 d6 *++[ECO "A46h"]+[Variation "Indian: 2.Nf3 d6 3.g3"]+[Result "*"]+1.d4 Nf6 2.Nf3 d6 3.g3 *++[ECO "A46i"]+[Variation "Indian: 2.Nf3 d6 3.Bg5"]+[Result "*"]+1.d4 Nf6 2.Nf3 d6 3.Bg5 *++[ECO "A46i"]+[Variation "Indian: 2.Nf3 d6 3.Bg5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.Nf3 d6 3.Bg5 Nbd7 *++[ECO "A46j"]+[Variation "Indian: 2.Nf3 e6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 *++[ECO "A46j"]+[Variation "Indian: 2.Nf3 e6 3.c3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.c3 *++[ECO "A46j"]+[Variation "Indian: 2.Nf3 e6 3.c3 b6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.c3 b6 *++[ECO "A46j"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.c3 b6 4.Bg5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.c3 b6 4.Bg5 *++[ECO "A46k"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.e3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.e3 *++[ECO "A46k"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.e3 c5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.e3 c5 *++[ECO "A46l"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.e3 c5 4.Bd3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.e3 c5 4.Bd3 *++[ECO "A46m"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 *++[ECO "A46m"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 b5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 b5 *++[ECO "A46m"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 b5 4.Bg2 Bb7"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 b5 4.Bg2 Bb7 *++[ECO "A46n"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 b5 4.Bg2 Bb7 5.O-O"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 b5 4.Bg2 Bb7 5.O-O *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 cxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 cxd4 *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Nc6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Nc6 *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Qc7"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Qc7 *++[ECO "A46o"]+[Variation "Indian: 1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Qa5+"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 Qa5+ *++[ECO "A46p"]+[Variation "Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 *++[ECO "A46p"]+[Variation "Indian: London, 3...c5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 c5 *++[ECO "A46p"]+[Variation "Indian: London, 3...c5 4.e3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 c5 4.e3 *++[ECO "A46p"]+[Variation "Indian: London, 3...c5 4.e3 Qb6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 c5 4.e3 Qb6 *++[ECO "A46q"]+[Variation "Indian: London, 3...c5 4.c3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 c5 4.c3 *++[ECO "A46r"]+[Variation "Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 *++[ECO "A46r"]+[Variation "Torre Attack: 3...b6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 b6 *++[ECO "A46r"]+[Variation "Torre Attack: 3...Be7"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 Be7 *++[ECO "A46s"]+[Variation "Torre Attack: 3...c5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 *++[ECO "A46s"]+[Variation "Torre Attack: Wagner Gambit"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e4 *++[ECO "A46t"]+[Variation "Torre Attack: 3...c5 4.c3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.c3 *++[ECO "A46t"]+[Variation "Torre Attack: 3...c5 4.c3 Qb6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.c3 Qb6 *++[ECO "A46t"]+[Variation "Torre Attack: 3...c5 4.c3 h6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.c3 h6 *++[ECO "A46t"]+[Variation "Torre Attack: 3...c5 4.c3 h6 5.Bh4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.c3 h6 5.Bh4 *++[ECO "A46u"]+[Variation "Torre Attack: 3...c5 4.e3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 *++[ECO "A46u"]+[Variation "Torre Attack: 3...c5 4.e3 cxd4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 cxd4 *++[ECO "A46u"]+[Variation "Torre Attack: 3...c5 4.e3 Qb6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 Qb6 *++[ECO "A46v"]+[Variation "Torre Attack: 3...c5 4.e3 Be7"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 Be7 *++[ECO "A46w"]+[Variation "Torre Attack: 3...c5 4.e3 h6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 h6 *++[ECO "A46w"]+[Variation "Torre Attack: 3...c5 4.e3 h6 5.Bh4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e3 h6 5.Bh4 *++[ECO "A46x"]+[Variation "Torre Attack: 3...h6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 *++[ECO "A46x"]+[Variation "Torre Attack: 3...h6 4.Bh4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bh4 *++[ECO "A46x"]+[Variation "Torre Attack: 3...h6 4.Bh4 g5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bh4 g5 *++[ECO "A46y"]+[Variation "Torre Attack: 3...h6 4.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 *++[ECO "A46y"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 *++[ECO "A46y"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 b6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 b6 *++[ECO "A46y"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 c5"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 c5 *++[ECO "A46z"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 d6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 *++[ECO "A46z"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 *++[ECO "A46z"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 g6"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 g6 *++[ECO "A46z"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 Nd7"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 Nd7 *++[ECO "A46z"]+[Variation "Torre Attack: 3...h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 Nd7 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 Nd7 7.Qd2 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 e6 4.e3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 e6 4.e3 c5 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 Bb7 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 Bb7 4.e3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bf4 Bb7 4.e3 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bg5 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.Bg5 Bb7 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 e6 4.Bd3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 e6 4.Bd3 c5 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 Bb7 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 Bb7 4.Bd3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 Bb7 4.Bd3 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 Bb7 4.Bd3 e6 5.O-O *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.e3 Bb7 4.Bd3 e6 5.O-O c5 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 *++[ECO "A47"]+[Variation "Neo-Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 e6 *++[ECO "A47"]+[Variation "Neo-Queen's Indian: Marienbad System"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 c5 *++[ECO "A47"]+[Variation "Neo-Queen's Indian: Marienbad System, Berg Variation"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 c5 5.c4 cxd4 6.Qxd4 *++[ECO "A48a"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 *++[ECO "A48a"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Nbd2 *++[ECO "A48b"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.c3 *++[ECO "A48b"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.c3 Bg7 *++[ECO "A48c"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.e3 *++[ECO "A48c"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.e3 Bg7 *++[ECO "A48d"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.e3 c5 *++[ECO "A48e"]+[Variation "Neo-King's Indian"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Nc3 *++[ECO "A48f"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 *++[ECO "A48g"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 *++[ECO "A48h"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.Nbd2 *++[ECO "A48i"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.c3 *++[ECO "A48j"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.e3 *++[ECO "A48j"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.e3 O-O *++[ECO "A48k"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.e3 O-O 5.Be2 *++[ECO "A48k"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.e3 O-O 5.Be2 d6 *++[ECO "A48l"]+[Variation "Neo-King's Indian: London System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 Bg7 4.e3 O-O 5.Be2 d6 6.h3 *++[ECO "A48m"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 *++[ECO "A48n"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Ne4 *++[ECO "A48o"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 *++[ECO "A48o"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.c3 *++[ECO "A48o"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.e3 *++[ECO "A48p"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nc3 *++[ECO "A48q"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 *++[ECO "A48r"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O *++[ECO "A48s"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.e4 *++[ECO "A48t"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.e4 d6 *++[ECO "A48u"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.e4 d5 *++[ECO "A48v"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.c3 *++[ECO "A48v"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.c3 d6 *++[ECO "A48w"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.c3 d6 6.e4 *++[ECO "A48x"]+[Variation "Neo-King's Indian: Torre Attack"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 O-O 5.c3 d6 6.e4 c5 *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O *++[ECO "A49"]+[Variation "Neo-King's Indian: Double Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.b3 d6 6.Bb2 *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O *++[ECO "A49"]+[Variation "Neo-King's Indian: Fianchetto System"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d6 *++[ECO "A50a"]+[Variation "Indian: 2.c4"]+[Result "*"]+1.d4 Nf6 2.c4 *++[ECO "A50b"]+[Variation "Indian: Mexican Defence (Two Knights Tango)"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 *++[ECO "A50c"]+[Variation "Indian: Mexican Defence, 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nc3 *++[ECO "A50d"]+[Variation "Indian: Mexican Defence, 3.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nf3 *++[ECO "A50d"]+[Variation "Indian: Mexican Defence, 3.Nf3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nf3 d6 *++[ECO "A50e"]+[Variation "Indian: Mexican Defence, 3.Nf3 e6"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nf3 e6 *++[ECO "A50f"]+[Variation "Indian: Mexican Defence, 3.Nf3 e6 4.a3"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nf3 e6 4.a3 *++[ECO "A50g"]+[Variation "Indian: Mexican Defence, 3.Nf3 e6 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 3.Nf3 e6 4.Nc3 *++[ECO "A50h"]+[Variation "Indian: Slav-Indian"]+[Result "*"]+1.d4 Nf6 2.c4 c6 *++[ECO "A50i"]+[Variation "Indian: Slav-Indian, 3.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c6 3.Nf3 *++[ECO "A50j"]+[Variation "Indian: Slav-Indian, 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 c6 3.Nc3 *++[ECO "A50k"]+[Variation "Indian: 2.c4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 a6 *++[ECO "A50l"]+[Variation "Indian: Queen's Indian Accelerated"]+[Result "*"]+1.d4 Nf6 2.c4 b6 *++[ECO "A50m"]+[Variation "Indian: Queen's Indian Accelerated"]+[Result "*"]+1.d4 Nf6 2.c4 b6 3.Nc3 Bb7 *++[ECO "A50n"]+[Variation "Indian: Queen's Indian Accelerated"]+[Result "*"]+1.d4 Nf6 2.c4 b6 3.Nc3 Bb7 4.Qc2 *++[ECO "A51a"]+[Variation "Budapest"]+[Result "*"]+1.d4 Nf6 2.c4 e5 *++[ECO "A51b"]+[Variation "Budapest: 3.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.e3 *++[ECO "A51c"]+[Variation "Budapest: 3.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.d5 *++[ECO "A51d"]+[Variation "Budapest: 3.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 *++[ECO "A51d"]+[Variation "Budapest: Fajarowicz"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 *++[ECO "A51e"]+[Variation "Budapest: Fajarowicz, Steiner Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Qc2 *++[ECO "A51f"]+[Variation "Budapest: Fajarowicz, 4.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Nd2 *++[ECO "A51g"]+[Variation "Budapest: Fajarowicz, 4.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.a3 *++[ECO "A51h"]+[Variation "Budapest: Fajarowicz, 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Nf3 *++[ECO "A51i"]+[Variation "Budapest: Fajarowicz, 4.Nf3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Nf3 Bb4+ *++[ECO "A51j"]+[Variation "Budapest: Fajarowicz, 4.Nf3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Nf3 Nc6 *++[ECO "A51k"]+[Variation "Budapest: Fajarowicz, 4.Nf3 Nc6 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Nf3 Nc6 5.a3 *++[ECO "A52a"]+[Variation "Budapest: 3...Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 *++[ECO "A52b"]+[Variation "Budapest: 3...Ng4 4.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e3 *++[ECO "A52c"]+[Variation "Budapest: Alekhine Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 *++[ECO "A52c"]+[Variation "Budapest: Alekhine, Balogh Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 d6 *++[ECO "A52d"]+[Variation "Budapest: Alekhine, Abonyi Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 Nxe5 5.f4 Nec6 *++[ECO "A52e"]+[Variation "Budapest: Adler Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Nf3 *++[ECO "A52f"]+[Variation "Budapest: Adler, 4...Bc5"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Nf3 Bc5 *++[ECO "A52g"]+[Variation "Budapest: Adler, 4...Bc5 5.e3 Nc6 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Nf3 Bc5 5.e3 Nc6 6.Be2 *++[ECO "A52h"]+[Variation "Budapest: Rubinstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 *++[ECO "A52i"]+[Variation "Budapest: Rubinstein, 4...Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 Bb4+ *++[ECO "A52j"]+[Variation "Budapest: Rubinstein, 4...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 Nc6 *++[ECO "A52k"]+[Variation "Budapest: Rubinstein, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 Nc6 5.Nf3 Bb4+ *++[ECO "A52l"]+[Variation "Budapest: Rubinstein, Main Line, 6.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 Nc6 5.Nf3 Bb4+ 6.Nbd2 *++[ECO "A52m"]+[Variation "Budapest: Rubinstein, Main Line, 6.Nbd2 Qe7 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 Nc6 5.Nf3 Bb4+ 6.Nbd2 Qe7 7.e3 *++[ECO "A53"]+[Variation "Old Indian"]+[Result "*"]+1.d4 Nf6 2.c4 d6 *++[ECO "A53"]+[Variation "Old Indian: 3.g3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.g3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 c6 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 Nbd7 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 Bf5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 Bf5 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 Bg4 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 Bg4 4.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 Bg4 4.Qb3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nf3 Bg4 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nf3 Bg4 4.Nc3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 c6 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 4.Nf3 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7 4.e4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 4.e4 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7 4.e4 e5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 4.e4 e5 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7 4.e4 e5 5.d5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 4.e4 e5 5.d5 *++[ECO "A53"]+[Variation "Old Indian: 3.Nc3 Nbd7 4.e4 e5 5.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Nbd7 4.e4 e5 5.Nge2 *++[ECO "A53"]+[Variation "Old Indian: Janowski"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Bf5 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 *++[ECO "A53"]+[Variation "Old Indian: Ukranian, 4.e4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.e4 *++[ECO "A53"]+[Variation "Old Indian: Ukranian, 4.e3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.e3 *++[ECO "A53"]+[Variation "Old Indian: Dus-Khotimirsky"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.e3 Nbd7 5.Bd3 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, 4.d5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.d5 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, 4.d5 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.d5 Be7 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, 4.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.dxe5 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.dxe5 dxe5 5.Qxd8+ Kxd8 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, Queenswap, 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.dxe5 dxe5 5.Qxd8+ Kxd8 6.Nf3 *++[ECO "A53"]+[Variation "Old Indian: Ukrainian, Queenswap, 6.Nf3 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.dxe5 dxe5 5.Qxd8+ Kxd8 6.Nf3 Nfd7 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 exd4 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nc6 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3 e4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 e4 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3 e4 5.Ng5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 e4 5.Ng5 *++[ECO "A54"]+[Variation "Old Indian: 4.Nf3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 *++[ECO "A54"]+[Variation "Old Indian: 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e3 *++[ECO "A54"]+[Variation "Old Indian: 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 c6 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 c6 6.Bg2 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 g6 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 g6 6.Bg2 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 g6 6.Bg2 Bg7 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 6.Bg2 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 6.Bg2 O-O *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 6.Bg2 O-O 7.O-O *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 6.Bg2 O-O 7.O-O c6 *++[ECO "A54"]+[Variation "Old Indian: 5.g3 Be7, Main Line, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.g3 Be7 6.Bg2 O-O 7.O-O c6 8.Qc2 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 c6 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 6.e3 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7 6.e3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 6.e3 c6 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7 6.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 6.e3 O-O *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7 6.e3 O-O 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 6.e3 O-O 7.Qc2 *++[ECO "A54"]+[Variation "Old Indian: 5.Bg5 Be7 6.e3 O-O 7.Qc2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.Bg5 Be7 6.e3 O-O 7.Qc2 c6 *++[ECO "A55a"]+[Variation "Old Indian: 5.e4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 *++[ECO "A55b"]+[Variation "Old Indian: 5.e4 g6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 g6 *++[ECO "A55c"]+[Variation "Old Indian: 5.e4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 c6 *++[ECO "A55c"]+[Variation "Old Indian: 5.e4 c6 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 c6 6.Be2 *++[ECO "A55d"]+[Variation "Old Indian: 5.e4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 O-O *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O *++[ECO "A55e"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O Qc7 *++[ECO "A55f"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O Re8"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O Re8 *++[ECO "A55g"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O a6 *++[ECO "A55h"]+[Variation "Old Indian: 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O a6 9.a4"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.g3 c6 7.Bg2 O-O 8.O-O a6 9.a4 *++[ECO "A55i"]+[Variation "Old Indian: 5.e4 Be7 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 *++[ECO "A55i"]+[Variation "Old Indian: 5.e4 Be7 6.Be2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 O-O *++[ECO "A55j"]+[Variation "Old Indian: 5.e4 Be7 6.Be2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 *++[ECO "A55j"]+[Variation "Old Indian: 5.e4 Be7 6.Be2 c6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O *++[ECO "A55j"]+[Variation "Old Indian: 5.e4 Be7 6.Be2 c6 7.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O a6 *++[ECO "A55k"]+[Variation "Old Indian: Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O *++[ECO "A55l"]+[Variation "Old Indian: Main Line, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.h3 *++[ECO "A55m"]+[Variation "Old Indian: Main Line, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Be3 *++[ECO "A55n"]+[Variation "Old Indian: Main Line, 8.Be3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Be3 a6 *++[ECO "A55o"]+[Variation "Old Indian: Main Line, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Qc2 *++[ECO "A55o"]+[Variation "Old Indian: Main Line, 8.Qc2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Qc2 Re8 *++[ECO "A55o"]+[Variation "Old Indian: Main Line, 8.Qc2 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Qc2 Qc7 *++[ECO "A55p"]+[Variation "Old Indian: Main Line, 8.Qc2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Qc2 a6 *++[ECO "A55q"]+[Variation "Old Indian: Main Line, 8.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Re1 *++[ECO "A55r"]+[Variation "Old Indian: Main Line, 8.Re1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Re1 Re8 *++[ECO "A55s"]+[Variation "Old Indian: Main Line, 8.Re1 a6"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Re1 a6 *++[ECO "A55t"]+[Variation "Old Indian: Main Line, 8.Re1 a6 9.Bf1"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 Be7 6.Be2 c6 7.O-O O-O 8.Re1 a6 9.Bf1 *++[ECO "A56a"]+[Variation "Benoni: 2...c5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 *++[ECO "A56b"]+[Variation "Benoni: 2...c5 3.e3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.e3 *++[ECO "A56b"]+[Variation "Benoni: 2...c5 3.e3 e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.e3 e6 *++[ECO "A56c"]+[Variation "Benoni: 2...c5 3.e3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.e3 g6 *++[ECO "A56d"]+[Variation "Benoni: 2...c5 3.e3 g6 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.e3 g6 4.Nc3 *++[ECO "A56e"]+[Variation "Benoni: 3.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.dxc5 *++[ECO "A56f"]+[Variation "Benoni: 3.d5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 *++[ECO "A56g"]+[Variation "Benoni: 3.d5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 a6 *++[ECO "A56h"]+[Variation "Benoni: 3.d5 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 *++[ECO "A56h"]+[Variation "Benoni: 3.d5 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 *++[ECO "A56i"]+[Variation "Benoni: 3.d5 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 *++[ECO "A56j"]+[Variation "Benoni: 3.d5 d6 4.Nc3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 4.Nc3 g6 *++[ECO "A56j"]+[Variation "Benoni: Bronstein's Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 d6 5.e4 b5 *++[ECO "A56k"]+[Variation "Benoni: 3.d5 d6 4.Nc3 g6 5.e4 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 4.Nc3 g6 5.e4 Bg7 *++[ECO "A56l"]+[Variation "Benoni: 3.d5 d6 4.Nc3 g6 5.e4 Bg7 6.f3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 4.Nc3 g6 5.e4 Bg7 6.f3 *++[ECO "A56m"]+[Variation "Benoni: 3.d5 d6 4.Nc3 g6 5.e4 Bg7 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 4.Nc3 g6 5.e4 Bg7 6.Bd3 *++[ECO "A56n"]+[Variation "Benoni: Vulture"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 Ne4 *++[ECO "A56o"]+[Variation "Benoni: Czech"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 *++[ECO "A56p"]+[Variation "Benoni: Czech, 4.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 *++[ECO "A56q"]+[Variation "Benoni: Czech, 5.e4 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 g6 *++[ECO "A56r"]+[Variation "Benoni: Czech, 5.e4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 *++[ECO "A56s"]+[Variation "Benoni: Czech, 5.e4 Be7 6.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.g3 *++[ECO "A56s"]+[Variation "Benoni: Czech, 5.e4 Be7 6.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.g3 O-O *++[ECO "A56s"]+[Variation "Benoni: Czech, 5.e4 Be7 6.g3 O-O 7.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.g3 O-O 7.Bg2 *++[ECO "A56t"]+[Variation "Benoni: Czech, 5.e4 Be7 6.g3 O-O 7.Bg2 Ne8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.g3 O-O 7.Bg2 Ne8 *++[ECO "A56u"]+[Variation "Benoni: Czech, 5.e4 Be7 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.Bd3 *++[ECO "A56v"]+[Variation "Benoni: Czech, 5.e4 Be7 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.Nf3 *++[ECO "A56w"]+[Variation "Benoni: Czech, 5.e4 Be7 6.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.Nf3 O-O *++[ECO "A56w"]+[Variation "Benoni: Czech, 5.e4 Be7 6.Nf3 O-O 7.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.Nf3 O-O 7.h3 *++[ECO "A56x"]+[Variation "Benoni: Czech, 5.e4 Be7 6.Nf3 O-O 7.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 Be7 6.Nf3 O-O 7.Be2 *++[ECO "A57a"]+[Variation "Benko Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 *++[ECO "A57b"]+[Variation "Benko Gambit: 4.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.a4 *++[ECO "A57c"]+[Variation "Benko Gambit: 4.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nd2 *++[ECO "A57d"]+[Variation "Benko Gambit: 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 *++[ECO "A57d"]+[Variation "Benko Gambit: 4.Nf3 bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 bxc4 *++[ECO "A57e"]+[Variation "Benko Gambit: 4.Nf3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 Bb7 *++[ECO "A57e"]+[Variation "Benko Gambit: 4.Nf3 Bb7 5.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 Bb7 5.a4 *++[ECO "A57f"]+[Variation "Benko Gambit: 4.Nf3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 g6 *++[ECO "A57g"]+[Variation "Benko Gambit: 4.Nf3 g6 5.cxb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 g6 5.cxb5 *++[ECO "A57g"]+[Variation "Benko Gambit: 4.Nf3 g6 5.cxb5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 g6 5.cxb5 a6 *++[ECO "A57h"]+[Variation "Benko Gambit: 4.cxb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 *++[ECO "A57h"]+[Variation "Benko Gambit: 4.cxb5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 *++[ECO "A57i"]+[Variation "Benko Gambit: 4.cxb5 a6 5.b6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.b6 *++[ECO "A57j"]+[Variation "Benko Gambit: 4.cxb5 a6 5.b6 Qxb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.b6 Qxb6 *++[ECO "A57k"]+[Variation "Benko Gambit: 4.cxb5 a6 5.b6 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.b6 d6 *++[ECO "A57l"]+[Variation "Benko Gambit: 4.cxb5 a6 5.b6 e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.b6 e6 *++[ECO "A57m"]+[Variation "Benko Gambit: 4.cxb5 a6 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.e3 *++[ECO "A57n"]+[Variation "Benko Gambit: 4.cxb5 a6 5.e3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.e3 g6 *++[ECO "A57n"]+[Variation "Benko Gambit: 4.cxb5 a6 5.e3 g6 6.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.e3 g6 6.Nc3 d6 *++[ECO "A57n"]+[Variation "Benko Gambit: 4.cxb5 a6 5.e3 g6 6.Nc3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.e3 g6 6.Nc3 Bg7 *++[ECO "A57o"]+[Variation "Benko Gambit: 4.cxb5 a6 5.f3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.f3 *++[ECO "A57p"]+[Variation "Benko Gambit: 4.cxb5 a6 5.f3 e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.f3 e6 *++[ECO "A57q"]+[Variation "Benko Gambit: 4.cxb5 a6 5.f3 axb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.f3 axb5 *++[ECO "A57r"]+[Variation "Benko Gambit: Zaitsev Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 *++[ECO "A57r"]+[Variation "Benko Gambit: Zaitsev, 5...Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 Qa5 *++[ECO "A57s"]+[Variation "Benko Gambit: Zaitsev, 5...axb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 *++[ECO "A57s"]+[Variation "Benko Gambit: Zaitsev, 5...axb5 6.e4 b4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 *++[ECO "A57t"]+[Variation "Benko Gambit: Zaitsev, 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 7.Nb5 d6 8.Nf3 *++[ECO "A57u"]+[Variation "Benko Gambit: Zaitsev, Nescafe Frappe Attack"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 7.Nb5 d6 8.Bc4 *++[ECO "A57v"]+[Variation "Benko Gambit: Zaitsev, 8.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 7.Nb5 d6 8.Bf4 *++[ECO "A57w"]+[Variation "Benko Gambit: Zaitsev, 8.Bf4 g5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 7.Nb5 d6 8.Bf4 g5 *++[ECO "A58a"]+[Variation "Benko Gambit: 5.bxa6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 *++[ECO "A58b"]+[Variation "Benko Gambit: 5.bxa6 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 g6 *++[ECO "A58c"]+[Variation "Benko Gambit: 5.bxa6 Bxa6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 *++[ECO "A58c"]+[Variation "Benko Gambit: Accepted, 6.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.g3 *++[ECO "A58d"]+[Variation "Benko Gambit: Accepted, 6.g3 d6 7.Bg2 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.g3 d6 7.Bg2 g6 *++[ECO "A58d"]+[Variation "Benko Gambit: Accepted, 6.g3 d6 7.Bg2 g6 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.g3 d6 7.Bg2 g6 8.b3 *++[ECO "A58e"]+[Variation "Benko Gambit: Accepted, 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 *++[ECO "A58f"]+[Variation "Benko Gambit: Accepted, 6.Nc3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 g6 *++[ECO "A58g"]+[Variation "Benko Gambit: Accepted, 6.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 *++[ECO "A58g"]+[Variation "Benko Gambit: Accepted, 7.f4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.f4 *++[ECO "A58g"]+[Variation "Benko Gambit: Accepted, 7.f4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.f4 g6 *++[ECO "A58h"]+[Variation "Benko Gambit: Accepted, 7.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.g3 *++[ECO "A58h"]+[Variation "Benko Gambit: Accepted, 7.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.g3 g6 *++[ECO "A58i"]+[Variation "Benko Gambit: Accepted, 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 *++[ECO "A58i"]+[Variation "Benko Gambit: Accepted, 7.Nf3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 *++[ECO "A58j"]+[Variation "Benko Gambit: Accepted, 7.Nf3 g6 8.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.Nd2 *++[ECO "A58j"]+[Variation "Benko Gambit: Accepted, 7.Nf3 g6 8.Nd2 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.Nd2 Qa5 *++[ECO "A58j"]+[Variation "Benko Gambit: Accepted, 7.Nf3 g6 8.Nd2 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.Nd2 Bg7 *++[ECO "A58k"]+[Variation "Benko Gambit: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 *++[ECO "A58k"]+[Variation "Benko Gambit: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 *++[ECO "A58l"]+[Variation "Benko Gambit: Fianchetto, 9.Bh3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bh3 *++[ECO "A58m"]+[Variation "Benko Gambit: Fianchetto, 9.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 *++[ECO "A58m"]+[Variation "Benko Gambit: Fianchetto, 9...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 Nbd7 *++[ECO "A58n"]+[Variation "Benko Gambit: Fianchetto, 9...Nbd7 10.O-O Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 Nbd7 10.O-O Nb6 *++[ECO "A58o"]+[Variation "Benko Gambit: Fianchetto, 9...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O *++[ECO "A58p"]+[Variation "Benko Gambit: Fianchetto, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O 10.O-O Nbd7 *++[ECO "A58q"]+[Variation "Benko Gambit: Fianchetto, Main Line, 11.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O 10.O-O Nbd7 11.Rb1 *++[ECO "A58r"]+[Variation "Benko Gambit: Fianchetto, Main Line, 11.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O 10.O-O Nbd7 11.Re1 *++[ECO "A58s"]+[Variation "Benko Gambit: Fianchetto, Main Line, 11.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O 10.O-O Nbd7 11.Qc2 *++[ECO "A58t"]+[Variation "Benko Gambit: Fianchetto, Main Line, 11.Qc2 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 Bg7 9.Bg2 O-O 10.O-O Nbd7 11.Qc2 Qb6 *++[ECO "A59a"]+[Variation "Benko Gambit: 7.e4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 *++[ECO "A59b"]+[Variation "Benko Gambit: 7.e4 Bxf1 8.Kxf1 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 *++[ECO "A59c"]+[Variation "Benko Gambit: 7.e4 Line, 9.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.Nge2 *++[ECO "A59d"]+[Variation "Benko Gambit: 7.e4 Line, 9.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.Nf3 *++[ECO "A59e"]+[Variation "Benko Gambit: 7.e4 Line, 9.Nf3 Bg7 10.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.Nf3 Bg7 10.h3 *++[ECO "A59f"]+[Variation "Benko Gambit: 7.e4 Line, 9.Nf3 Bg7 10.h3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.Nf3 Bg7 10.h3 Nbd7 *++[ECO "A59g"]+[Variation "Benko Gambit: 7.e4 Line, 9.g4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g4 *++[ECO "A59h"]+[Variation "Benko Gambit: 7.e4 Line, 9.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 *++[ECO "A59i"]+[Variation "Benko Gambit: 7.e4, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 *++[ECO "A59j"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 *++[ECO "A59k"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.Re1 *++[ECO "A59l"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.Re1 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.Re1 Qa5 *++[ECO "A59m"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.Re1 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.Re1 Ng4 *++[ECO "A59n"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 *++[ECO "A59o"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Ra6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Ra6 *++[ECO "A59o"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Ra6 13.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Ra6 13.Re1 *++[ECO "A59p"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Qb6 *++[ECO "A59p"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Qb6 13.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Qb6 13.Re1 *++[ECO "A59q"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Qa5 *++[ECO "A59q"]+[Variation "Benko Gambit: 7.e4, Main Line, 11...Nbd7 12.h3 Qa5 13.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 Nbd7 12.h3 Qa5 13.Re1 *++[ECO "A60a"]+[Variation "Benoni: 3.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 *++[ECO "A60b"]+[Variation "Benoni: 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nf3 *++[ECO "A60c"]+[Variation "Benoni: 4.Nf3 exd5 5.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nf3 exd5 5.cxd5 *++[ECO "A60d"]+[Variation "Benoni: Snake Variation vs. 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nf3 exd5 5.cxd5 Bd6 *++[ECO "A60e"]+[Variation "Benoni: 4.g3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.g3 *++[ECO "A60f"]+[Variation "Benoni: 4.g3 exd5 5.cxd5 b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.g3 exd5 5.cxd5 b5 *++[ECO "A60g"]+[Variation "Benoni: 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 *++[ECO "A60h"]+[Variation "Benoni: 4.Nc3 exd5 5.Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.Nxd5 *++[ECO "A60i"]+[Variation "Benoni: 4.Nc3 exd5 5.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 *++[ECO "A60j"]+[Variation "Benoni: Snake Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 Bd6 *++[ECO "A60k"]+[Variation "Benoni: Snake, 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 Bd6 6.Nf3 *++[ECO "A60l"]+[Variation "Benoni: Snake, 6.Nf3 Bc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 Bd6 6.Nf3 Bc7 *++[ECO "A60m"]+[Variation "Benoni: Snake, 6.e4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 Bd6 6.e4 *++[ECO "A60n"]+[Variation "Benoni: Snake, 6.e4 O-O 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 Bd6 6.e4 O-O 7.Nf3 *++[ECO "A60o"]+[Variation "Benoni: 4.Nc3 exd5 5.cxd5 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 g6 *++[ECO "A60p"]+[Variation "Benoni: 4.Nc3 exd5 5.cxd5 d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 *++[ECO "A60q"]+[Variation "Benoni: 4.Nc3 exd5 5.cxd5 d6 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.h3 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bf4 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.Bf4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bf4 a6 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.Bf4 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bf4 Bg7 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.Bf4 Bg7 8.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bf4 Bg7 8.Nd2 *++[ECO "A61"]+[Variation "Benoni: 6.Nf3 g6 7.Bf4 Bg7 8.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bf4 Bg7 8.Qa4+ *++[ECO "A61"]+[Variation "Benoni: Uhlmann Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bg5 *++[ECO "A61"]+[Variation "Benoni: Uhlmann, 7...Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bg5 Bg7 *++[ECO "A61"]+[Variation "Benoni: Uhlmann, 7...h6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bg5 h6 *++[ECO "A61"]+[Variation "Benoni: Nimzowitsch Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 *++[ECO "A61"]+[Variation "Benoni: Nimzowitsch, 7...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 Nbd7 *++[ECO "A61"]+[Variation "Benoni: Nimzowitsch, 7...Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 Bg7 *++[ECO "A61"]+[Variation "Benoni: Nimzowitsch, 7...Bg7 8.Nc4 O-O 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 Bg7 8.Nc4 O-O 9.Bf4 *++[ECO "A61"]+[Variation "Benoni: Nimzowitsch, 7...Bg7 8.Nc4 O-O 9.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 Bg7 8.Nc4 O-O 9.Bg5 *++[ECO "A61"]+[Variation "Benoni: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 8.Bg2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 9.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O a6 *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 9.O-O Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Na6 *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 9.O-O Na6 10.Nd2 Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Na6 10.Nd2 Nc7 *++[ECO "A62"]+[Variation "Benoni: Fianchetto, 9.O-O Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Re8 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...Nbd7 10.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...Nbd7 10.Nd2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 Re8 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...a6 10.a4 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O a6 10.a4 Nbd7 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...Nbd7 10.Nd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 *++[ECO "A63"]+[Variation "Benoni: Fianchetto, 9...Nbd7 10.Nd2 a6 11.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.a5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.a5 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.Nc4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.Nc4 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.Nc4 Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.Nc4 Ne5 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.h3 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.h3 Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.h3 Rb8 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.h3 Rb8 13.Nc4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.h3 Rb8 13.Nc4 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.h3 Rb8 13.Nc4 Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.h3 Rb8 13.Nc4 Ne5 *++[ECO "A64"]+[Variation "Benoni: Fianchetto, 11...Re8 12.h3 Rb8 13.Nc4 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 12.h3 Rb8 13.Nc4 Nb6 *++[ECO "A65a"]+[Variation "Benoni: 6.e4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 *++[ECO "A65a"]+[Variation "Benoni: 6.e4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 Be7 *++[ECO "A65b"]+[Variation "Benoni: 6.e4 g6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 *++[ECO "A65b"]+[Variation "Benoni: 6.e4 g6 7.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.h3 *++[ECO "A65c"]+[Variation "Benoni: 6.e4 g6 7.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bf4 *++[ECO "A65d"]+[Variation "Benoni: 6.e4 g6 7.Bf4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bf4 a6 *++[ECO "A65e"]+[Variation "Benoni: 6.e4 g6 7.Bf4 a6 8.Nf3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bf4 a6 8.Nf3 b5 *++[ECO "A65e"]+[Variation "Benoni: 6.e4 g6 7.Bf4 a6 8.Nf3 b5 9.Qe2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bf4 a6 8.Nf3 b5 9.Qe2 *++[ECO "A65f"]+[Variation "Benoni: 6.e4 g6 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 *++[ECO "A65f"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.h3 *++[ECO "A65g"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 *++[ECO "A65g"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O *++[ECO "A65g"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O *++[ECO "A65h"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O b6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O b6 *++[ECO "A65i"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O Na6 *++[ECO "A65j"]+[Variation "Benoni: 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O a6 *++[ECO "A65k"]+[Variation "Benoni: Saemisch (6.e4 g6 7.f3)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 *++[ECO "A65k"]+[Variation "Benoni: Saemisch, 7...Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 *++[ECO "A65l"]+[Variation "Benoni: Saemisch, 8.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Nge2 *++[ECO "A65m"]+[Variation "Benoni: Saemisch, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Be3 *++[ECO "A65n"]+[Variation "Benoni: Saemisch, 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 *++[ECO "A65n"]+[Variation "Benoni: Saemisch, 8.Bg5 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 O-O *++[ECO "A65o"]+[Variation "Benoni: Saemisch, 8.Bg5 O-O 9.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 O-O 9.Nge2 *++[ECO "A65p"]+[Variation "Benoni: Saemisch, 8.Bg5 O-O 9.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 O-O 9.Qd2 *++[ECO "A65q"]+[Variation "Benoni: Saemisch, 8.Bg5 O-O 9.Qd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 O-O 9.Qd2 a6 *++[ECO "A65r"]+[Variation "Benoni: Saemisch, 8.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 *++[ECO "A65r"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O *++[ECO "A65s"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Nge2 *++[ECO "A65t"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 *++[ECO "A65u"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 Re8 *++[ECO "A65v"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 *++[ECO "A65v"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 *++[ECO "A65w"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 h5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 h5 *++[ECO "A65x"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Nbd7 *++[ECO "A65y"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Re8 *++[ECO "A65y"]+[Variation "Benoni: Saemisch, 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Re8 12.Nge2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 Bg7 8.Bg5 h6 9.Be3 O-O 10.Qd2 a6 11.a4 Re8 12.Nge2 Nbd7 *++[ECO "A66"]+[Variation "Benoni: Four Pawns Attack"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 *++[ECO "A66"]+[Variation "Benoni: Four Pawns Attack"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 *++[ECO "A66"]+[Variation "Benoni: Four Pawns, Mikenas Attack"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 8...dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 dxe5 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 8...Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 8...Nfd7 9.e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.e6 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 8...Nfd7 9.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.Nf3 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 8...Nfd7 9.Nb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.Nb5 *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 9.Nb5 dxe5 10.Nd6+"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.Nb5 dxe5 10.Nd6+ *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 9.Nb5 dxe5 10.Nd6+ Ke7 11.Nxc8+"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.Nb5 dxe5 10.Nd6+ Ke7 11.Nxc8+ *++[ECO "A66"]+[Variation "Benoni: Mikenas Attack, 9.Nb5 dxe5 10.Nd6+ Ke7 11.Nxc8+ Qxc8 12.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 Nfd7 9.Nb5 dxe5 10.Nd6+ Ke7 11.Nxc8+ Qxc8 12.Nf3 *++[ECO "A67a"]+[Variation "Benoni: Four Pawns, Taimanov (Alatortsev) Variation"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ *++[ECO "A67b"]+[Variation "Benoni: Four Pawns, Taimanov, 8...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nbd7 *++[ECO "A67c"]+[Variation "Benoni: Four Pawns, Taimanov, 8...Nbd7 9.e5 dxe5 10.fxe5 Nh5 11.e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nbd7 9.e5 dxe5 10.fxe5 Nh5 11.e6 *++[ECO "A67d"]+[Variation "Benoni: Four Pawns, Taimanov, 8...Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 *++[ECO "A67e"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 *++[ECO "A67f"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 O-O *++[ECO "A67g"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3 O-O 10.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 O-O 10.Nf3 *++[ECO "A67h"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3 O-O 10.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 O-O 10.Nf3 a6 *++[ECO "A67i"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3 O-O 10.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 O-O 10.Nf3 a6 11.a4 *++[ECO "A67j"]+[Variation "Benoni: Four Pawns, Taimanov, 9.Bd3 O-O 10.Nf3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.Bd3 O-O 10.Nf3 Na6 *++[ECO "A67k"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 (Zaitsev)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 *++[ECO "A67l"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 Qh4+"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 Qh4+ *++[ECO "A67m"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 a6 *++[ECO "A67n"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 a6 10.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 a6 10.Bd3 *++[ECO "A67o"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 a6 10.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 a6 10.Be2 *++[ECO "A67p"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 O-O *++[ECO "A67q"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 O-O 10.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 O-O 10.Nf3 *++[ECO "A67r"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 O-O 10.Nf3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 O-O 10.Nf3 Na6 *++[ECO "A67s"]+[Variation "Benoni: Four Pawns, Taimanov, 9.a4 O-O 10.Nf3 Na6 11.O-O Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 O-O 10.Nf3 Na6 11.O-O Nc7 *++[ECO "A68a"]+[Variation "Benoni: Four Pawns, 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 *++[ECO "A68a"]+[Variation "Benoni: Four Pawns, 8.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O *++[ECO "A68b"]+[Variation "Benoni: Four Pawns, 9.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Bd3 *++[ECO "A68c"]+[Variation "Benoni: Four Pawns, 9.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 *++[ECO "A68d"]+[Variation "Benoni: Four Pawns, 9.Be2 b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 b5 *++[ECO "A68e"]+[Variation "Benoni: Four Pawns, 9.Be2 b5 10.e5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 b5 10.e5 *++[ECO "A68f"]+[Variation "Benoni: Four Pawns, 9.Be2 b5 10.e5 dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 b5 10.e5 dxe5 *++[ECO "A68g"]+[Variation "Benoni: Four Pawns, 9.Be2 b5 10.e5 dxe5 11.fxe5 Ng4 12.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 b5 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 *++[ECO "A68h"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 *++[ECO "A68i"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.e5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.e5 *++[ECO "A68j"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.O-O *++[ECO "A68k"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.O-O Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.O-O Nbd7 *++[ECO "A68l"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.O-O Nbd7 11.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.O-O Nbd7 11.h3 *++[ECO "A68m"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.O-O Nbd7 11.h3 Bxf3 12.Bxf3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.O-O Nbd7 11.h3 Bxf3 12.Bxf3 Re8 *++[ECO "A68n"]+[Variation "Benoni: Four Pawns, 9.Be2 Bg4 10.O-O Nbd7 11.h3 Bxf3 12.Bxf3 Re8 13.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Bg4 10.O-O Nbd7 11.h3 Bxf3 12.Bxf3 Re8 13.Re1 *++[ECO "A69a"]+[Variation "Benoni: Four Pawns, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 *++[ECO "A69b"]+[Variation "Benoni: Four Pawns, Main Line, 10.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.O-O *++[ECO "A69c"]+[Variation "Benoni: Four Pawns, Main Line, 10.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.Nd2 *++[ECO "A69d"]+[Variation "Benoni: Four Pawns, Main Line, 10.Nd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.Nd2 a6 *++[ECO "A69e"]+[Variation "Benoni: Four Pawns, Main Line, 10.Nd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.Nd2 Nbd7 *++[ECO "A69f"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 *++[ECO "A69g"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.O-O *++[ECO "A69h"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.e6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.e6 *++[ECO "A69i"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 *++[ECO "A69j"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.Bg5 f6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 f6 *++[ECO "A69k"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.Bg5 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 Qb6 *++[ECO "A69l"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.Bg5 Qb6 13.O-O Nxe5 14.Nxe5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 Qb6 13.O-O Nxe5 14.Nxe5 *++[ECO "A69m"]+[Variation "Benoni: Four Pawns, Main Line, 10.e5: 12.Bg5 Qb6 13.O-O Nxe5 14.d6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 10.e5 dxe5 11.fxe5 Ng4 12.Bg5 Qb6 13.O-O Nxe5 14.d6 *++[ECO "A70a"]+[Variation "Benoni: Classical"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 *++[ECO "A70b"]+[Variation "Benoni: Classical, 7...a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 a6 *++[ECO "A70b"]+[Variation "Benoni: Classical, 7...a6 8.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 a6 8.a4 *++[ECO "A70b"]+[Variation "Benoni: Classical, 7...a6 8.a4 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 a6 8.a4 Bg4 *++[ECO "A70c"]+[Variation "Benoni: Classical, 7...a6 8.a4 Bg4 9.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 a6 8.a4 Bg4 9.Be2 *++[ECO "A70d"]+[Variation "Benoni: Classical, 7...Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 *++[ECO "A70e"]+[Variation "Benoni: Classical, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 *++[ECO "A70e"]+[Variation "Benoni: Classical, 8.Be2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 a6 *++[ECO "A70f"]+[Variation "Benoni: Classical, 8.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Qa4+ *++[ECO "A70f"]+[Variation "Benoni: Classical, 8.Qa4+ Bd7 9.Qb3 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Qa4+ Bd7 9.Qb3 Qc7 *++[ECO "A70g"]+[Variation "Benoni: Classical, 8.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bf4 *++[ECO "A70g"]+[Variation "Benoni: Classical, 8.Bf4 O-O 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bf4 O-O 9.Nd2 *++[ECO "A70h"]+[Variation "Benoni: Classical, 8.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bd3 *++[ECO "A70i"]+[Variation "Benoni: Classical, 8.Bd3 O-O 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bd3 O-O 9.O-O *++[ECO "A70j"]+[Variation "Benoni: Classical, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 *++[ECO "A70k"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 *++[ECO "A70l"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 Bd7 *++[ECO "A70m"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 Na6 *++[ECO "A70n"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 Re8 *++[ECO "A70o"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 Re8 10.O-O c4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 Re8 10.O-O c4 *++[ECO "A70p"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 a6 *++[ECO "A70q"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 a6 10.O-O b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 a6 10.O-O b5 *++[ECO "A70r"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 a6 10.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 a6 10.a4 *++[ECO "A70s"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 a6 10.a4 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 a6 10.a4 Nbd7 *++[ECO "A70t"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 a6 10.a4 Nbd7 11.O-O Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 a6 10.a4 Nbd7 11.O-O Re8 *++[ECO "A70u"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 *++[ECO "A70v"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5 10.Bxb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 10.Bxb5 *++[ECO "A70w"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5 10.Nxb5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 10.Nxb5 *++[ECO "A70w"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5 10.Nxb5 Nxe4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 10.Nxb5 Nxe4 *++[ECO "A70x"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5 10.Nxb5 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 10.Nxb5 Re8 *++[ECO "A70y"]+[Variation "Benoni: Classical, 8.h3 O-O 9.Bd3 b5 10.Nxb5 Re8 11.O-O Nxe4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 O-O 9.Bd3 b5 10.Nxb5 Re8 11.O-O Nxe4 *++[ECO "A71"]+[Variation "Benoni: Classical, 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 *++[ECO "A71"]+[Variation "Benoni: Classical, 8.Bg5 h6 9.Bh4 g5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 h6 9.Bh4 g5 *++[ECO "A71"]+[Variation "Benoni: Classical, 8.Bg5 h6 9.Bh4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 h6 9.Bh4 a6 *++[ECO "A71"]+[Variation "Benoni: Classical, 8.Bg5 h6 9.Bh4 a6 10.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 h6 9.Bh4 a6 10.Nd2 *++[ECO "A71"]+[Variation "Benoni: Classical, 8.Bg5 h6 9.Bh4 a6 10.Nd2 b5 11.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 h6 9.Bh4 a6 10.Nd2 b5 11.Be2 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Nd2 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Bg5 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Bg5 h6 10.Bh4 g5 11.Bg3 Nh5 12.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Bg5 h6 10.Bh4 g5 11.Bg3 Nh5 12.Nd2 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Bf4 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Bf4 b5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Bf4 b5 *++[ECO "A72"]+[Variation "Benoni: Classical, 8.Be2 O-O 9.Bf4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.Bf4 a6 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Nbd7 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Na6 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Na6 10.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Na6 10.Nd2 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Na6 10.Nd2 Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Na6 10.Nd2 Nc7 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Bg4 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Bg4 10.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Bg4 10.Bg5 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Bg4 10.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Bg4 10.Bf4 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O Bg4 10.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Bg4 10.h3 *++[ECO "A73"]+[Variation "Benoni: Classical, 9.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Nbd7 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Nbd7 11.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Nbd7 11.Nd2 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Nbd7 11.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Nbd7 11.Bg5 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Nbd7 11.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Nbd7 11.Bf4 *++[ECO "A74"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Nbd7 11.Bf4 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Nbd7 11.Bf4 Qe7 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.h3 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Nd2 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bg5 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bg5 h6 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Qe7 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Re8 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Re8 12.Nd2 Bxe2 13.Qxe2 Nh5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Re8 12.Nd2 Bxe2 13.Qxe2 Nh5 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7 13.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7 13.Re1 *++[ECO "A75"]+[Variation "Benoni: Classical, 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7 with 14.a5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 11.Bf4 Bxf3 12.Bxf3 Qe7 13.Re1 Nbd7 14.a5 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 Bg4 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 Na6 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2 Na6 11.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 Na6 11.Bf4 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2 Na6 11.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 Na6 11.Re1 *++[ECO "A76"]+[Variation "Benoni: Classical, Main Line, 10.Qc2 Na6 11.Re1 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Qc2 Na6 11.Re1 Bg4 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 a6 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 a6 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 a6 12.Ra3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 a6 12.Ra3 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 a6 12.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 a6 12.Qc2 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 a6 12.h3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 a6 12.h3 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 Ne5 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 Ne5 12.Ndb1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 Ne5 12.Ndb1 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 Ne5 12.Ra3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 Ne5 12.Ra3 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 Ne5 12.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 Ne5 12.Re1 *++[ECO "A77"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Nbd7 11.a4 Ne5 12.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Nbd7 11.a4 Ne5 12.Qc2 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.Kh1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.Kh1 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.Rb1 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.Re1 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f4 *++[ECO "A78"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f4 Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f4 Nc7 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7 12.a4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 12.a4 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7 12.a4 Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 12.a4 Nd7 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7 12.a4 b6"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 12.a4 b6 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7 12.a4 b6 13.Kh1"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 12.a4 b6 13.Kh1 *++[ECO "A79"]+[Variation "Benoni: Classical, Main Line, 10.Nd2 Na6 11.f3 Nc7 12.a4 b6 13.Nc4"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 Nc7 12.a4 b6 13.Nc4 *++[ECO "A80a"]+[Variation "Dutch"]+[Result "*"]+1.d4 f5 *++[ECO "A80b"]+[Variation "Dutch: Krejcik Gambit"]+[Result "*"]+1.d4 f5 2.g4 *++[ECO "A80b"]+[Variation "Dutch: Krejcik Gambit Accepted"]+[Result "*"]+1.d4 f5 2.g4 fxg4 *++[ECO "A80c"]+[Variation "Dutch: Korchnoi Attack"]+[Result "*"]+1.d4 f5 2.h3 *++[ECO "A80c"]+[Variation "Dutch: Korchnoi, Janzen Gambit"]+[Result "*"]+1.d4 f5 2.h3 Nf6 3.g4 *++[ECO "A80d"]+[Variation "Dutch: 2.Bg5"]+[Result "*"]+1.d4 f5 2.Bg5 *++[ECO "A80d"]+[Variation "Dutch: 2.Bg5 d5"]+[Result "*"]+1.d4 f5 2.Bg5 d5 *++[ECO "A80d"]+[Variation "Dutch: 2.Bg5 c6"]+[Result "*"]+1.d4 f5 2.Bg5 c6 *++[ECO "A80e"]+[Variation "Dutch: 2.Bg5 Nf6"]+[Result "*"]+1.d4 f5 2.Bg5 Nf6 *++[ECO "A80f"]+[Variation "Dutch: 2.Bg5 h6"]+[Result "*"]+1.d4 f5 2.Bg5 h6 *++[ECO "A80g"]+[Variation "Dutch: 2.Bg5 g6"]+[Result "*"]+1.d4 f5 2.Bg5 g6 *++[ECO "A80h"]+[Variation "Dutch: 2.Bg5 g6 3.Nc3"]+[Result "*"]+1.d4 f5 2.Bg5 g6 3.Nc3 *++[ECO "A80i"]+[Variation "Dutch: Alapin"]+[Result "*"]+1.d4 f5 2.Qd3 *++[ECO "A80i"]+[Variation "Dutch: Alapin, Manhattan Gambit"]+[Result "*"]+1.d4 f5 2.Qd3 d6 3.g4 *++[ECO "A80i"]+[Variation "Dutch: Von Pretzel Gambit"]+[Result "*"]+1.d4 f5 2.Qd3 e6 3.g4 *++[ECO "A80j"]+[Variation "Dutch: 2.Nc3"]+[Result "*"]+1.d4 f5 2.Nc3 *++[ECO "A80k"]+[Variation "Dutch: 2.Nc3 d5"]+[Result "*"]+1.d4 f5 2.Nc3 d5 *++[ECO "A80k"]+[Variation "Dutch: 2.Nc3 d5, Euwe Gambit"]+[Result "*"]+1.d4 f5 2.Nc3 d5 3.e4 *++[ECO "A80l"]+[Variation "Dutch: 2.Nc3 d5 3.Bg5"]+[Result "*"]+1.d4 f5 2.Nc3 d5 3.Bg5 *++[ECO "A80m"]+[Variation "Dutch: 2.Nc3 Nf6"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 *++[ECO "A80m"]+[Variation "Dutch: Spielmann Gambit"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.g4 *++[ECO "A80n"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 *++[ECO "A80n"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5 e6"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 e6 *++[ECO "A80o"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5 d5"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 d5 *++[ECO "A80p"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6 *++[ECO "A80p"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6 5.e3"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6 5.e3 *++[ECO "A80p"]+[Variation "Dutch: 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6 5.e3 c6"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.Bg5 d5 4.Bxf6 exf6 5.e3 c6 *++[ECO "A80q"]+[Variation "Dutch: 2.Nf3"]+[Result "*"]+1.d4 f5 2.Nf3 *++[ECO "A80r"]+[Variation "Dutch: 2.Nf3 e6"]+[Result "*"]+1.d4 f5 2.Nf3 e6 *++[ECO "A80s"]+[Variation "Dutch: 2.Nf3 e6 3.d5"]+[Result "*"]+1.d4 f5 2.Nf3 e6 3.d5 *++[ECO "A80t"]+[Variation "Dutch: 2.Nf3 Nf6"]+[Result "*"]+1.d4 f5 2.Nf3 Nf6 *++[ECO "A80u"]+[Variation "Dutch: Barcza System"]+[Result "*"]+1.d4 f5 2.Nf3 Nf6 3.c3 *++[ECO "A80v"]+[Variation "Dutch: 2.Nf3 Nf6 3.Bg5"]+[Result "*"]+1.d4 f5 2.Nf3 Nf6 3.Bg5 *++[ECO "A81"]+[Variation "Dutch: 2.g3"]+[Result "*"]+1.d4 f5 2.g3 *++[ECO "A81"]+[Variation "Dutch: 2.g3 e6"]+[Result "*"]+1.d4 f5 2.g3 e6 *++[ECO "A81"]+[Variation "Dutch: 2.g3 e6 3.Nf3"]+[Result "*"]+1.d4 f5 2.g3 e6 3.Nf3 *++[ECO "A81"]+[Variation "Dutch: 2.g3 e6 3.Nf3 Nf6"]+[Result "*"]+1.d4 f5 2.g3 e6 3.Nf3 Nf6 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6"]+[Result "*"]+1.d4 f5 2.g3 Nf6 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6 3.Nf3"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Nf3 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6 3.Bg2"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6 3.Bg2 e6"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 e6 *++[ECO "A81"]+[Variation "Dutch: Blackburne Variation"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 e6 4.Nh3 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6 3.Bg2 g6"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 g6 *++[ECO "A81"]+[Variation "Dutch: 2.g3 Nf6 3.Bg2 g6 4.Nf3"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 g6 4.Nf3 *++[ECO "A81"]+[Variation "Dutch: Leningrad, Basman Variation"]+[Result "*"]+1.d4 f5 2.g3 g6 3.Bg2 Bg7 4.Nf3 c6 5.O-O Nh6 *++[ECO "A81"]+[Variation "Dutch: Leningrad, Carlsbad Variation"]+[Result "*"]+1.d4 f5 2.g3 g6 3.Bg2 Bg7 4.Nh3 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit"]+[Result "*"]+1.d4 f5 2.e4 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, Balogh Defence"]+[Result "*"]+1.d4 f5 2.e4 d6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit Accepted"]+[Result "*"]+1.d4 f5 2.e4 fxe4 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 3.Nc3"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 3.Nc3 e6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 e6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 3.Nc3 g6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 g6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 3.Nc3 Nf6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, Tartakower Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.g4 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 e6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 e6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 Nc6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 Nc6 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 exf3"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 exf3 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 exf3 5.Nxf3"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 exf3 5.Nxf3 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 d5"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 d5 *++[ECO "A82"]+[Variation "Dutch: Staunton Gambit, 4.f3 d5 5.fxe4"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.f3 d5 5.fxe4 *++[ECO "A83a"]+[Variation "Dutch: Staunton Gambit, Staunton Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 *++[ECO "A83b"]+[Variation "Dutch: Staunton Gambit, Nimzowitsch Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 b6 *++[ECO "A83c"]+[Variation "Dutch: Staunton Gambit, Chigorin Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 c6 *++[ECO "A83d"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 g6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 g6 *++[ECO "A83e"]+[Variation "Dutch: Staunton Gambit, Alekhine Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 g6 5.h4 *++[ECO "A83f"]+[Variation "Dutch: Staunton Gambit, Lasker Variation"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 g6 5.f3 *++[ECO "A83g"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 e6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 e6 *++[ECO "A83h"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 e6 5.Nxe4"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 e6 5.Nxe4 *++[ECO "A83i"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 e6 5.Nxe4"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 e6 5.Nxe4 Be7 6.Bxf6 Bxf6 7.Nf3 *++[ECO "A83j"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 Nc6"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 Nc6 *++[ECO "A83k"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 Nc6 5.f3"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 Nc6 5.f3 *++[ECO "A83l"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 Nc6 5.d5"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 Nc6 5.d5 *++[ECO "A83m"]+[Variation "Dutch: Staunton Gambit, 4.Bg5 Nc6 5.d5 Ne5 6.Qd4"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 Nc6 5.d5 Ne5 6.Qd4 *++[ECO "A84"]+[Variation "Dutch: 2.c4"]+[Result "*"]+1.d4 f5 2.c4 *++[ECO "A84"]+[Variation "Dutch: 2.c4 d6"]+[Result "*"]+1.d4 f5 2.c4 d6 *++[ECO "A84"]+[Variation "Dutch: 2.c4 g6"]+[Result "*"]+1.d4 f5 2.c4 g6 *++[ECO "A84"]+[Variation "Dutch: Bladel Variation"]+[Result "*"]+1.d4 f5 2.c4 g6 3.Nc3 Nh6 *++[ECO "A84"]+[Variation "Dutch: 2.c4 e6"]+[Result "*"]+1.d4 f5 2.c4 e6 *++[ECO "A84"]+[Variation "Dutch: 2.c4 e6 3.Nf3"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nf3 *++[ECO "A84"]+[Variation "Dutch: 2.c4 e6 3.Nf3 Nf6"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nf3 Nf6 *++[ECO "A84"]+[Variation "Dutch: Rubinstein Variation"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nc3 *++[ECO "A84"]+[Variation "Dutch: Rubinstein, 3...d5"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nc3 d5 *++[ECO "A84"]+[Variation "Dutch: Rubinstein, 3...d5 4.e3 c6"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nc3 d5 4.e3 c6 *++[ECO "A84"]+[Variation "Dutch: Staunton Gambit Deferred"]+[Result "*"]+1.d4 f5 2.c4 e6 3.e4 *++[ECO "A84"]+[Variation "Dutch: 2.c4 Nf6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 *++[ECO "A84"]+[Variation "Dutch: 2.c4 Nf6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nf3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 d6 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.a3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.a3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.Qc2 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.Bg5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.Bg5 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.e3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.e3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.e3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.e3 d5 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.e3 Bb4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.e3 Bb4 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 e6 4.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 e6 4.Nf3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.f3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.f3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Bg5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Bg5 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Nf3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.e3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.e3 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bf4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bf4 *++[ECO "A85"]+[Variation "Dutch: 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bg5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bg5 *++[ECO "A86"]+[Variation "Dutch: 2.c4 Nf6 3.g3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 *++[ECO "A86"]+[Variation "Dutch: 2.c4 Nf6 3.g3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 d6 *++[ECO "A86"]+[Variation "Dutch: Hort-Antoshin System"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 d6 4.Bg2 c6 5.Nc3 Qc7 *++[ECO "A86"]+[Variation "Dutch: Leningrad Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Nc3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Nc3 Bg7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Nc3 Bg7 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Nf3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Nf3 Bg7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Nf3 Bg7 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Nf3 Bg7 5.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Nf3 Bg7 5.Nc3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 d6 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nh3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 d6 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3 d6 6.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 d6 6.Nh3 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3 d6 6.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 d6 6.d5 *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3 O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 O-O *++[ECO "A86"]+[Variation "Dutch: Leningrad, 4.Bg2 Bg7 5.Nc3 O-O 6.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nc3 O-O 6.Nh3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 5...d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 5...d6 6.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 d6 6.Nc3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 5...O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 6.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.Nc3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 6.Nc3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.Nc3 d6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 6.O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 6...c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 6...d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.b3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.b3 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.b3 c6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.d5 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.d5 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.d5 c6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.d5 c5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.d5 c5 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 e6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 e6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Na6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Na6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.Re1"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.Nd5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Nd5 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.d5 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.d5 a5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.d5 a5 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.d5 Na6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.d5 Na6 *++[ECO "A87"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Qe8 8.d5 Na6 9.Rb1"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.d5 Na6 9.Rb1 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.Re1"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.Re1 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.Qc2 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.b3 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.b3 Na6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.b3 Na6 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.b3 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.b3 Qe8 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.b3 Qa5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.b3 Qa5 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 cxd5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 cxd5 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 Qe8 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 Qa5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 Qa5 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 Bd7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 Bd7 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 e5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 e5 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 e5 9.dxe6 Bxe6 10.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 e5 9.dxe6 Bxe6 10.b3 *++[ECO "A88"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 c6 8.d5 e5 9.dxe6 Bxe6 10.Qd3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 8.d5 e5 9.dxe6 Bxe6 10.Qd3 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.b3 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Na5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Na5 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Na5 9.Qd3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Na5 9.Qd3 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Na5 9.Nd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Na5 9.Nd2 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Ne5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Ne5 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5 dxe5 10.Qb3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5 dxe5 10.Qb3 *++[ECO "A89"]+[Variation "Dutch: Leningrad, Main Line, 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5 dxe5 10.e4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 8.d5 Ne5 9.Nxe5 dxe5 10.e4 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Nc3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Nc3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Nc3 d5 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Nf3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Nf3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Nf3 d5 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 *++[ECO "A90"]+[Variation "Dutch: Dutch-Indian (Nimzo-Dutch) Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ *++[ECO "A90"]+[Variation "Dutch: Dutch-Indian, 5.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ 5.Nc3 *++[ECO "A90"]+[Variation "Dutch: Dutch-Indian, 5.Nd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ 5.Nd2 *++[ECO "A90"]+[Variation "Dutch: Dutch-Indian, 5.Bd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ 5.Bd2 *++[ECO "A90"]+[Variation "Dutch: Dutch-Indian, Alekhine Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ 5.Bd2 Be7 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 d5 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 d5 5.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 d5 5.Nh3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 d5 5.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 d5 5.Nf3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nh3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.Nc3 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.Qc2 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.Qc2 Bd6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.Qc2 Bd6 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.O-O *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.O-O Bd6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.O-O Bd6 *++[ECO "A90"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 5.Nf3 d5 6.O-O Bd6 7.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 c6 5.Nf3 d5 6.O-O Bd6 7.b3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3 c6 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nh3 O-O 6.O-O d6 7.Nc3 Qe8 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 d5 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 O-O *++[ECO "A91"]+[Variation "Dutch: Botvinnik-Bronstein Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nc3 O-O 6.e3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d6 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d6 6.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d6 6.Nc3 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5 *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5 6.O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5 6.O-O *++[ECO "A91"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5 6.O-O c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 d5 6.O-O c6 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.d5 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.Nc3 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.Nc3 d6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.Nc3 d6 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O *++[ECO "A92"]+[Variation "Dutch: Alekhine Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O Ne4 *++[ECO "A92"]+[Variation "Dutch: Alekhine, 7.d5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O Ne4 7.d5 *++[ECO "A92"]+[Variation "Dutch: Alekhine, 7.Nbd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O Ne4 7.Nbd2 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.b3 *++[ECO "A92"]+[Variation "Dutch: 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.b3 a5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.b3 a5 *++[ECO "A92"]+[Variation "Dutch: Stonewall Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Nbd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nbd2 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Nbd2 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nbd2 c6 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Qc2 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Qc2 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Qc2 c6 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Qc2 c6 8.Nbd2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Qc2 c6 8.Nbd2 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 7...b6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 b6 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 7...Nc6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 Nc6 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 7...c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Bb2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Bb2 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Qc2 *++[ECO "A93"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Qc2 Ne4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Qc2 Ne4 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bd7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bd7 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Nbd7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Nbd7 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Nbd7 9.Bxe7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Nbd7 9.Bxe7 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bxa3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bxa3 9.Nxa3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 9.Nxa3 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bxa3 9.Nxa3 Nbd7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 9.Nxa3 Nbd7 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bxa3 9.Nxa3 Qe7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 9.Nxa3 Qe7 *++[ECO "A94"]+[Variation "Dutch: Stonewall, Botvinnik, 8.Ba3 Bxa3 9.Nxa3 Qe7 10.Qc1"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 9.Nxa3 Qe7 10.Qc1 *++[ECO "A92"]+[Variation "Dutch: Stonewall, 7.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.Ne5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Ne5 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.Bf4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Bf4 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.Bg5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Bg5 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Qc2 *++[ECO "A95"]+[Variation "Dutch: Stonewall: Chekhover Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Qc2 Qe8 9.Bg5 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.b3 *++[ECO "A95"]+[Variation "Dutch: Stonewall, 7.Nc3 c6 8.b3 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.b3 Qe8 *++[ECO "A96"]+[Variation "Dutch: Classical"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.b3 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.b3 a5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.b3 a5 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.b3 a5 8.Bb2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.b3 a5 8.Bb2 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.b3 Qe8"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.b3 Qe8 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.b3 Qe8 8.Bb2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.b3 Qe8 8.Bb2 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.Nc3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.Nc3 a5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 a5 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.Nc3 a5 8.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 a5 8.Qc2 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.Nc3 a5 8.Re1"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 a5 8.Re1 *++[ECO "A96"]+[Variation "Dutch: Classical, 7.Nc3 a5 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 a5 8.b3 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b4 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter Variation"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter, 8...Ne4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 Ne4 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter, 8...Qh5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 Qh5 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter, 8...Qg6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 Qg6 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter, 8...Qg6 9.e4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 Qg6 9.e4 *++[ECO "A97"]+[Variation "Dutch: Ilyin-Zhenevsky, Winter, 8...Qg6 9.e4 fxe4"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 Qg6 9.e4 fxe4 *++[ECO "A98"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Qc2 *++[ECO "A98"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.Qc2 Nc6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Qc2 Nc6 *++[ECO "A98"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.Qc2 Qh5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Qc2 Qh5 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 c6 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 Nc6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 Nc6 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 Nbd7"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 Nbd7 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 Qh5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 Qh5 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 Qh5 9.Bb2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 Qh5 9.Bb2 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Qc2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Qc2 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Ba3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Ba3 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Bb2"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Bb2 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Bb2 c6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Bb2 c6 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Bb2 Na6"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Bb2 Na6 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Bb2 Qh5"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Bb2 Qh5 *++[ECO "A99"]+[Variation "Dutch: Ilyin-Zhenevsky, 8.b3 a5 9.Bb2 Qh5 10.e3"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 a5 9.Bb2 Qh5 10.e3 *++[ECO "B00a"]+[Variation "King's Pawn"]+[Result "*"]+1.e4 *++[ECO "B00a"]+[Variation "King's Pawn: Hippopotamus Defence"]+[Result "*"]+1.e4 Nh6 2.d4 g6 3.c4 f6 *++[ECO "B00a"]+[Variation "King's Pawn: Fred"]+[Result "*"]+1.e4 f5 *++[ECO "B00b"]+[Variation "Reversed Grob (Borg/Basman Defence)"]+[Result "*"]+1.e4 g5 *++[ECO "B00b"]+[Variation "Reversed Grob (Borg/Basman Defence)"]+[Result "*"]+1.e4 g5 2.d4 *++[ECO "B00c"]+[Variation "St. George Defence"]+[Result "*"]+1.e4 a6 *++[ECO "B00c"]+[Variation "St. George Defence"]+[Result "*"]+1.e4 a6 2.d4 *++[ECO "B00c"]+[Variation "Basman's Creepy-Crawly System (as Black)"]+[Result "*"]+1.e4 a6 2.d4 h6 *++[ECO "B00d"]+[Variation "Owen Defence"]+[Result "*"]+1.e4 b6 *++[ECO "B00d"]+[Variation "Owen Defence"]+[Result "*"]+1.e4 b6 2.d4 *++[ECO "B00e"]+[Variation "Owen Defence: French"]+[Result "*"]+1.e4 b6 2.d4 e6 *++[ECO "B00f"]+[Variation "Owen Defence: 2.d4 Bb7"]+[Result "*"]+1.e4 b6 2.d4 Bb7 *++[ECO "B00f"]+[Variation "Owen Defence: Naselwaus Gambit"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bg5 *++[ECO "B00f"]+[Variation "Owen Defence: Smith Gambit"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Nf3 *++[ECO "B00g"]+[Variation "Owen Defence: 3.Bd3"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 *++[ECO "B00g"]+[Variation "Owen Defence: Matinovsky Gambit"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 f5 *++[ECO "B00h"]+[Variation "Owen Defence: 3.Bd3 Nf6"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 Nf6 *++[ECO "B00i"]+[Variation "Owen Defence: 3.Bd3 e6"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 e6 *++[ECO "B00j"]+[Variation "Owen Defence: 3.Bd3 e6 4.Nf3"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 e6 4.Nf3 *++[ECO "B00k"]+[Variation "Owen Defence: 3.Bd3 e6 4.Nf3 c5"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 e6 4.Nf3 c5 *++[ECO "B00k"]+[Variation "Owen Defence: 3.Bd3 e6 4.Nf3 c5 5.c3"]+[Result "*"]+1.e4 b6 2.d4 Bb7 3.Bd3 e6 4.Nf3 c5 5.c3 *++[ECO "B00l"]+[Variation "Nimzowitsch Defence"]+[Result "*"]+1.e4 Nc6 *++[ECO "B00l"]+[Variation "Nimzowitsch Defence: Wheeler Gambit"]+[Result "*"]+1.e4 Nc6 2.b4 *++[ECO "B00m"]+[Variation "Nimzowitsch Defence: 2.Nc3"]+[Result "*"]+1.e4 Nc6 2.Nc3 *++[ECO "B00m"]+[Variation "Nimzowitsch Defence: 2.Nc3 Nf6"]+[Result "*"]+1.e4 Nc6 2.Nc3 Nf6 *++[ECO "B00m"]+[Variation "Nimzowitsch Defence: 2.Nc3 e6"]+[Result "*"]+1.e4 Nc6 2.Nc3 e6 *++[ECO "B00n"]+[Variation "Nimzowitsch Defence: 2.Nf3"]+[Result "*"]+1.e4 Nc6 2.Nf3 *++[ECO "B00n"]+[Variation "Nimzowitsch Defence: Colorado Counter"]+[Result "*"]+1.e4 Nc6 2.Nf3 f5 *++[ECO "B00o"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 *++[ECO "B00o"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 *++[ECO "B00o"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Bg4"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Bg4 *++[ECO "B00p"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 *++[ECO "B00q"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 *++[ECO "B00q"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 g6"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 g6 *++[ECO "B00r"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 *++[ECO "B00r"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.d5"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.d5 *++[ECO "B00r"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Bb5"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Bb5 *++[ECO "B00r"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Be2"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Be2 *++[ECO "B00s"]+[Variation "Nimzowitsch Defence: 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Be3"]+[Result "*"]+1.e4 Nc6 2.Nf3 d6 3.d4 Nf6 4.Nc3 Bg4 5.Be3 *++[ECO "B00t"]+[Variation "Nimzowitsch Defence: 2.d4"]+[Result "*"]+1.e4 Nc6 2.d4 *++[ECO "B00t"]+[Variation "Nimzowitsch Defence: 2.d4 d6"]+[Result "*"]+1.e4 Nc6 2.d4 d6 *++[ECO "B00t"]+[Variation "Nimzowitsch Defence: 2.d4 d6 3.Nc3"]+[Result "*"]+1.e4 Nc6 2.d4 d6 3.Nc3 *++[ECO "B00u"]+[Variation "Nimzowitsch Defence: 2.d4 e5"]+[Result "*"]+1.e4 Nc6 2.d4 e5 *++[ECO "B00u"]+[Variation "Nimzowitsch Defence: 2.d4 e5 3.dxe5"]+[Result "*"]+1.e4 Nc6 2.d4 e5 3.dxe5 *++[ECO "B00u"]+[Variation "Nimzowitsch Defence: Bielefelder Gambit"]+[Result "*"]+1.e4 Nc6 2.d4 e5 3.dxe5 Bc5 *++[ECO "B00u"]+[Variation "Nimzowitsch Defence: 2.d4 e5 3.d5"]+[Result "*"]+1.e4 Nc6 2.d4 e5 3.d5 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: 2.d4 d5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.exd5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: Aachen Gambit"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 Nb4 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.exd5 Qxd5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 Qxd5 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: Marshall Gambit"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 Qxd5 4.Nc3 *++[ECO "B00v"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.exd5 Qxd5 4.Nf3"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 Qxd5 4.Nf3 *++[ECO "B00w"]+[Variation "Nimzowitsch Defence: Bogoljubow Variation"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.Nc3 *++[ECO "B00w"]+[Variation "Nimzowitsch Defence: Bogoljubow, 3...e5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.Nc3 e5 *++[ECO "B00w"]+[Variation "Nimzowitsch Defence: Bogoljubow, 3...Nf6"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.Nc3 Nf6 *++[ECO "B00w"]+[Variation "Nimzowitsch Defence: Bogoljubow, 3...dxe4"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.Nc3 dxe4 *++[ECO "B00x"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.e5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.e5 *++[ECO "B00x"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.e5 Bf5"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.e5 Bf5 *++[ECO "B00x"]+[Variation "Nimzowitsch Defence: 2.d4 d5 3.e5 Bf5 4.c3"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.e5 Bf5 4.c3 *++[ECO "B01a"]+[Variation "Scandinavian (Centre Counter)"]+[Result "*"]+1.e4 d5 *++[ECO "B01a"]+[Variation "Scandinavian: 2.d3"]+[Result "*"]+1.e4 d5 2.d3 *++[ECO "B01a"]+[Variation "Scandinavian: 2.e5"]+[Result "*"]+1.e4 d5 2.e5 *++[ECO "B01a"]+[Variation "Scandinavian: 2.exd5"]+[Result "*"]+1.e4 d5 2.exd5 *++[ECO "B01a"]+[Variation "Scandinavian: Boehnke Gambit"]+[Result "*"]+1.e4 d5 2.exd5 e5 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nf3 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.Nf3 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nf3 Nf6 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.d4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.d4 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.d4 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.d4 Nf6 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.d4 e5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.d4 e5 *++[ECO "B01b"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 *++[ECO "B01c"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qd8"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qd8 *++[ECO "B01d"]+[Variation "Scandinavian: Schiller Defence"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qd6 *++[ECO "B01d"]+[Variation "Scandinavian: Schiller, 4.d4 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qd6 4.d4 Nf6 *++[ECO "B01d"]+[Variation "Scandinavian: Schiller, Bronstein Variation"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qd6 4.d4 Nf6 5.Nf3 a6 *++[ECO "B01e"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 *++[ECO "B01e"]+[Variation "Scandinavian, Mieses Gambit"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.b4 *++[ECO "B01e"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.g3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.g3 *++[ECO "B01e"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.Bc4 *++[ECO "B01e"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.Bc4 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.Bc4 Nf6 *++[ECO "B01f"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.Nf3 *++[ECO "B01f"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.Nf3 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.Nf3 Nf6 *++[ECO "B01f"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.Nf3 Nf6 5.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.Nf3 Nf6 5.Be2 *++[ECO "B01g"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.d4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 *++[ECO "B01g"]+[Variation "Scandinavian: Anderssen Counterattack"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 *++[ECO "B01g"]+[Variation "Scandinavian: Anderssen Counterattack, Goteborg Variation"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.Nf3 *++[ECO "B01g"]+[Variation "Scandinavian: Anderssen Counterattack, Collijn Variation"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.Nf3 Bg4 *++[ECO "B01g"]+[Variation "Scandinavian: Anderssen Counterattack, 5.dxe5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.dxe5 *++[ECO "B01h"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.d4 c6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 c6 *++[ECO "B01h"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.d4 c6 5.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 c6 5.Bc4 *++[ECO "B01h"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.d4 c6 5.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 c6 5.Nf3 *++[ECO "B01i"]+[Variation "Scandinavian: 2...Qxd5 3.Nc3 Qa5 4.d4 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 *++[ECO "B01i"]+[Variation "Scandinavian: 2...Qxd5, 5.Bd2"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Bd2 *++[ECO "B01i"]+[Variation "Scandinavian: 2...Qxd5, 5.Bd2 c6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Bd2 c6 *++[ECO "B01i"]+[Variation "Scandinavian: 2...Qxd5, 5.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Bc4 *++[ECO "B01i"]+[Variation "Scandinavian: 2...Qxd5, 5.Bc4 c6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Bc4 c6 *++[ECO "B01j"]+[Variation "Scandinavian: 2...Qxd5, 5.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 *++[ECO "B01j"]+[Variation "Scandinavian: 2...Qxd5, 5.Nf3 Bg4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bg4 *++[ECO "B01k"]+[Variation "Scandinavian: Lasker Variation"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bg4 6.h3 *++[ECO "B01l"]+[Variation "Scandinavian: 2...Qxd5, 5.Nf3 Bf5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bf5 *++[ECO "B01l"]+[Variation "Scandinavian: Gruenfeld Variation"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bf5 6.Ne5 c6 7.g4 *++[ECO "B01l"]+[Variation "Scandinavian: 2...Qxd5, 5.Nf3 Bf5 6.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bf5 6.Bc4 *++[ECO "B01m"]+[Variation "Scandinavian: 2...Qxd5, Main Line"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 *++[ECO "B01n"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 6.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 *++[ECO "B01n"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 6.Bc4 Bg4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bg4 *++[ECO "B01o"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 6.Bc4 Bf5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 *++[ECO "B01p"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 6.Bc4 Bf5 7.Bd2"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 *++[ECO "B01p"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 6.Bc4 Bf5 7.Bd2 e6"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 *++[ECO "B01p"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 8.Nd5"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 8.Nd5 *++[ECO "B01q"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 8.Qe2"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 8.Qe2 *++[ECO "B01q"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 8.Qe2 Bb4"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 8.Qe2 Bb4 *++[ECO "B01q"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 8.Qe2 Bb4 9.a3"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 8.Qe2 Bb4 9.a3 *++[ECO "B01q"]+[Variation "Scandinavian: 2...Qxd5, Main Line, 8.Qe2 Bb4 9.O-O-O"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 c6 6.Bc4 Bf5 7.Bd2 e6 8.Qe2 Bb4 9.O-O-O *++[ECO "B01r"]+[Variation "Scandinavian: 2...Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 *++[ECO "B01r"]+[Variation "Scandinavian: 2...Nf6 3.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bc4 *++[ECO "B01r"]+[Variation "Scandinavian: 2...Nf6 3.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Nf3 *++[ECO "B01r"]+[Variation "Scandinavian: 2...Nf6 3.Nf3 Nxd5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Nf3 Nxd5 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Nbd7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Nbd7 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Bd7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Bd7 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Bd7 4.Bc4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Bd7 4.Bc4 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Bd7 4.Bc4 Bg4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Bd7 4.Bc4 Bg4 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Bd7 4.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Bd7 4.Be2 *++[ECO "B01s"]+[Variation "Scandinavian: 2...Nf6 3.Bb5+ Bd7 4.Be2 Nxd5 5.d4 Bf5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.Bb5+ Bd7 4.Be2 Nxd5 5.d4 Bf5 *++[ECO "B01t"]+[Variation "Scandinavian: 2...Nf6 3.c4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 *++[ECO "B01t"]+[Variation "Scandinavian: Scandinavian Gambit"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 c6 *++[ECO "B01t"]+[Variation "Scandinavian: Scandinavian Gambit Accepted"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 c6 4.dxc6 *++[ECO "B01t"]+[Variation "Scandinavian: Icelandic Gambit"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 *++[ECO "B01t"]+[Variation "Scandinavian: Icelandic Gambit Accepted"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 4.dxe6 *++[ECO "B01t"]+[Variation "Scandinavian: Icelandic Gambit Accepted"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 4.dxe6 Bxe6 *++[ECO "B01t"]+[Variation "Scandinavian: Icelandic Gambit, 5.d4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 4.dxe6 Bxe6 5.d4 *++[ECO "B01t"]+[Variation "Scandinavian: Icelandic Gambit, 5.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 4.dxe6 Bxe6 5.Nf3 *++[ECO "B01u"]+[Variation "Scandinavian: 2...Nf6 3.d4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 *++[ECO "B01u"]+[Variation "Scandinavian: Richter Variation"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 g6 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese Variation"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Bb5+"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Bb5+ *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Nf3 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Nf3 Qxd5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Nf3 Qxd5 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Nf3 Qxd5 5.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Nf3 Qxd5 5.Be2 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Nf3 Qxd5 5.Be2 Nc6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Nf3 Qxd5 5.Be2 Nc6 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Be2 *++[ECO "B01u"]+[Variation "Scandinavian: Portuguese, 4.Be2 Bxe2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.Be2 Bxe2 *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3 Bf5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 Bf5 *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3 Bf5 5.c4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 Bf5 5.c4 *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3 Bf5 5.Bb5+"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 Bf5 5.Bb5+ *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3 Bf5 5.Bb5+ Nbd7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 Bf5 5.Bb5+ Nbd7 *++[ECO "B01v"]+[Variation "Scandinavian: Portuguese, 4.f3 Bf5 5.Bb5+ Nbd7 6.c4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Bg4 4.f3 Bf5 5.Bb5+ Nbd7 6.c4 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall Variation"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall, 4.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall, 4.Nf3 Bf5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 Bf5 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall, 4.Nf3 Bg4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 Bg4 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall, 4.Nf3 Bg4 5.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 Bg4 5.Be2 *++[ECO "B01w"]+[Variation "Scandinavian: Marshall, 4.Nf3 Bg4 5.Be2 e6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 Bg4 5.Be2 e6 *++[ECO "B01x"]+[Variation "Scandinavian: Marshall, 4.Nf3 g6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 g6 *++[ECO "B01x"]+[Variation "Scandinavian: Marshall, 4.Nf3 g6 5.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 g6 5.Be2 *++[ECO "B01x"]+[Variation "Scandinavian: Marshall, 4.Nf3 g6 5.Be2 Bg7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.Nf3 g6 5.Be2 Bg7 *++[ECO "B01y"]+[Variation "Scandinavian: Marshall, 4.c4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 *++[ECO "B01y"]+[Variation "Scandinavian: Marshall, 4.c4 Nf6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nf6 *++[ECO "B01y"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 *++[ECO "B01y"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nc3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nc3 *++[ECO "B01y"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nc3 e5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nc3 e5 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 Bg4"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 Bg4 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 Bg4 6.Be2 e6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 Bg4 6.Be2 e6 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 Bg4 6.c5"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 Bg4 6.c5 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.Be2"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.Be2 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.Be2 Bg7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.Be2 Bg7 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.h3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.h3 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.h3 Bg7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.h3 Bg7 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.Nc3"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.Nc3 *++[ECO "B01z"]+[Variation "Scandinavian: Marshall, 4.c4 Nb6 5.Nf3 g6 6.Nc3 Bg7"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb6 5.Nf3 g6 6.Nc3 Bg7 *++[ECO "B02a"]+[Variation "Alekhine Defence"]+[Result "*"]+1.e4 Nf6 *++[ECO "B02a"]+[Variation "Alekhine: Krejcik Variation"]+[Result "*"]+1.e4 Nf6 2.Bc4 *++[ECO "B02b"]+[Variation "Alekhine: Maroczy Variation"]+[Result "*"]+1.e4 Nf6 2.d3 *++[ECO "B02c"]+[Variation "Alekhine: Scandinavian Variation"]+[Result "*"]+1.e4 Nf6 2.Nc3 *++[ECO "B02c"]+[Variation "Alekhine: Scandinavian Variation"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 *++[ECO "B02d"]+[Variation "Alekhine: Scandinavian, 3.e5"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.e5 *++[ECO "B02e"]+[Variation "Alekhine: Scandinavian, 3.e5 Ne4"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.e5 Ne4 *++[ECO "B02f"]+[Variation "Alekhine: Scandinavian, 3.e5 Nfd7"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.e5 Nfd7 *++[ECO "B02f"]+[Variation "Alekhine: Spielmann Gambit"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.e5 Nfd7 4.e6 *++[ECO "B02g"]+[Variation "Alekhine: Scandinavian, Exchange"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 *++[ECO "B02g"]+[Variation "Alekhine: Scandinavian, Geschev Gambit"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 c6 *++[ECO "B02g"]+[Variation "Alekhine: Scandinavian, Exchange"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 *++[ECO "B02g"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Nf3"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Nf3 *++[ECO "B02h"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Nxd5"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Nxd5 *++[ECO "B02h"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Nxd5"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Nxd5 Qxd5 *++[ECO "B02i"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Bc4"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Bc4 *++[ECO "B02j"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Bc4 e6"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Bc4 e6 *++[ECO "B02k"]+[Variation "Alekhine: Scandinavian, Exchange, 4.Bc4 Nb6"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.exd5 Nxd5 4.Bc4 Nb6 *++[ECO "B02l"]+[Variation "Alekhine: 2.e5"]+[Result "*"]+1.e4 Nf6 2.e5 *++[ECO "B02l"]+[Variation "Alekhine: Mokele Mbembe (Buecker) Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Ne4 *++[ECO "B02l"]+[Variation "Alekhine: Brooklyn Defence (Retreat Variation)"]+[Result "*"]+1.e4 Nf6 2.e5 Ng8 *++[ECO "B02m"]+[Variation "Alekhine: 2.e5 Nd5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 *++[ECO "B02m"]+[Variation "Alekhine: Welling Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.b3 *++[ECO "B02n"]+[Variation "Alekhine: 3.Bc4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Bc4 *++[ECO "B02n"]+[Variation "Alekhine: Kmoch Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Bc4 Nb6 4.Bb3 c5 5.d3 *++[ECO "B02o"]+[Variation "Alekhine: Saemisch Attack"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Nc3 *++[ECO "B02p"]+[Variation "Alekhine: Saemisch Attack, 3...Nxc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Nc3 Nxc3 *++[ECO "B02q"]+[Variation "Alekhine: Saemisch Attack, 3...Nxc3 4.dxc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Nc3 Nxc3 4.dxc3 *++[ECO "B02r"]+[Variation "Alekhine: Chase Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 *++[ECO "B02r"]+[Variation "Alekhine: Chase Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 *++[ECO "B02r"]+[Variation "Alekhine: Chase, Steiner Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.b3 *++[ECO "B02s"]+[Variation "Alekhine: Two Pawns (Lasker) Attack"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 *++[ECO "B02t"]+[Variation "Alekhine: Two Pawns Attack, 5.Nc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 Nd5 5.Nc3 *++[ECO "B02u"]+[Variation "Alekhine: Two Pawns Attack, 5.Bc4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 Nd5 5.Bc4 *++[ECO "B02u"]+[Variation "Alekhine: Two Pawns Attack, Mikenas Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 Nd5 5.Bc4 e6 6.Nc3 d6 *++[ECO "B03a"]+[Variation "Alekhine: 3.d4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 *++[ECO "B03a"]+[Variation "Alekhine: O'Sullivan Gambit"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 b5 *++[ECO "B03b"]+[Variation "Alekhine: 3.d4 d6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 *++[ECO "B03c"]+[Variation "Alekhine: 3.d4 d6 4.exd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.exd6 *++[ECO "B03d"]+[Variation "Alekhine: Balogh Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Bc4 *++[ECO "B03e"]+[Variation "Alekhine: 4.c4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 *++[ECO "B03e"]+[Variation "Alekhine: 4.c4 Nb6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 *++[ECO "B03f"]+[Variation "Alekhine: 4.c4 Nb6 5.Nf3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.Nf3 *++[ECO "B03g"]+[Variation "Alekhine: Four Pawns Attack"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 *++[ECO "B03g"]+[Variation "Alekhine: Four Pawns Attack, Planinc Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 g5 *++[ECO "B03h"]+[Variation "Alekhine: Four Pawns Attack, Trifunovic Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 Bf5 *++[ECO "B03i"]+[Variation "Alekhine: Four Pawns Attack, Fianchetto Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 g6 *++[ECO "B03j"]+[Variation "Alekhine: Four Pawns Attack, 5...dxe5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 *++[ECO "B03j"]+[Variation "Alekhine: Four Pawns Attack, 5...dxe5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 *++[ECO "B03k"]+[Variation "Alekhine: Four Pawns Attack, 6...c5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 c5 *++[ECO "B03l"]+[Variation "Alekhine: Four Pawns Attack, 6...Bf5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Bf5 *++[ECO "B03l"]+[Variation "Alekhine: Four Pawns Attack, Fahrni Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Bf5 7.Nc3 e6 8.Nf3 Bb4 9.Bd3 *++[ECO "B03l"]+[Variation "Alekhine: Four Pawns Attack, Korchnoi Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Bf5 7.Nc3 e6 8.Nf3 Be7 9.Be2 O-O 10.O-O f6 *++[ECO "B03m"]+[Variation "Alekhine: Four Pawns Attack, 6...Nc6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 *++[ECO "B03m"]+[Variation "Alekhine: Four Pawns Attack, Ilyin-Zhenevsky Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 7.Nf3 Bg4 8.e6 fxe6 9.c5 *++[ECO "B03n"]+[Variation "Alekhine: Four Pawns Attack, 7.Be3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 7.Be3 *++[ECO "B03o"]+[Variation "Alekhine: Exchange Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 *++[ECO "B03o"]+[Variation "Alekhine: Exchange, 5...exd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 exd6 *++[ECO "B03p"]+[Variation "Alekhine: Exchange, 5...exd6 6.Nc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 exd6 6.Nc3 *++[ECO "B03q"]+[Variation "Alekhine: Exchange, 5...exd6 6.Nc3 Be7"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 exd6 6.Nc3 Be7 *++[ECO "B03r"]+[Variation "Alekhine: Exchange, 5...cxd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 cxd6 *++[ECO "B03s"]+[Variation "Alekhine: Exchange, 5...cxd6 6.Nc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 cxd6 6.Nc3 *++[ECO "B03t"]+[Variation "Alekhine: Exchange, 5...cxd6 6.Nc3 g6 7.Be3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 cxd6 6.Nc3 g6 7.Be3 *++[ECO "B04a"]+[Variation "Alekhine: Modern Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 *++[ECO "B04b"]+[Variation "Alekhine: Modern, 4...Nc6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Nc6 *++[ECO "B04c"]+[Variation "Alekhine: Modern, 4...c6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 c6 *++[ECO "B04d"]+[Variation "Alekhine: Modern, 4...c6 5.c4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 c6 5.c4 *++[ECO "B04e"]+[Variation "Alekhine: Modern, Schmid Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Nb6 *++[ECO "B04f"]+[Variation "Alekhine: Modern, Larsen Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 dxe5 *++[ECO "B04g"]+[Variation "Alekhine: Modern, Larsen, 5.Nxe5 g6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 dxe5 5.Nxe5 g6 *++[ECO "B04h"]+[Variation "Alekhine: Modern, Larsen, 5.Nxe5 g6 6.Bc4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 dxe5 5.Nxe5 g6 6.Bc4 *++[ECO "B04i"]+[Variation "Alekhine: Modern, Larsen, 5.Nxe5 g6 6.Bc4 c6 7.O-O"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 dxe5 5.Nxe5 g6 6.Bc4 c6 7.O-O *++[ECO "B04j"]+[Variation "Alekhine: Modern, Fianchetto Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 *++[ECO "B04k"]+[Variation "Alekhine: Modern, Fianchetto, 5.Bc4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 *++[ECO "B04l"]+[Variation "Alekhine: Modern, Fianchetto, 5.Bc4 Nb6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 Nb6 *++[ECO "B04m"]+[Variation "Alekhine: Modern, Fianchetto, 5.Bc4 Nb6 6.Bb3 Bg7"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 Nb6 6.Bb3 Bg7 *++[ECO "B04n"]+[Variation "Alekhine: Modern, Fianchetto, Keres Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 Nb6 6.Bb3 Bg7 7.a4 *++[ECO "B04o"]+[Variation "Alekhine: Modern, Fianchetto, 5.Bc4 Nb6 6.Bb3 Bg7 7.Ng5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 Nb6 6.Bb3 Bg7 7.Ng5 *++[ECO "B05a"]+[Variation "Alekhine: Modern, 4...Bg4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 *++[ECO "B05b"]+[Variation "Alekhine: Modern, Panov Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.h3 *++[ECO "B05c"]+[Variation "Alekhine: Modern, Alekhine Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 *++[ECO "B05c"]+[Variation "Alekhine: Modern, Alekhine Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 Nb6 *++[ECO "B05d"]+[Variation "Alekhine: Modern, Alekhine Variation, 6.exd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 Nb6 6.exd6 *++[ECO "B05d"]+[Variation "Alekhine: Modern, Alekhine Variation, 6.exd6 cxd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 Nb6 6.exd6 cxd6 *++[ECO "B05e"]+[Variation "Alekhine: Modern, Alekhine Variation, 6.exd6 exd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 Nb6 6.exd6 exd6 *++[ECO "B05f"]+[Variation "Alekhine: Modern, 5.Be2"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 *++[ECO "B05g"]+[Variation "Alekhine: Modern, 5.Be2 Nc6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 Nc6 *++[ECO "B05h"]+[Variation "Alekhine: Modern, Flohr Variation"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 c6 *++[ECO "B05i"]+[Variation "Alekhine: Modern, Flohr, 6.c4"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 c6 6.c4 *++[ECO "B05j"]+[Variation "Alekhine: Modern, Flohr, 6.O-O"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 c6 6.O-O *++[ECO "B05k"]+[Variation "Alekhine: Modern, 5.Be2 e6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 *++[ECO "B05l"]+[Variation "Alekhine: Modern, 5.Be2 e6 6.O-O"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O *++[ECO "B05m"]+[Variation "Alekhine: Modern, Main Line"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 *++[ECO "B05n"]+[Variation "Alekhine: Modern, Main Line, 8.h3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 *++[ECO "B05n"]+[Variation "Alekhine: Modern, Main Line, 8.h3 Bh5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 Bh5 *++[ECO "B05o"]+[Variation "Alekhine: Modern, Main Line, 8.h3 Bh5 9.Nc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 Bh5 9.Nc3 *++[ECO "B05o"]+[Variation "Alekhine: Modern, Main Line, 8.h3 Bh5 9.Nc3 O-O"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 Bh5 9.Nc3 O-O *++[ECO "B05o"]+[Variation "Alekhine: Modern, Main Line, 8.h3 Bh5 9.Nc3 O-O 10.Be3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 Bh5 9.Nc3 O-O 10.Be3 *++[ECO "B05p"]+[Variation "Alekhine: Modern, Main Line, 8.h3 Bh5 9.Nc3 O-O 10.Be3 d5"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.h3 Bh5 9.Nc3 O-O 10.Be3 d5 *++[ECO "B05q"]+[Variation "Alekhine: Modern, Main Line, 8.exd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.exd6 *++[ECO "B05r"]+[Variation "Alekhine: Modern, Main Line, 8.Nc3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.Nc3 *++[ECO "B05s"]+[Variation "Alekhine: Modern, Main Line, 8.Nc3 O-O 9.Be3"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.Nc3 O-O 9.Be3 *++[ECO "B05t"]+[Variation "Alekhine: Modern, Main Line, 8.Nc3 O-O 9.Be3 Nc6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.Nc3 O-O 9.Be3 Nc6 *++[ECO "B05u"]+[Variation "Alekhine: Modern, Main Line, 8.Nc3 O-O 9.Be3 Nc6 10.exd6 cxd6"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 e6 6.O-O Be7 7.c4 Nb6 8.Nc3 O-O 9.Be3 Nc6 10.exd6 cxd6 *++[ECO "B06a"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 *++[ECO "B06b"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.Nc3 *++[ECO "B06b"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.Nc3 d6 *++[ECO "B06b"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.Nc3 Bg7 *++[ECO "B06c"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.Nc3 Bg7 3.f4 d6 *++[ECO "B06c"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.f4 *++[ECO "B06c"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.f4 d6 *++[ECO "B06c"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.f4 Bg7 3.Nf3 *++[ECO "B06c"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.f4 Bg7 3.Nf3 d6 *++[ECO "B06d"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.d4 *++[ECO "B06d"]+[Variation "Modern: Norwegian Defence"]+[Result "*"]+1.e4 g6 2.d4 Nf6 *++[ECO "B06d"]+[Variation "Modern: Norwegian Defence"]+[Result "*"]+1.e4 g6 2.d4 Nf6 3.e5 Nh5 4.g4 Ng7 *++[ECO "B06d"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.d4 c6 *++[ECO "B06e"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.d4 d6 *++[ECO "B06f"]+[Variation "Modern"]+[Result "*"]+1.e4 g6 2.d4 Bg7 *++[ECO "B06f"]+[Variation "Modern: 3.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Bc4 *++[ECO "B06g"]+[Variation "Modern: 3.c3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.c3 *++[ECO "B06g"]+[Variation "Modern: 3.c3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.c3 d6 *++[ECO "B06g"]+[Variation "Modern: c3 Pterodactyl"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.c3 d6 4.f4 c5 *++[ECO "B06h"]+[Variation "Modern: Geller System"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.c3 d6 4.Nf3 *++[ECO "B06i"]+[Variation "Modern: 3.Nf3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 *++[ECO "B06j"]+[Variation "Modern: 3.Nf3 d6"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 *++[ECO "B06k"]+[Variation "Modern: 3.Nf3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.Bc4 *++[ECO "B06l"]+[Variation "Modern: 3.Nc3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 *++[ECO "B06l"]+[Variation "Modern: Mittenberger Gambit"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d5 *++[ECO "B06l"]+[Variation "Modern: Nc3 Pterodactyl"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 c5 *++[ECO "B06m"]+[Variation "Modern: 3.Nc3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 *++[ECO "B06n"]+[Variation "Modern: 3.Nc3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Bc4 *++[ECO "B06n"]+[Variation "Modern: 3.Nc3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Bc4 c6 *++[ECO "B06n"]+[Variation "Modern: 3.Nc3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Bc4 c6 5.Qf3 *++[ECO "B06n"]+[Variation "Modern: 3.Nc3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Bc4 c6 5.Qf3 Nf6 *++[ECO "B06n"]+[Variation "Modern: 3.Nc3 d6 4.Bc4"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Bc4 c6 5.Qf3 e6 *++[ECO "B06o"]+[Variation "Modern: 3.Nc3 d6 4.Be3"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 *++[ECO "B06p"]+[Variation "Modern: 3.Nc3 d6 4.Be3 a6"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 a6 *++[ECO "B06q"]+[Variation "Modern: 3.Nc3 d6 4.Be3 c6"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 c6 *++[ECO "B06r"]+[Variation "Modern: Two Knights Variation"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nf3 *++[ECO "B06r"]+[Variation "Modern: Two Knights, Suttles Variation"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nf3 c6 *++[ECO "B06r"]+[Variation "Modern: Two Knights, Suttles, Tal Gambit"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nf3 c6 5.Bg5 Qb6 6.Qd2 *++[ECO "B06s"]+[Variation "Modern: Pseudo-Austrian Attack"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 *++[ECO "B06s"]+[Variation "Modern: Pseudo-Austrian Attack"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 c6 *++[ECO "B06t"]+[Variation "Modern: Pseudo-Austrian Attack"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 c6 5.Nf3 *++[ECO "B06t"]+[Variation "Modern: Pseudo-Austrian Attack"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 Nc6 *++[ECO "B06u"]+[Variation "Modern: Three Pawns Attack"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.f4 *++[ECO "B07a"]+[Variation "Pirc"]+[Result "*"]+1.e4 d6 *++[ECO "B07a"]+[Variation "Pirc"]+[Result "*"]+1.e4 d6 2.g3 *++[ECO "B07a"]+[Variation "Pirc"]+[Result "*"]+1.e4 d6 2.c4 *++[ECO "B07a"]+[Variation "Pirc: 2.Nc3"]+[Result "*"]+1.e4 d6 2.Nc3 *++[ECO "B07a"]+[Variation "Pirc: 2.Nc3"]+[Result "*"]+1.e4 d6 2.Nc3 Nf6 *++[ECO "B07b"]+[Variation "Pirc: 2.Nf3"]+[Result "*"]+1.e4 d6 2.Nf3 *++[ECO "B07b"]+[Variation "Pirc/Reti: Wade Defence"]+[Result "*"]+1.e4 d6 2.Nf3 Bg4 *++[ECO "B07b"]+[Variation "Pirc: 2.Nf3 Nf6"]+[Result "*"]+1.e4 d6 2.Nf3 Nf6 *++[ECO "B07b"]+[Variation "Pirc: 2.Nf3 Nf6 3.Nc3"]+[Result "*"]+1.e4 d6 2.Nf3 Nf6 3.Nc3 *++[ECO "B07c"]+[Variation "Pirc: 2.f4"]+[Result "*"]+1.e4 d6 2.f4 *++[ECO "B07c"]+[Variation "Pirc: 2.f4 Nf6"]+[Result "*"]+1.e4 d6 2.f4 Nf6 *++[ECO "B07c"]+[Variation "Pirc: 2.f4 Nf6 3.Nc3"]+[Result "*"]+1.e4 d6 2.f4 Nf6 3.Nc3 *++[ECO "B07c"]+[Variation "Pirc: 2.f4 Nf6 3.Nc3 g6 4.Nf3 Bg7"]+[Result "*"]+1.e4 d6 2.f4 Nf6 3.Nc3 g6 4.Nf3 Bg7 *++[ECO "B07d"]+[Variation "Pirc: 2.d4"]+[Result "*"]+1.e4 d6 2.d4 *++[ECO "B07d"]+[Variation "Pirc: 2.d4 c6"]+[Result "*"]+1.e4 d6 2.d4 c6 *++[ECO "B07d"]+[Variation "Pirc: Lengfellner System"]+[Result "*"]+1.e4 d6 2.d4 e6 *++[ECO "B07d"]+[Variation "Pirc: 2.d4 Nd7"]+[Result "*"]+1.e4 d6 2.d4 Nd7 *++[ECO "B07d"]+[Variation "Pirc: 2.d4 Nf6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 *++[ECO "B07d"]+[Variation "Pirc: Roscher Gambit"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nf3 *++[ECO "B07d"]+[Variation "Pirc: 3.Nbd2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nbd2 *++[ECO "B07d"]+[Variation "Pirc: 3.Nbd2 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nbd2 g6 *++[ECO "B07d"]+[Variation "Pirc: 3.Nbd2 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nbd2 g6 4.c3 Bg7 *++[ECO "B07e"]+[Variation "Pirc: 3.f3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 *++[ECO "B07f"]+[Variation "Pirc: 3.f3 e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 e5 *++[ECO "B07f"]+[Variation "Pirc: 3.f3 e5 Queenswap"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 e5 4.dxe5 dxe5 5.Qxd8+ *++[ECO "B07f"]+[Variation "Pirc: 3.f3 e5 4.d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 e5 4.d5 *++[ECO "B07g"]+[Variation "Pirc: 3.f3 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 g6 *++[ECO "B07h"]+[Variation "Pirc: 3.Bd3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 *++[ECO "B07h"]+[Variation "Pirc: 3.Bd3 e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 e5 *++[ECO "B07h"]+[Variation "Pirc: 3.Bd3 e5 4.c3 d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 e5 4.c3 d5 *++[ECO "B07h"]+[Variation "Pirc: 3.Bd3 e5 4.c3 d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 e5 4.c3 d5 5.dxe5 dxe4 *++[ECO "B07h"]+[Variation "Pirc: 3.Bd3 e5 4.c3 d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 e5 4.c3 d5 5.dxe5 Nxe4 *++[ECO "B07i"]+[Variation "Pirc: 3.Bd3 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 g6 *++[ECO "B07i"]+[Variation "Pirc: 3.Bd3 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 g6 4.Nf3 *++[ECO "B07i"]+[Variation "Pirc: 3.Bd3 g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 g6 4.Nf3 Bg7 *++[ECO "B07j"]+[Variation "Pirc: 3.Bd3 g6 4.Nf3 Bg7 5.c3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 g6 4.Nf3 Bg7 5.c3 *++[ECO "B07k"]+[Variation "Pirc: 3.Nc3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 *++[ECO "B07l"]+[Variation "Pirc: 3.Nc3 Nbd7"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 Nbd7 *++[ECO "B07m"]+[Variation "Pirc: 3.Nc3 e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 e5 *++[ECO "B07m"]+[Variation "Pirc: 3.Nc3 e5 Queenswap"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 e5 4.dxe5 dxe5 5.Qxd8+ *++[ECO "B07n"]+[Variation "Pirc: Pytel/Czech"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 *++[ECO "B07o"]+[Variation "Pirc: Czech, 4.Nf3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.Nf3 *++[ECO "B07p"]+[Variation "Pirc: Czech, 4.f4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.f4 *++[ECO "B07p"]+[Variation "Pirc: Czech, 4.f4 Qa5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.f4 Qa5 *++[ECO "B07q"]+[Variation "Pirc: 3...g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 *++[ECO "B07q"]+[Variation "Pirc: 3...g6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.h4 *++[ECO "B07q"]+[Variation "Pirc: 4.Nge2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nge2 *++[ECO "B07q"]+[Variation "Pirc: 4.Nge2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nge2 Bg7 *++[ECO "B07r"]+[Variation "Pirc: Sveshnikov (4.g3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.g3 *++[ECO "B07r"]+[Variation "Pirc: Sveshnikov (4.g3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.g3 Bg7 *++[ECO "B07r"]+[Variation "Pirc: Sveshnikov (4.g3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.g3 Bg7 5.Bg2 c6 *++[ECO "B07s"]+[Variation "Pirc: Holmov (4.Bc4)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bc4 *++[ECO "B07s"]+[Variation "Pirc: Holmov (4.Bc4)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bc4 Bg7 *++[ECO "B07t"]+[Variation "Pirc: 4.Be3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 *++[ECO "B07t"]+[Variation "Pirc: 4.Be3 c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 c6 *++[ECO "B07u"]+[Variation "Pirc: 4.Be3 Bg7"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 Bg7 *++[ECO "B07u"]+[Variation "Pirc: 4.Be3, 150 Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 Bg7 5.Qd2 *++[ECO "B07v"]+[Variation "Pirc: 4.Be3, 150 Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 Bg7 5.Qd2 c6 *++[ECO "B07v"]+[Variation "Pirc: 4.Be3, 150 Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 Bg7 5.Qd2 c6 6.f3 b5 *++[ECO "B07w"]+[Variation "Pirc: Byrne 4.Bg5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bg5 *++[ECO "B07x"]+[Variation "Pirc: 4.Bg5 Bg7"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bg5 Bg7 *++[ECO "B07y"]+[Variation "Pirc: 4.Be2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 *++[ECO "B07y"]+[Variation "Pirc: 4.Be2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 Bg7 *++[ECO "B07y"]+[Variation "Pirc: Chinese Variation"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 Bg7 5.g4 *++[ECO "B07z"]+[Variation "Pirc: Bayonet/Mariotti Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 Bg7 5.h4 *++[ECO "B08a"]+[Variation "Pirc: Classical"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 *++[ECO "B08a"]+[Variation "Pirc: Classical"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 *++[ECO "B08b"]+[Variation "Pirc: Classical, 5.h3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 *++[ECO "B08b"]+[Variation "Pirc: Classical, 5.h3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 c6 *++[ECO "B08b"]+[Variation "Pirc: Classical, 5.h3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 O-O *++[ECO "B08c"]+[Variation "Pirc: Classical, Spassky System"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 O-O 6.Be3 *++[ECO "B08c"]+[Variation "Pirc: Classical, Spassky System, 6...d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 O-O 6.Be3 d5 *++[ECO "B08d"]+[Variation "Pirc: Classical, Spassky System, 6...a6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 O-O 6.Be3 a6 *++[ECO "B08e"]+[Variation "Pirc: Classical, Spassky System, 6...c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 O-O 6.Be3 c6 *++[ECO "B08f"]+[Variation "Pirc: Classical, 5.a4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.a4 *++[ECO "B08f"]+[Variation "Pirc: Classical, 5.a4 c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.a4 c6 *++[ECO "B08g"]+[Variation "Pirc: Classical, 5.Bc4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bc4 *++[ECO "B08g"]+[Variation "Pirc: Classical, 5.Bc4 c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Bc4 c6 *++[ECO "B08h"]+[Variation "Pirc: Classical, 5.Be3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be3 *++[ECO "B08h"]+[Variation "Pirc: Classical, 5.Be3 a6 6.a4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be3 a6 6.a4 *++[ECO "B08i"]+[Variation "Pirc: Classical, 5.Be3 c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be3 c6 *++[ECO "B08j"]+[Variation "Pirc: Classical, 5.Be2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 *++[ECO "B08j"]+[Variation "Pirc: Classical, 5.Be2 a6 6.a4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 a6 6.a4 *++[ECO "B08k"]+[Variation "Pirc: Classical, 5.Be2 c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 c6 *++[ECO "B08l"]+[Variation "Pirc: Classical, 5.Be2 O-O"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O *++[ECO "B08m"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.Be3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.Be3 *++[ECO "B08n"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O *++[ECO "B08o"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O Nc6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O Nc6 *++[ECO "B08p"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O c6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O c6 *++[ECO "B08q"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O c6 7.h3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O c6 7.h3 *++[ECO "B08r"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O c6 7.a4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O c6 7.a4 *++[ECO "B08s"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O c6 7.a4 Nbd7"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O c6 7.a4 Nbd7 *++[ECO "B08t"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O Bg4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O Bg4 *++[ECO "B08u"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O Bg4 7.Be3 Nc6 8.Qd2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O Bg4 7.Be3 Nc6 8.Qd2 *++[ECO "B08v"]+[Variation "Pirc: Classical, 5.Be2 O-O 6.O-O Bg4 7.Be3 Nc6 8.Qd2 e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 O-O 6.O-O Bg4 7.Be3 Nc6 8.Qd2 e5 *++[ECO "B09a"]+[Variation "Pirc: Austrian Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 *++[ECO "B09b"]+[Variation "Pirc: Austrian Attack"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 *++[ECO "B09c"]+[Variation "Pirc: Austrian, Ljubojevic Variation"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Bc4 *++[ECO "B09d"]+[Variation "Pirc: Austrian, 5.Nf3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 *++[ECO "B09e"]+[Variation "Pirc: Austrian, 5...O-O"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O *++[ECO "B09f"]+[Variation "Pirc: Austrian, 5...O-O 6.e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.e5 *++[ECO "B09g"]+[Variation "Pirc: Austrian, 5...O-O 6.Be3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Be3 *++[ECO "B09h"]+[Variation "Pirc: Austrian, 5...O-O 6.Be2"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Be2 *++[ECO "B09i"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 *++[ECO "B09j"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Nc6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Nc6 *++[ECO "B09k"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Nc6 7.e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Nc6 7.e5 *++[ECO "B09l"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Na6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Na6 *++[ECO "B09m"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Na6 7.O-O c5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Na6 7.O-O c5 *++[ECO "B09m"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Na6 7.O-O c5 8.d5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Na6 7.O-O c5 8.d5 *++[ECO "B09n"]+[Variation "Pirc: Austrian, 5...O-O 6.Bd3 Na6 7.O-O c5 8.d5 Bg4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 Na6 7.O-O c5 8.d5 Bg4 *++[ECO "B09o"]+[Variation "Pirc: Austrian, 5...c5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 *++[ECO "B09p"]+[Variation "Pirc: Austrian, 5...c5 6.dxc5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.dxc5 *++[ECO "B09q"]+[Variation "Pirc: Austrian, 5...c5 6.dxc5 Qa5 7.Bd3"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.dxc5 Qa5 7.Bd3 *++[ECO "B09r"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ *++[ECO "B09s"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 *++[ECO "B09t"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+ Bd7 7.e5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 *++[ECO "B09u"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+ Bd7 7.e5 Ng4"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 Ng4 *++[ECO "B09v"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+ Bd7 7.e5 Ng4 8.Bxd7+"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 Ng4 8.Bxd7+ *++[ECO "B09w"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+ Bd7 7.e5 Ng4 8.e6"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 Ng4 8.e6 *++[ECO "B09w"]+[Variation "Pirc: Austrian, 5...c5, Seirawan Variation"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 Ng4 8.e6 fxe6 *++[ECO "B09x"]+[Variation "Pirc: Austrian, 5...c5 6.Bb5+ Bd7 7.e5 Ng4 8.e6 Bxb5"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 6.Bb5+ Bd7 7.e5 Ng4 8.e6 Bxb5 *++[ECO "B10a"]+[Variation "Caro-Kann"]+[Result "*"]+1.e4 c6 *++[ECO "B10a"]+[Variation "Caro-Kann: 2.Ne2"]+[Result "*"]+1.e4 c6 2.Ne2 *++[ECO "B10a"]+[Variation "Caro-Kann: 2.f4"]+[Result "*"]+1.e4 c6 2.f4 *++[ECO "B10b"]+[Variation "Caro-Kann: Breyer Variation"]+[Result "*"]+1.e4 c6 2.d3 *++[ECO "B10b"]+[Variation "Caro-Kann: Breyer Variation"]+[Result "*"]+1.e4 c6 2.d3 d5 *++[ECO "B10c"]+[Variation "Caro-Kann: Breyer, 3.Nd2"]+[Result "*"]+1.e4 c6 2.d3 d5 3.Nd2 *++[ECO "B10d"]+[Variation "Caro-Kann: Breyer, 3.Nd2 g6"]+[Result "*"]+1.e4 c6 2.d3 d5 3.Nd2 g6 *++[ECO "B10e"]+[Variation "Caro-Kann: Breyer, 3.Nd2 e5"]+[Result "*"]+1.e4 c6 2.d3 d5 3.Nd2 e5 *++[ECO "B10f"]+[Variation "Caro-Kann: Breyer, Main Line"]+[Result "*"]+1.e4 c6 2.d3 d5 3.Nd2 e5 4.Ngf3 Bd6 5.g3 *++[ECO "B10g"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 *++[ECO "B10h"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 e5 *++[ECO "B10i"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 d5 *++[ECO "B10i"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 d5 3.cxd5 *++[ECO "B10i"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 d5 3.cxd5 cxd5 *++[ECO "B10i"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 *++[ECO "B10i"]+[Variation "Caro-Kann: English Variation"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 *++[ECO "B10j"]+[Variation "Caro-Kann: English, Exchange"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 *++[ECO "B10k"]+[Variation "Caro-Kann: English, Exchange, 4...Nf6"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 Nf6 *++[ECO "B10l"]+[Variation "Caro-Kann: English, Exchange, 4...Nf6 5.Bb5+"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 Nf6 5.Bb5+ *++[ECO "B10m"]+[Variation "Caro-Kann: English, Exchange, 4...Nf6 5.Nc3"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 Nf6 5.Nc3 *++[ECO "B10n"]+[Variation "Caro-Kann: English, Exchange, 4...Nf6 5.Nc3 Nxd5"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 Nf6 5.Nc3 Nxd5 *++[ECO "B10o"]+[Variation "Caro-Kann: 2.Nf3"]+[Result "*"]+1.e4 c6 2.Nf3 *++[ECO "B10p"]+[Variation "Caro-Kann: 2.Nc3"]+[Result "*"]+1.e4 c6 2.Nc3 *++[ECO "B10q"]+[Variation "Caro-Kann: 2.Nc3 d5"]+[Result "*"]+1.e4 c6 2.Nc3 d5 *++[ECO "B10r"]+[Variation "Caro-Kann: Goldman/Spielmann"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Qf3 *++[ECO "B10s"]+[Variation "Caro-Kann: Two Knights Variation"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 *++[ECO "B10t"]+[Variation "Caro-Kann: Two Knights, 3...dxe4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 dxe4 *++[ECO "B10t"]+[Variation "Caro-Kann: Hector Gambit"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 dxe4 4.Ng5 *++[ECO "B10u"]+[Variation "Caro-Kann: Two Knights, 3...dxe4 4.Nxe4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 dxe4 4.Nxe4 *++[ECO "B10v"]+[Variation "Caro-Kann: Two Knights, 3...dxe4 4.Nxe4 Nf6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 dxe4 4.Nxe4 Nf6 *++[ECO "B11a"]+[Variation "Caro-Kann: Two Knights, 3...Bg4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 *++[ECO "B11b"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 *++[ECO "B11b"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bh5"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bh5 *++[ECO "B11c"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bh5, 7.g4 Bg6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bh5 5.exd5 cxd5 6.Bb5+ Nc6 7.g4 Bg6 *++[ECO "B11d"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 *++[ECO "B11d"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 *++[ECO "B11e"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 dxe4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 dxe4 *++[ECO "B11e"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 dxe4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 dxe4 6.Nxe4 *++[ECO "B11f"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 Nf6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 Nf6 *++[ECO "B11g"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 *++[ECO "B11h"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d4"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d4 *++[ECO "B11i"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.g3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.g3 *++[ECO "B11i"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.g3 Nf6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.g3 Nf6 *++[ECO "B11j"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 *++[ECO "B11k"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nd7"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nd7 *++[ECO "B11l"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6 *++[ECO "B11m"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6 7.a3"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6 7.a3 *++[ECO "B11n"]+[Variation "Caro-Kann: Two Knights, 3...Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6 7.Bd2"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 4.h3 Bxf3 5.Qxf3 e6 6.d3 Nf6 7.Bd2 *++[ECO "B12a"]+[Variation "Caro-Kann: 2.d4"]+[Result "*"]+1.e4 c6 2.d4 *++[ECO "B12a"]+[Variation "Caro-Kann: de Bruycker Defence"]+[Result "*"]+1.e4 c6 2.d4 Na6 *++[ECO "B12a"]+[Variation "Caro-Kann: Masi Defence"]+[Result "*"]+1.e4 c6 2.d4 Nf6 *++[ECO "B12b"]+[Variation "Caro-Kann: 2.d4 d5"]+[Result "*"]+1.e4 c6 2.d4 d5 *++[ECO "B12b"]+[Variation "Caro-Kann: Ulysses Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nf3 *++[ECO "B12b"]+[Variation "Caro-Kann: Ulysses Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nf3 dxe4 4.Ng5 *++[ECO "B12c"]+[Variation "Caro-Kann: Mieses Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Be3 *++[ECO "B12d"]+[Variation "Caro-Kann: Maroczy (Fantasy) Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.f3 *++[ECO "B12e"]+[Variation "Caro-Kann: Maroczy (Fantasy), 3...e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.f3 e6 *++[ECO "B12f"]+[Variation "Caro-Kann: Maroczy (Fantasy), 3...dxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.f3 dxe4 *++[ECO "B12f"]+[Variation "Caro-Kann: Maroczy (Fantasy), Gambit line"]+[Result "*"]+1.e4 c6 2.d4 d5 3.f3 dxe4 4.fxe4 e5 5.Nf3 exd4 6.Bc4 *++[ECO "B12g"]+[Variation "Caro-Kann: 3.Nd2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 *++[ECO "B12g"]+[Variation "Caro-Kann: 3.Nd2 dxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 dxe4 *++[ECO "B12g"]+[Variation "Caro-Kann: Edinburgh Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 Qb6 *++[ECO "B12h"]+[Variation "Caro-Kann: Gurgenidze/Modern: 3.Nd2 g6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 g6 *++[ECO "B12h"]+[Variation "Caro-Kann: Gurgenidze/Modern: 3.Nd2 g6 4.Ngf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 g6 4.Ngf3 *++[ECO "B12h"]+[Variation "Caro-Kann: Gurgenidze/Modern: 3.Nd2 g6 4.Ngf3 Bg7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 g6 4.Ngf3 Bg7 *++[ECO "B12h"]+[Variation "Caro-Kann: Gurgenidze/Modern: 3.Nd2 g6 4.Ngf3 Bg7 5.h3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 g6 4.Ngf3 Bg7 5.h3 *++[ECO "B12h"]+[Variation "Caro-Kann: Gurgenidze/Modern: 3.Nd2 g6 4.Ngf3 Bg7 5.c3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 g6 4.Ngf3 Bg7 5.c3 *++[ECO "B12i"]+[Variation "Caro-Kann: Advance Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 *++[ECO "B12j"]+[Variation "Caro-Kann: Advance, 3...c5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 c5 *++[ECO "B12j"]+[Variation "Caro-Kann: Advance, 3...c5 4.dxc5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 c5 4.dxc5 *++[ECO "B12k"]+[Variation "Caro-Kann: Advance, 3...c5 4.dxc5 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 c5 4.dxc5 Nc6 *++[ECO "B12l"]+[Variation "Caro-Kann: Advance, 3...Bf5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 *++[ECO "B12l"]+[Variation "Caro-Kann: Advance, Bayonet Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.g4 *++[ECO "B12m"]+[Variation "Caro-Kann: Advance, 4.h4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.h4 *++[ECO "B12n"]+[Variation "Caro-Kann: Advance, 4.c3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.c3 *++[ECO "B12n"]+[Variation "Caro-Kann: Advance, Short Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.c3 e6 5.Be2 *++[ECO "B12o"]+[Variation "Caro-Kann: Advance, 4.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Bd3 *++[ECO "B12p"]+[Variation "Caro-Kann: Advance, 4.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 *++[ECO "B12p"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 *++[ECO "B12q"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 *++[ECO "B12r"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 Nd7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 Nd7 *++[ECO "B12s"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 *++[ECO "B12t"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.O-O *++[ECO "B12t"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.O-O Ne7 *++[ECO "B12t"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.O-O Nd7 *++[ECO "B12u"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.Be3 *++[ECO "B12u"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.Be3 Ne7 *++[ECO "B12u"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.Be3 Nd7 *++[ECO "B12u"]+[Variation "Caro-Kann: Advance, 4.Nf3 e6 5.Be2 c5 6.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.Be3 Nd7 7.O-O *++[ECO "B12v"]+[Variation "Caro-Kann: Advance, 4.Nc3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 *++[ECO "B12v"]+[Variation "Caro-Kann: Advance, 4.Nc3 h5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 h5 *++[ECO "B12v"]+[Variation "Caro-Kann: Advance, 4.Nc3 Qb6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 Qb6 *++[ECO "B12v"]+[Variation "Caro-Kann: Advance, 4.Nc3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 e6 *++[ECO "B12w"]+[Variation "Caro-Kann: Advance, Main Line"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 e6 5.g4 *++[ECO "B12w"]+[Variation "Caro-Kann: Advance, Main Line, 6.Nge2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 e6 5.g4 Bg6 6.Nge2 *++[ECO "B12x"]+[Variation "Caro-Kann: Advance, Main Line, 6.Nge2 c5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nc3 e6 5.g4 Bg6 6.Nge2 c5 *++[ECO "B13a"]+[Variation "Caro-Kann: Exchange Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 *++[ECO "B13a"]+[Variation "Caro-Kann: Exchange, 3...Qxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 Qxd5 *++[ECO "B13b"]+[Variation "Caro-Kann: Exchange, 3...cxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 *++[ECO "B13c"]+[Variation "Caro-Kann: Exchange, 4.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Nf3 *++[ECO "B13d"]+[Variation "Caro-Kann: Exchange, 4.Nf3 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Nf3 Nf6 *++[ECO "B13e"]+[Variation "Caro-Kann: Exchange, 4.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 *++[ECO "B13f"]+[Variation "Caro-Kann: Exchange, 4.Bd3 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 *++[ECO "B13f"]+[Variation "Caro-Kann: Exchange, 4.Bd3 Nc6 5.c3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 *++[ECO "B13g"]+[Variation "Caro-Kann: Exchange, 4.Bd3 Nc6 5.c3 g6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 g6 *++[ECO "B13h"]+[Variation "Caro-Kann: Exchange, 4.Bd3 Nc6 5.c3 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 *++[ECO "B13i"]+[Variation "Caro-Kann: Exchange, 4.Bd3 Nc6 5.c3 Nf6 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Nf3 *++[ECO "B13j"]+[Variation "Caro-Kann: Exchange, Rubinstein Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Bf4 *++[ECO "B13k"]+[Variation "Caro-Kann: Exchange, Rubinstein, 6...Bg4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Bf4 Bg4 *++[ECO "B13l"]+[Variation "Caro-Kann: Exchange, Rubinstein, 7.Qb3 Qc8"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Bf4 Bg4 7.Qb3 Qc8 *++[ECO "B13m"]+[Variation "Caro-Kann: Exchange, Rubinstein, 7.Qb3 Qd7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Bf4 Bg4 7.Qb3 Qd7 *++[ECO "B13n"]+[Variation "Caro-Kann: Panov-Botvinnik Attack"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 *++[ECO "B13n"]+[Variation "Caro-Kann: Panov-Botvinnik, 4...e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 e6 *++[ECO "B13o"]+[Variation "Caro-Kann: Panov-Botvinnik, 4...Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 *++[ECO "B13o"]+[Variation "Caro-Kann: Panov-Botvinnik, Gunderam Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.c5 *++[ECO "B13p"]+[Variation "Caro-Kann: Panov-Botvinnik, 5.Nc3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 *++[ECO "B13p"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...dxc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 dxc4 *++[ECO "B13p"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...dxc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 dxc4 6.Bxc4 *++[ECO "B13q"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 *++[ECO "B13q"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.cxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.cxd5 *++[ECO "B13q"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.cxd5 Nxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.cxd5 Nxd5 *++[ECO "B13r"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 *++[ECO "B13s"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 *++[ECO "B13s"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 7.cxd5 *++[ECO "B13s"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 7.cxd5 Nxd5 *++[ECO "B13t"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4: 8.Qb3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 7.cxd5 Nxd5 8.Qb3 *++[ECO "B13t"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4: 9.gxf3 Nb6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 7.cxd5 Nxd5 8.Qb3 Bxf3 9.gxf3 Nb6 *++[ECO "B13u"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Nf3 Bg4: Main Line"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Nf3 Bg4 7.cxd5 Nxd5 8.Qb3 Bxf3 9.gxf3 e6 *++[ECO "B13v"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Bg5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 *++[ECO "B13v"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Spielmann Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 Qb6 *++[ECO "B13v"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Bg5 dxc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 dxc4 *++[ECO "B13v"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Herzog Defence"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 dxc4 7.d5 Na5 *++[ECO "B13w"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Czerniak Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 Qa5 *++[ECO "B13x"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6 6.Bg5 Be6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 Be6 *++[ECO "B13y"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 *++[ECO "B13y"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nf3 *++[ECO "B13y"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nf3 Be7 *++[ECO "B13z"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variaiton, 8.c5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nf3 Be7 8.c5 *++[ECO "B13z"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variation, 8.c5 O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nf3 Be7 8.c5 O-O *++[ECO "B13z"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...Nc6, Normal Variation, 8.c5 O-O 9.Bb5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nf3 Be7 8.c5 O-O 9.Bb5 *++[ECO "B14a"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 *++[ECO "B14a"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Nf3 *++[ECO "B14b"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.cxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.cxd5 *++[ECO "B14c"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.cxd5 Nxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.cxd5 Nxd5 *++[ECO "B14d"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.cxd5 Nxd5 7.Bc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.cxd5 Nxd5 7.Bc4 *++[ECO "B14e"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.cxd5 Bg7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.cxd5 Bg7 *++[ECO "B14f"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.Qb3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Qb3 *++[ECO "B14f"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6 6.Qb3 Bg7 7.cxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Qb3 Bg7 7.cxd5 *++[ECO "B14f"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6, Main Line"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Qb3 Bg7 7.cxd5 O-O *++[ECO "B14g"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6, Main Line, 8.Be2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Qb3 Bg7 7.cxd5 O-O 8.Be2 *++[ECO "B14h"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...g6, Main Line, 8.Be2 Nbd7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 6.Qb3 Bg7 7.cxd5 O-O 8.Be2 Nbd7 *++[ECO "B14i"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 *++[ECO "B14j"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 *++[ECO "B14j"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Nc6 *++[ECO "B14k"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Be7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 *++[ECO "B14l"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Be7 7.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.Bd3 *++[ECO "B14m"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Be7 7.cxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.cxd5 *++[ECO "B14n"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Be7 7.cxd5 Nxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.cxd5 Nxd5 *++[ECO "B14o"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Be7 7.cxd5 Nxd5 8.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.cxd5 Nxd5 8.Bd3 *++[ECO "B14p"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 *++[ECO "B14q"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 exd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 exd5 *++[ECO "B14r"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 *++[ECO "B14s"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2 *++[ECO "B14t"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2 Nc6 *++[ECO "B14u"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2 Nc6 9.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Qc2 Nc6 9.Bd3 *++[ECO "B14v"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2 *++[ECO "B14w"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2 Nc6 *++[ECO "B14x"]+[Variation "Caro-Kann: Panov-Botvinnik, 5...e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2 Nc6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 8.Bd2 Nc6 9.Bd3 O-O *++[ECO "B15a"]+[Variation "Caro-Kann: 3.Nc3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 *++[ECO "B15b"]+[Variation "Caro-Kann: Gurgenidze Counterattack"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 b5 *++[ECO "B15c"]+[Variation "Caro-Kann: Gurgenidze/Modern"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 *++[ECO "B15d"]+[Variation "Caro-Kann: Gurgenidze: 4.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Be3 *++[ECO "B15d"]+[Variation "Caro-Kann: Gurgenidze: 4.Be3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Be3 Bg7 *++[ECO "B15e"]+[Variation "Caro-Kann: Gurgenidze: 4.h3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.h3 *++[ECO "B15e"]+[Variation "Caro-Kann: Gurgenidze: 4.h3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.h3 Bg7 *++[ECO "B15f"]+[Variation "Caro-Kann: Gurgenidze: 4.e5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 *++[ECO "B15f"]+[Variation "Caro-Kann: Gurgenidze: 4.e5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 *++[ECO "B15g"]+[Variation "Caro-Kann: Gurgenidze: 4.e5 Bg7 5.f4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 5.f4 *++[ECO "B15g"]+[Variation "Caro-Kann: Gurgenidze: 4.e5 Bg7 5.f4 Nh6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 5.f4 Nh6 *++[ECO "B15h"]+[Variation "Caro-Kann: Gurgenidze: 4.e5 Bg7 5.f4 h5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 5.f4 h5 *++[ECO "B15i"]+[Variation "Caro-Kann: Gurgenidze: 4.e5 Bg7 5.f4 h5 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 5.f4 h5 6.Nf3 *++[ECO "B15j"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 *++[ECO "B15k"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 *++[ECO "B15k"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.exd5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.exd5 *++[ECO "B15k"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.e5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.e5 *++[ECO "B15l"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.h3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 *++[ECO "B15m"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.h3 dxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 dxe4 *++[ECO "B15m"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.h3 dxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 dxe4 6.Nxe4 *++[ECO "B15n"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.h3 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 Nf6 *++[ECO "B15o"]+[Variation "Caro-Kann: Gurgenidze: 4.Nf3 Bg7 5.h3 Nf6 6.e5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 Nf6 6.e5 *++[ECO "B15p"]+[Variation "Caro-Kann: 3.Nc3 dxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 *++[ECO "B15p"]+[Variation "Caro-Kann: Rasa-Studier Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.f3 *++[ECO "B15p"]+[Variation "Caro-Kann: von Hennig Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Bc4 *++[ECO "B15q"]+[Variation "Caro-Kann: 4.Nxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 *++[ECO "B15r"]+[Variation "Caro-Kann: 4.Nxe4 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 *++[ECO "B15r"]+[Variation "Caro-Kann: 4.Nxe4 Nf6 5.f3 Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.f3 *++[ECO "B15r"]+[Variation "Caro-Kann: Alekhine Gambit"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Bd3 *++[ECO "B15s"]+[Variation "Caro-Kann: 4.Nxe4 Nf6 5.Ng3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Ng3 *++[ECO "B15t"]+[Variation "Caro-Kann: 4.Nxe4 Nf6 5.Nxf6+"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ *++[ECO "B15t"]+[Variation "Caro-Kann: Tartakower (Nimzowitsch) Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ exf6 *++[ECO "B15u"]+[Variation "Caro-Kann: Tartakower, Forgacs Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ exf6 6.Bc4 *++[ECO "B15v"]+[Variation "Caro-Kann: Tartakower, 6.c3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ exf6 6.c3 *++[ECO "B16a"]+[Variation "Caro-Kann: Bronstein-Larsen"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 *++[ECO "B16b"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Qd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Qd3 *++[ECO "B16c"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Ne2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Ne2 *++[ECO "B16d"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Bc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Bc4 *++[ECO "B16e"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Nf3 *++[ECO "B16f"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Nf3 Bf5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Nf3 Bf5 *++[ECO "B16g"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Nf3 Bg4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Nf3 Bg4 *++[ECO "B16h"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.Nf3 Bg4 7.Be2 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.Nf3 Bg4 7.Be2 e6 *++[ECO "B16i"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 *++[ECO "B16j"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3 Bf5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 Bf5 *++[ECO "B16k"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3 Bf5 7.Ne2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 Bf5 7.Ne2 *++[ECO "B16l"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3 Bf5 7.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 Bf5 7.Nf3 *++[ECO "B16m"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3 Bf5 7.Nf3 Qc7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 Bf5 7.Nf3 Qc7 *++[ECO "B16n"]+[Variation "Caro-Kann: Bronstein-Larsen, 6.c3 Bf5 7.Nf3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 6.c3 Bf5 7.Nf3 e6 *++[ECO "B17a"]+[Variation "Caro-Kann: Steinitz Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 *++[ECO "B17b"]+[Variation "Caro-Kann: Steinitz, 5.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 *++[ECO "B17c"]+[Variation "Caro-Kann: Steinitz, 5.Nf3 Ngf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 *++[ECO "B17d"]+[Variation "Caro-Kann: Steinitz, 5.Nf3 Ngf6 6.Nxf6+"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ *++[ECO "B17e"]+[Variation "Caro-Kann: Steinitz, 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bc4 *++[ECO "B17f"]+[Variation "Caro-Kann: Steinitz, 5.Nf3 Ngf6 6.Ng3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Ng3 *++[ECO "B17g"]+[Variation "Caro-Kann: Steinitz, 5.Nf3 Ngf6 6.Ng3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Ng3 e6 *++[ECO "B17h"]+[Variation "Caro-Kann: Steinitz, 5.Ng5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 *++[ECO "B17i"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 *++[ECO "B17j"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 *++[ECO "B17k"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6 *++[ECO "B17l"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3 e6 7.N1f3 Bd6 8.Qe2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6 7.N1f3 Bd6 8.Qe2 *++[ECO "B17m"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3, Main Line 10.Qxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6 7.N1f3 Bd6 8.Qe2 h6 9.Ne4 Nxe4 10.Qxe4 *++[ECO "B17n"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3, Main Line 10.Qxe4 Qc7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6 7.N1f3 Bd6 8.Qe2 h6 9.Ne4 Nxe4 10.Qxe4 Qc7 *++[ECO "B17o"]+[Variation "Caro-Kann: Steinitz, 5.Ng5 Ngf6 6.Bd3, Main Line 10.Qxe4 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6 7.N1f3 Bd6 8.Qe2 h6 9.Ne4 Nxe4 10.Qxe4 Nf6 *++[ECO "B17p"]+[Variation "Caro-Kann: Steinitz, 5.Bc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 *++[ECO "B17q"]+[Variation "Caro-Kann: Steinitz, 5.Bc4 Ngf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 *++[ECO "B17r"]+[Variation "Caro-Kann: Steinitz, 5.Bc4 Ngf6 6.Ng5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 *++[ECO "B17s"]+[Variation "Caro-Kann: Steinitz, 5.Bc4 Ngf6 6.Ng5, 8.Bb3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 e6 7.Qe2 Nb6 8.Bb3 *++[ECO "B17t"]+[Variation "Caro-Kann: Steinitz, 5.Bc4 Ngf6 6.Ng5, 8.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 e6 7.Qe2 Nb6 8.Bd3 *++[ECO "B17u"]+[Variation "Caro-Kann: Steinitz, 5.Bc4 Ngf6 6.Ng5, 8.Bd3 h6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 e6 7.Qe2 Nb6 8.Bd3 h6 *++[ECO "B18a"]+[Variation "Caro-Kann: Classical"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 *++[ECO "B18b"]+[Variation "Caro-Kann: Classical, 5.Nc5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Nc5 *++[ECO "B18c"]+[Variation "Caro-Kann: Classical, 5.Nc5 b6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Nc5 b6 *++[ECO "B18d"]+[Variation "Caro-Kann: Classical, 5.Ng3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 *++[ECO "B18e"]+[Variation "Caro-Kann: Classical, 5.Ng3 Bg6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 *++[ECO "B18f"]+[Variation "Caro-Kann: Classical, Maroczy Attack"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.f4 *++[ECO "B18g"]+[Variation "Caro-Kann: Classical, Flohr Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nh3 *++[ECO "B18h"]+[Variation "Caro-Kann: Classical, 6.N1e2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.N1e2 *++[ECO "B18i"]+[Variation "Caro-Kann: Classical, 6.Bc4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Bc4 *++[ECO "B18j"]+[Variation "Caro-Kann: Classical, 6.Bc4 e6 7.N1e2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Bc4 e6 7.N1e2 *++[ECO "B18k"]+[Variation "Caro-Kann: Classical, 6.Bc4 e6 7.N1e2 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Bc4 e6 7.N1e2 Nf6 *++[ECO "B18l"]+[Variation "Caro-Kann: Classical, 6.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nf3 *++[ECO "B18m"]+[Variation "Caro-Kann: Classical, 6.Nf3 Nd7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nf3 Nd7 *++[ECO "B18n"]+[Variation "Caro-Kann: Classical, 6.Nf3 Nd7 7.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nf3 Nd7 7.Bd3 *++[ECO "B18o"]+[Variation "Caro-Kann: Classical, 6.Nf3 Nd7 7.Bd3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nf3 Nd7 7.Bd3 e6 *++[ECO "B18p"]+[Variation "Caro-Kann: Classical, 6.h4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 *++[ECO "B18p"]+[Variation "Caro-Kann: Classical, 6.h4 h6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 *++[ECO "B18q"]+[Variation "Caro-Kann: Classical, 6.h4 h6 7.Nh3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nh3 *++[ECO "B18r"]+[Variation "Caro-Kann: Classical, 6.h4 h6 7.f4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.f4 *++[ECO "B18s"]+[Variation "Caro-Kann: Classical, 6.h4 h6 7.h5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.h5 *++[ECO "B19a"]+[Variation "Caro-Kann: Classical, 7.Nf3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 *++[ECO "B19b"]+[Variation "Caro-Kann: Classical, 7.Nf3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 e6 *++[ECO "B19c"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nf6 *++[ECO "B19d"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nf6 8.h5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nf6 8.h5 *++[ECO "B19d"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nf6 8.h5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nf6 8.h5 Bh7 *++[ECO "B19e"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nf6 8.Ne5"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nf6 8.Ne5 *++[ECO "B19f"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nf6 8.Ne5 Bh7 9.Bd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nf6 8.Ne5 Bh7 9.Bd3 *++[ECO "B19g"]+[Variation "Caro-Kann: Classical, 7.Nf3 Nd7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 *++[ECO "B19h"]+[Variation "Caro-Kann: Classical, Spassky Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 *++[ECO "B19h"]+[Variation "Caro-Kann: Classical, Spassky Variation"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 *++[ECO "B19i"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 *++[ECO "B19j"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 Ngf6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Ngf6 *++[ECO "B19k"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 e6 *++[ECO "B19l"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 e6 11.Bf4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 e6 11.Bf4 *++[ECO "B19m"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 Qc7"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 *++[ECO "B19n"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 Qc7 11.Bd2"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 *++[ECO "B19o"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 Qc7 11.Bd2 e6"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 *++[ECO "B19p"]+[Variation "Caro-Kann: Classical, Spassky, 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O *++[ECO "B19q"]+[Variation "Caro-Kann: Classical, Spassky, Main Line"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O Ngf6 *++[ECO "B19r"]+[Variation "Caro-Kann: Classical, Spassky, Main Line, 13.Ne4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O Ngf6 13.Ne4 *++[ECO "B19s"]+[Variation "Caro-Kann: Classical, Spassky, Main Line, 13.Ne4 O-O-O"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O Ngf6 13.Ne4 O-O-O *++[ECO "B19t"]+[Variation "Caro-Kann: Classical, Spassky, Main Line, 14.g3 Nxe4"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 Bh7 9.Bd3 Bxd3 10.Qxd3 Qc7 11.Bd2 e6 12.O-O-O Ngf6 13.Ne4 O-O-O 14.g3 Nxe4 *++[ECO "B20"]+[Variation "Sicilian Defence"]+[Result "*"]+1.e4 c5 *++[ECO "B20"]+[Variation "Sicilian: Mengarini"]+[Result "*"]+1.e4 c5 2.a3 *++[ECO "B20"]+[Variation "Sicilian: Keres Variation (2.Ne2)"]+[Result "*"]+1.e4 c5 2.Ne2 *++[ECO "B20"]+[Variation "Sicilian: 2.Bc4"]+[Result "*"]+1.e4 c5 2.Bc4 *++[ECO "B20"]+[Variation "Sicilian: Wing Gambit"]+[Result "*"]+1.e4 c5 2.b4 *++[ECO "B20"]+[Variation "Sicilian: Wing Gambit, Santasiere Variation"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.c4 *++[ECO "B20"]+[Variation "Sicilian: Wing Gambit, Marshall Variation"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 *++[ECO "B20"]+[Variation "Sicilian: Wing Gambit, Marienbad Variation"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 d5 4.exd5 Qxd5 5.Bb2 *++[ECO "B20"]+[Variation "Sicilian: Wing Gambit, Carlsbad Variation"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 bxa3 *++[ECO "B20"]+[Variation "Sicilian: Snyder"]+[Result "*"]+1.e4 c5 2.b3 *++[ECO "B20"]+[Variation "Sicilian: Snyder, 2...e6"]+[Result "*"]+1.e4 c5 2.b3 e6 *++[ECO "B20"]+[Variation "Sicilian: Snyder, 2...d6"]+[Result "*"]+1.e4 c5 2.b3 d6 *++[ECO "B20"]+[Variation "Sicilian: Snyder, 2...Nc6"]+[Result "*"]+1.e4 c5 2.b3 Nc6 *++[ECO "B20"]+[Variation "Sicilian: English (2.c4)"]+[Result "*"]+1.e4 c5 2.c4 *++[ECO "B20"]+[Variation "Sicilian: English, 2...e6"]+[Result "*"]+1.e4 c5 2.c4 e6 *++[ECO "B20"]+[Variation "Sicilian: English, 2...d6"]+[Result "*"]+1.e4 c5 2.c4 d6 *++[ECO "B20"]+[Variation "Sicilian: English, 2...Nc6"]+[Result "*"]+1.e4 c5 2.c4 Nc6 *++[ECO "B20"]+[Variation "Sicilian: English, 2...Nc6 3.Nf3"]+[Result "*"]+1.e4 c5 2.c4 Nc6 3.Nf3 *++[ECO "B20"]+[Variation "Sicilian: English, 2...Nc6 3.Ne2"]+[Result "*"]+1.e4 c5 2.c4 Nc6 3.Ne2 *++[ECO "B20"]+[Variation "Sicilian: English, 2...Nc6 3.Nc3"]+[Result "*"]+1.e4 c5 2.c4 Nc6 3.Nc3 *++[ECO "B20"]+[Variation "Sicilian: English, 2...Nc6 3.Nc3 g6"]+[Result "*"]+1.e4 c5 2.c4 Nc6 3.Nc3 g6 *++[ECO "B20"]+[Variation "Sicilian: 2.g3"]+[Result "*"]+1.e4 c5 2.g3 *++[ECO "B20"]+[Variation "Sicilian: 2.g3"]+[Result "*"]+1.e4 c5 2.g3 g6 *++[ECO "B20"]+[Variation "Sicilian: 2.g3"]+[Result "*"]+1.e4 c5 2.g3 g6 3.Bg2 Bg7 *++[ECO "B20"]+[Variation "Sicilian: 2.g3"]+[Result "*"]+1.e4 c5 2.g3 g6 3.Bg2 Bg7 4.f4 *++[ECO "B20"]+[Variation "Sicilian: 2.g3"]+[Result "*"]+1.e4 c5 2.g3 g6 3.Bg2 Bg7 4.f4 d6 *++[ECO "B20"]+[Variation "Sicilian: 2.d3"]+[Result "*"]+1.e4 c5 2.d3 *++[ECO "B20"]+[Variation "Sicilian: 2.d3 e6"]+[Result "*"]+1.e4 c5 2.d3 e6 *++[ECO "B20"]+[Variation "Sicilian: 2.d3 e6 3.g3"]+[Result "*"]+1.e4 c5 2.d3 e6 3.g3 *++[ECO "B20"]+[Variation "Sicilian: 2.d3 Nc6"]+[Result "*"]+1.e4 c5 2.d3 Nc6 *++[ECO "B20"]+[Variation "Sicilian: 2.d3 Nc6 3.g3"]+[Result "*"]+1.e4 c5 2.d3 Nc6 3.g3 *++[ECO "B21a"]+[Variation "Sicilian: Grand Prix Attack"]+[Result "*"]+1.e4 c5 2.f4 *++[ECO "B21b"]+[Variation "Sicilian: Grand Prix, 2...g6"]+[Result "*"]+1.e4 c5 2.f4 g6 *++[ECO "B21c"]+[Variation "Sicilian: Grand Prix, 2...d6"]+[Result "*"]+1.e4 c5 2.f4 d6 *++[ECO "B21d"]+[Variation "Sicilian: Grand Prix, 2...e6"]+[Result "*"]+1.e4 c5 2.f4 e6 *++[ECO "B21d"]+[Variation "Sicilian: Grand Prix, 2...e6 3.Nf3"]+[Result "*"]+1.e4 c5 2.f4 e6 3.Nf3 *++[ECO "B21e"]+[Variation "Sicilian: Grand Prix, 2...Nc6"]+[Result "*"]+1.e4 c5 2.f4 Nc6 *++[ECO "B21e"]+[Variation "Sicilian: Grand Prix, 2...Nc6 3.d3"]+[Result "*"]+1.e4 c5 2.f4 Nc6 3.d3 *++[ECO "B21f"]+[Variation "Sicilian: Grand Prix, 2...Nc6 3.Nf3"]+[Result "*"]+1.e4 c5 2.f4 Nc6 3.Nf3 *++[ECO "B21g"]+[Variation "Sicilian: Grand Prix, 2...Nc6 3.Nf3 e6"]+[Result "*"]+1.e4 c5 2.f4 Nc6 3.Nf3 e6 *++[ECO "B21h"]+[Variation "Sicilian: Grand Prix, 2...Nc6 3.Nf3 g6"]+[Result "*"]+1.e4 c5 2.f4 Nc6 3.Nf3 g6 *++[ECO "B21i"]+[Variation "Sicilian: Grand Prix, Tal Defence"]+[Result "*"]+1.e4 c5 2.f4 d5 *++[ECO "B21i"]+[Variation "Sicilian: Grand Prix, Tal Defence, 3.e5"]+[Result "*"]+1.e4 c5 2.f4 d5 3.e5 *++[ECO "B21i"]+[Variation "Sicilian: Grand Prix, Toilet Variation"]+[Result "*"]+1.e4 c5 2.f4 d5 3.Nc3 *++[ECO "B21j"]+[Variation "Sicilian: Grand Prix, Tal Defence, 3.exd5"]+[Result "*"]+1.e4 c5 2.f4 d5 3.exd5 *++[ECO "B21j"]+[Variation "Sicilian: Grand Prix, Tal Defence, 3.exd5 Qxd5"]+[Result "*"]+1.e4 c5 2.f4 d5 3.exd5 Qxd5 *++[ECO "B21k"]+[Variation "Sicilian: Grand Prix, Tal Gambit"]+[Result "*"]+1.e4 c5 2.f4 d5 3.exd5 Nf6 *++[ECO "B21l"]+[Variation "Sicilian: Grand Prix, Tal Gambit, 4.Bb5+"]+[Result "*"]+1.e4 c5 2.f4 d5 3.exd5 Nf6 4.Bb5+ *++[ECO "B21m"]+[Variation "Sicilian: Smith-Morra Gambit"]+[Result "*"]+1.e4 c5 2.d4 *++[ECO "B21m"]+[Variation "Sicilian: Smith-Morra, 2...d5"]+[Result "*"]+1.e4 c5 2.d4 d5 *++[ECO "B21m"]+[Variation "Sicilian: Smith-Morra, 2...cxd4"]+[Result "*"]+1.e4 c5 2.d4 cxd4 *++[ECO "B21m"]+[Variation "Sicilian: Halasz Gambit"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.f4 *++[ECO "B21n"]+[Variation "Sicilian: Smith-Morra, Morphy Gambit"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.Nf3 *++[ECO "B21n"]+[Variation "Sicilian: Smith-Morra, Andreaschek Gambit"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.Nf3 e5 4.c3 *++[ECO "B21o"]+[Variation "Sicilian: Smith-Morra, 3.c3"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 *++[ECO "B21p"]+[Variation "Sicilian: Smith-Morra, 3.c3 Nf6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 Nf6 *++[ECO "B21q"]+[Variation "Sicilian: Smith-Morra, 3.c3 d5"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 d5 *++[ECO "B21r"]+[Variation "Sicilian: Smith-Morra, 3.c3 d3"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 d3 *++[ECO "B21s"]+[Variation "Sicilian: Smith-Morra Accepted"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 *++[ECO "B21s"]+[Variation "Sicilian: Smith-Morra Accepted"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 *++[ECO "B21t"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 d6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 d6 *++[ECO "B21u"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 e6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 e6 *++[ECO "B21v"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 e6 5.Nf3"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 e6 5.Nf3 *++[ECO "B21w"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 *++[ECO "B21w"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6 5.Nf3"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 *++[ECO "B21x"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6 5.Nf3 e6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 e6 *++[ECO "B21x"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6 5.Nf3 e6 6.Bc4"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 e6 6.Bc4 *++[ECO "B21x"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6 5.Nf3 e6 6.Bc4 a6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 e6 6.Bc4 a6 *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra, 4.Nxc3 Nc6 5.Nf3 d6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4 a6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 a6 *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4 e6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4 e6 7.O-O"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 7.O-O *++[ECO "B21y"]+[Variation "Sicilian: Smith-Morra Gambit, Chicago Defence"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 7.O-O a6 8.Qe2 b5 9.Bb3 Ra7 *++[ECO "B21z"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4 e6 7.O-O Nf6"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 7.O-O Nf6 *++[ECO "B21z"]+[Variation "Sicilian: Smith-Morra, 5.Nf3 d6 6.Bc4 e6 7.O-O Nf6 8.Qe2 Be7"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 7.O-O Nf6 8.Qe2 Be7 *++[ECO "B22a"]+[Variation "Sicilian: Alapin"]+[Result "*"]+1.e4 c5 2.c3 *++[ECO "B22a"]+[Variation "Sicilian: Alapin, 2...e5"]+[Result "*"]+1.e4 c5 2.c3 e5 *++[ECO "B22a"]+[Variation "Sicilian: Alapin, 2...g6"]+[Result "*"]+1.e4 c5 2.c3 g6 *++[ECO "B22a"]+[Variation "Sicilian: Alapin, 2...g6 3.d4"]+[Result "*"]+1.e4 c5 2.c3 g6 3.d4 *++[ECO "B22a"]+[Variation "Sicilian: Alapin, 2...g6 3.d4 cxd4"]+[Result "*"]+1.e4 c5 2.c3 g6 3.d4 cxd4 *++[ECO "B22b"]+[Variation "Sicilian: Alapin, 2...Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nc6 *++[ECO "B22b"]+[Variation "Sicilian: Alapin, 2...Nc6 3.Nf3"]+[Result "*"]+1.e4 c5 2.c3 Nc6 3.Nf3 *++[ECO "B22b"]+[Variation "Sicilian: Alapin, 2...Nc6 3.d4"]+[Result "*"]+1.e4 c5 2.c3 Nc6 3.d4 *++[ECO "B22c"]+[Variation "Sicilian: Alapin, 2...e6"]+[Result "*"]+1.e4 c5 2.c3 e6 *++[ECO "B22c"]+[Variation "Sicilian: Alapin, 2...e6 3.Nf3"]+[Result "*"]+1.e4 c5 2.c3 e6 3.Nf3 *++[ECO "B22c"]+[Variation "Sicilian: Alapin, 2...e6 3.Nf3 d5"]+[Result "*"]+1.e4 c5 2.c3 e6 3.Nf3 d5 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4 d5"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 d5 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4 d5 4.exd5"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 d5 4.exd5 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4 d5 4.exd5 exd5"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 d5 4.exd5 exd5 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4 d5 4.exd5 exd5 5.Nf3"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 d5 4.exd5 exd5 5.Nf3 *++[ECO "B22d"]+[Variation "Sicilian: Alapin, 2...e6 3.d4 d5 4.exd5 exd5 5.Nf3 Nc6"]+[Result "*"]+1.e4 c5 2.c3 e6 3.d4 d5 4.exd5 exd5 5.Nf3 Nc6 *++[ECO "B22e"]+[Variation "Sicilian: Alapin, 2...d6"]+[Result "*"]+1.e4 c5 2.c3 d6 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5"]+[Result "*"]+1.e4 c5 2.c3 d5 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 cxd4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 cxd4 *++[ECO "B22f"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 cxd4 5.cxd4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 cxd4 5.cxd4 *++[ECO "B22g"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 e6"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 e6 *++[ECO "B22g"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 e6 5.Nf3"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 e6 5.Nf3 *++[ECO "B22h"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nc6"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 *++[ECO "B22h"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 *++[ECO "B22h"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4 *++[ECO "B22h"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4 6.cxd4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4 6.cxd4 *++[ECO "B22i"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 Bg4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 Bg4 *++[ECO "B22j"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 *++[ECO "B22j"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 *++[ECO "B22k"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 Bg4"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 Bg4 *++[ECO "B22l"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 Bg4 6.Be2 e6"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 Bg4 6.Be2 e6 *++[ECO "B22m"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 e6 6.Be3"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 e6 6.Be3 *++[ECO "B22n"]+[Variation "Sicilian: Alapin, 2...d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 e6 6.Be2"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6 5.Nf3 e6 6.Be2 *++[ECO "B22o"]+[Variation "Sicilian: Alapin, 2...Nf6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 *++[ECO "B22o"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 *++[ECO "B22o"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 *++[ECO "B22o"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.g3"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.g3 *++[ECO "B22p"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.Nf3"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.Nf3 *++[ECO "B22p"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.Nf3 Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.Nf3 Nc6 *++[ECO "B22p"]+[Variation "Sicilian: Alapin, Heidenfeld Variation"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.Nf3 Nc6 5.Na3 *++[ECO "B22p"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 *++[ECO "B22q"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4 cxd4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 *++[ECO "B22q"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.Bc4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Bc4 *++[ECO "B22q"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.Qxd4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Qxd4 *++[ECO "B22r"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 *++[ECO "B22r"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 e6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 e6 *++[ECO "B22r"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 Nc6 *++[ECO "B22s"]+[Variation "Sicilian: Alapin, 2...Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 Nc6 6.Bc4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.Nf3 Nc6 6.Bc4 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 Nc6 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 Nc6 6.Nf3"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 Nc6 6.Nf3 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 6.Nf3 *++[ECO "B22t"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6 6.Nf3 Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 6.Nf3 Nc6 *++[ECO "B22u"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6 6.Nf3 Nc6 7.Bc4"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 6.Nf3 Nc6 7.Bc4 *++[ECO "B22u"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6 6.Nf3 Nc6 7.Bc4 Nb6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 6.Nf3 Nc6 7.Bc4 Nb6 *++[ECO "B22u"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 d6 6.Nf3 Nc6 7.Bc4 Nb6 8.Bb5"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 d6 6.Nf3 Nc6 7.Bc4 Nb6 8.Bb5 *++[ECO "B22v"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 e6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 *++[ECO "B22v"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 e6 6.Nf3"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 6.Nf3 *++[ECO "B22v"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 e6 6.Nf3 Nc6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 6.Nf3 Nc6 *++[ECO "B22w"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 e6 6.Nf3 d6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 6.Nf3 d6 *++[ECO "B22x"]+[Variation "Sicilian: Alapin, 2...Nf6, 5.cxd4 e6 6.Nf3 b6"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 6.Nf3 b6 *++[ECO "B23a"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 *++[ECO "B23b"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 g6 *++[ECO "B23c"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 d6 *++[ECO "B23c"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 d6 3.Nge2 *++[ECO "B23d"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 d6 3.g3 *++[ECO "B23e"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 d6 3.f4 *++[ECO "B23f"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 e6 *++[ECO "B23g"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 e6 3.f4 *++[ECO "B23h"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 e6 3.Nge2 *++[ECO "B23i"]+[Variation "Sicilian: Closed"]+[Result "*"]+1.e4 c5 2.Nc3 e6 3.g3 *++[ECO "B23j"]+[Variation "Sicilian: Closed, Korchnoi Variation"]+[Result "*"]+1.e4 c5 2.Nc3 e6 3.g3 d5 *++[ECO "B23k"]+[Variation "Sicilian: Closed, 2...Nc6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 *++[ECO "B23l"]+[Variation "Sicilian: Closed, 2...Nc6 3.Bb5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Bb5 *++[ECO "B23m"]+[Variation "Sicilian: Closed, 2...Nc6 3.Bb5 Nd4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Bb5 Nd4 *++[ECO "B23n"]+[Variation "Sicilian: Chameleon Variation"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Nge2 *++[ECO "B23n"]+[Variation "Sicilian: Chameleon, 3...e5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Nge2 e5 *++[ECO "B23n"]+[Variation "Sicilian: Chameleon, 3...g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Nge2 g6 *++[ECO "B23o"]+[Variation "Sicilian: Closed, Grand Prix"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 *++[ECO "B23o"]+[Variation "Sicilian: Closed, Grand Prix, 3...d6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 d6 *++[ECO "B23p"]+[Variation "Sicilian: Closed, Grand Prix, 3...d6 4.Nf3 g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 d6 4.Nf3 g6 *++[ECO "B23q"]+[Variation "Sicilian: Closed, Grand Prix, 3...e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 e6 *++[ECO "B23q"]+[Variation "Sicilian: Closed, Grand Prix, 3...e6 4.Nf3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 e6 4.Nf3 *++[ECO "B23r"]+[Variation "Sicilian: Closed, Grand Prix, 3...e6 4.Nf3 d5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 e6 4.Nf3 d5 *++[ECO "B23s"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 *++[ECO "B23t"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bc4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bc4 *++[ECO "B23u"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bc4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bc4 e6 *++[ECO "B23v"]+[Variation "Sicilian: Closed, Grand Prix, Schofman Variation"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bc4 e6 6.f5 *++[ECO "B23w"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bb5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 *++[ECO "B23w"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bb5 Nd4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 *++[ECO "B23x"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Bd3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Bd3 *++[ECO "B23y"]+[Variation "Sicilian: Closed, Grand Prix, 3...g6 4.Nf3 Bg7 5.Bb5 Nd4 6.O-O"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.O-O *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 e6 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.d3 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6, 5.Nge2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nge2 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6, 5.f4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.f4 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6, 5.d3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6, 5.d3 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 e6 *++[ECO "B24"]+[Variation "Sicilian: Closed, Smyslov Variation"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 e6 6.Be3 Nd4 7.Nce2 *++[ECO "B24"]+[Variation "Sicilian: Closed, 3.g3 g6, 5.d3 e6 6.f4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 e6 6.f4 *++[ECO "B25a"]+[Variation "Sicilian: Closed, 3.g3, 5.d3 d6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 *++[ECO "B25b"]+[Variation "Sicilian: Closed, 3.g3, 5.d3 d6 6.Nge2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nge2 *++[ECO "B25c"]+[Variation "Sicilian: Closed, Botvinnik"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nge2 e5 *++[ECO "B25d"]+[Variation "Sicilian: Closed, 3.g3, 5.d3 d6 6.Nge2 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nge2 e6 *++[ECO "B25e"]+[Variation "Sicilian: Closed, 6.f4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 *++[ECO "B25f"]+[Variation "Sicilian: Closed, 6.f4 Rb8"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 Rb8 *++[ECO "B25g"]+[Variation "Sicilian: Closed, 6.f4 Nf6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 Nf6 *++[ECO "B25h"]+[Variation "Sicilian: Closed, 6.f4 Nf6 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 Nf6 7.Nf3 *++[ECO "B25i"]+[Variation "Sicilian: Closed, 6.f4 e5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e5 *++[ECO "B25j"]+[Variation "Sicilian: Closed, 6.f4 e5 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e5 7.Nf3 *++[ECO "B25j"]+[Variation "Sicilian: Closed, 6.f4 e5 7.Nf3 Nge7"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e5 7.Nf3 Nge7 *++[ECO "B25k"]+[Variation "Sicilian: Closed, 6.f4 e5 7.Nf3 Nge7 8.O-O"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e5 7.Nf3 Nge7 8.O-O *++[ECO "B25l"]+[Variation "Sicilian: Closed, 6.f4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 *++[ECO "B25m"]+[Variation "Sicilian: Closed, 6.f4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 *++[ECO "B25n"]+[Variation "Sicilian: Closed, 6.f4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 *++[ECO "B25o"]+[Variation "Sicilian: Closed, 6.f4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O *++[ECO "B25p"]+[Variation "Sicilian: Closed, 6.f4 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O *++[ECO "B25q"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 *++[ECO "B25r"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Rb8"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Rb8 *++[ECO "B25s"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 b6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 b6 *++[ECO "B25t"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Nd4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Nd4 *++[ECO "B25u"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Nd4 10.Rb1"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Nd4 10.Rb1 *++[ECO "B25v"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Nd4 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Nd4 10.Qd2 *++[ECO "B25w"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Nd4 10.e5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Nd4 10.e5 *++[ECO "B25x"]+[Variation "Sicilian: Closed, 6.f4 e6: 9.Be3 Nd4 10.e5 Nef5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e6 7.Nf3 Nge7 8.O-O O-O 9.Be3 Nd4 10.e5 Nef5 *++[ECO "B26a"]+[Variation "Sicilian: Closed, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 *++[ECO "B26b"]+[Variation "Sicilian: Closed, 6.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Nf6 *++[ECO "B26c"]+[Variation "Sicilian: Closed, 6.Be3 Nf6 7.h3"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Nf6 7.h3 *++[ECO "B26d"]+[Variation "Sicilian: Closed, 6.Be3 e5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e5 *++[ECO "B26e"]+[Variation "Sicilian: Closed, 6.Be3 e5 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e5 7.Qd2 *++[ECO "B26f"]+[Variation "Sicilian: Closed, 6.Be3 e5 7.Qd2 Nge7"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e5 7.Qd2 Nge7 *++[ECO "B26g"]+[Variation "Sicilian: Closed, 6.Be3 Rb8"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Rb8 *++[ECO "B26h"]+[Variation "Sicilian: Closed, 6.Be3 Rb8 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Rb8 7.Qd2 *++[ECO "B26i"]+[Variation "Sicilian: Closed, 6.Be3 Rb8 7.Qd2 b5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Rb8 7.Qd2 b5 *++[ECO "B26j"]+[Variation "Sicilian: Closed, 6.Be3 Rb8 7.Qd2 b5 8.Nge2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 Rb8 7.Qd2 b5 8.Nge2 *++[ECO "B26k"]+[Variation "Sicilian: Closed, 6.Be3 e6"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 *++[ECO "B26l"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 *++[ECO "B26m"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2 Qa5"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 Qa5 *++[ECO "B26n"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2 Nd4"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 Nd4 *++[ECO "B26o"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2 Nge7"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 Nge7 *++[ECO "B26p"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2 Rb8"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 Rb8 *++[ECO "B26q"]+[Variation "Sicilian: Closed, 6.Be3 e6 7.Qd2 Rb8 8.Nge2"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 e6 7.Qd2 Rb8 8.Nge2 *++[ECO "B27a"]+[Variation "Sicilian: 2.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 *++[ECO "B27b"]+[Variation "Sicilian: Mongoose Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Qa5 *++[ECO "B27c"]+[Variation "Sicilian: Quinteros Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Qc7 *++[ECO "B27d"]+[Variation "Sicilian: Katalimov Variation"]+[Result "*"]+1.e4 c5 2.Nf3 b6 *++[ECO "B27e"]+[Variation "Sicilian: Hungarian Variation"]+[Result "*"]+1.e4 c5 2.Nf3 g6 *++[ECO "B27f"]+[Variation "Sicilian: Hungarian, 3.c4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.c4 *++[ECO "B27g"]+[Variation "Sicilian: Hungarian, 3.c3"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.c3 *++[ECO "B27h"]+[Variation "Sicilian: Hungarian, 3.c3 Bg7 4.d4 cxd4 5.cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.c3 Bg7 4.d4 cxd4 5.cxd4 *++[ECO "B27i"]+[Variation "Sicilian: Hungarian, 3.c3 Bg7 4.d4 cxd4 5.cxd4 d5"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.c3 Bg7 4.d4 cxd4 5.cxd4 d5 *++[ECO "B27j"]+[Variation "Sicilian: Hungarian, 3.d4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 *++[ECO "B27k"]+[Variation "Sicilian: Hungarian, 3.d4 cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 cxd4 *++[ECO "B27l"]+[Variation "Sicilian: Hungarian, 3.d4 cxd4 4.Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 cxd4 4.Nxd4 *++[ECO "B27m"]+[Variation "Sicilian: Accelerated Pterodactyl"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 *++[ECO "B27n"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.dxc5"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.dxc5 *++[ECO "B27o"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.dxc5 Qa5+"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.dxc5 Qa5+ *++[ECO "B27p"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.dxc5 Qa5+ 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.dxc5 Qa5+ 5.Nc3 *++[ECO "B27q"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.dxc5 Qa5+ 5.c3"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.dxc5 Qa5+ 5.c3 *++[ECO "B27r"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.dxc5 Qa5+ 5.c3"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.dxc5 Qa5+ 5.c3 Qxc5 *++[ECO "B27s"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.c4"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.c4 *++[ECO "B27t"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.c4 Qa5+"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.c4 Qa5+ *++[ECO "B27t"]+[Variation "Sicilian: Accelerated Pterodactyl, 4.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.d4 Bg7 4.Nc3 *++[ECO "B28a"]+[Variation "Sicilian: O'Kelly Variation"]+[Result "*"]+1.e4 c5 2.Nf3 a6 *++[ECO "B28b"]+[Variation "Sicilian: O'Kelly, 3.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.Nc3 *++[ECO "B28c"]+[Variation "Sicilian: O'Kelly, 3.d4"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.d4 *++[ECO "B28d"]+[Variation "Sicilian: O'Kelly, 3.d4 cxd4 4.Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.d4 cxd4 4.Nxd4 *++[ECO "B28e"]+[Variation "Sicilian: O'Kelly, 3.d4 cxd4 4.Nxd4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B28f"]+[Variation "Sicilian: O'Kelly, 3.c4"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.c4 *++[ECO "B28g"]+[Variation "Sicilian: O'Kelly, 3.c4 e6"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.c4 e6 *++[ECO "B28h"]+[Variation "Sicilian: O'Kelly, 3.c3"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.c3 *++[ECO "B28i"]+[Variation "Sicilian: O'Kelly, 3.c3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.c3 e6 *++[ECO "B28j"]+[Variation "Sicilian: O'Kelly, 3.c3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 a6 3.c3 d5 *++[ECO "B29a"]+[Variation "Sicilian: Nimzowitsch"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 *++[ECO "B29b"]+[Variation "Sicilian: Nimzowitsch, 3.d3"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.d3 *++[ECO "B29c"]+[Variation "Sicilian: Nimzowitsch, 3.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.Nc3 *++[ECO "B29d"]+[Variation "Sicilian: Nimzowitsch, 3.Nc3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.Nc3 d5 *++[ECO "B29e"]+[Variation "Sicilian: Nimzowitsch, 3.Nc3 d5 4.exd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.Nc3 d5 4.exd5 *++[ECO "B29f"]+[Variation "Sicilian: Nimzowitsch, 3.e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 *++[ECO "B29f"]+[Variation "Sicilian: Nimzowitsch, 3.e5 Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 *++[ECO "B29g"]+[Variation "Sicilian: Nimzowitsch, 4.c4"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.c4 *++[ECO "B29h"]+[Variation "Sicilian: Nimzowitsch, 4.d4"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.d4 *++[ECO "B29i"]+[Variation "Sicilian: Nimzowitsch, 4.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 *++[ECO "B29j"]+[Variation "Sicilian: Nimzowitsch, 4.Nc3 Nxc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 Nxc3 *++[ECO "B29k"]+[Variation "Sicilian: Nimzowitsch, 4.Nc3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 e6 *++[ECO "B29l"]+[Variation "Sicilian: Nimzowitsch, 4.Nc3 e6 5.Nxd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 e6 5.Nxd5 *++[ECO "B29m"]+[Variation "Sicilian: Nimzowitsch, Rubinstein Countergambit"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 e6 5.Nxd5 exd5 6.d4 Nc6 *++[ECO "B29n"]+[Variation "Sicilian: Nimzowitsch, Rubinstein Countergambit, 7.dxc5"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 e6 5.Nxd5 exd5 6.d4 Nc6 7.dxc5 *++[ECO "B30a"]+[Variation "Sicilian: 2...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 *++[ECO "B30b"]+[Variation "Sicilian: 2...Nc6 3.b3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.b3 *++[ECO "B30c"]+[Variation "Sicilian: 2...Nc6 3.d3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d3 *++[ECO "B30c"]+[Variation "Sicilian: 2...Nc6 3.d3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d3 Nf6 *++[ECO "B30d"]+[Variation "Sicilian: 2...Nc6 3.g3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.g3 *++[ECO "B30e"]+[Variation "Sicilian: 2...Nc6 3.g3 e6 4.d3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.g3 e6 4.d3 *++[ECO "B30f"]+[Variation "Sicilian: 2...Nc6 3.g3 e6 4.d3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.g3 e6 4.d3 d5 *++[ECO "B30g"]+[Variation "Sicilian: 2...Nc6 3.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bc4 *++[ECO "B30h"]+[Variation "Sicilian: 2...Nc6 3.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Nc3 *++[ECO "B30h"]+[Variation "Sicilian: 2...Nc6 3.Nc3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Nc3 Nf6 *++[ECO "B30i"]+[Variation "Sicilian: 2...Nc6 3.Nc3 g6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Nc3 g6 *++[ECO "B30j"]+[Variation "Sicilian: 2...Nc6 3.Nc3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Nc3 e5 *++[ECO "B30k"]+[Variation "Sicilian: Rossolimo"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 *++[ECO "B30l"]+[Variation "Sicilian: Rossolimo, 3...Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 Qb6 *++[ECO "B30m"]+[Variation "Sicilian: Rossolimo, 3...Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 Nf6 *++[ECO "B30n"]+[Variation "Sicilian: Rossolimo, 3...e6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 *++[ECO "B30o"]+[Variation "Sicilian: Rossolimo, 3...e6 4.b3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.b3 *++[ECO "B30p"]+[Variation "Sicilian: Rossolimo, 3...e6 4.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.Nc3 *++[ECO "B30q"]+[Variation "Sicilian: Rossolimo, 3...e6 4.Bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.Bxc6 *++[ECO "B30r"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O *++[ECO "B30s"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 *++[ECO "B30s"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7 5.b3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.b3 *++[ECO "B30t"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7 5.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.Re1 *++[ECO "B30u"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.Nc3 *++[ECO "B30v"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7 5.c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.c3 *++[ECO "B30w"]+[Variation "Sicilian: Rossolimo, 3...e6 4.O-O Nge7 5.c3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.c3 a6 *++[ECO "B31a"]+[Variation "Sicilian: Rossolimo, 3...g6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 *++[ECO "B31b"]+[Variation "Sicilian: Rossolimo, 3...g6 4.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.Nc3 *++[ECO "B31c"]+[Variation "Sicilian: Rossolimo, 3...g6 4.Bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.Bxc6 *++[ECO "B31d"]+[Variation "Sicilian: Rossolimo, 3...g6 4.Bxc6 dxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.Bxc6 dxc6 *++[ECO "B31e"]+[Variation "Sicilian: Rossolimo, 3...g6 4.Bxc6 dxc6 5.d3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.Bxc6 dxc6 5.d3 *++[ECO "B31f"]+[Variation "Sicilian: Rossolimo, 3...g6 4.Bxc6 dxc6 5.d3 Bg7 6.h3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.Bxc6 dxc6 5.d3 Bg7 6.h3 *++[ECO "B31g"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O *++[ECO "B31h"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.c3 *++[ECO "B31i"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.c3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.c3 e5 *++[ECO "B31j"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 *++[ECO "B31k"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 Nf6 *++[ECO "B31l"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 Nf6 6.c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 Nf6 6.c3 *++[ECO "B31m"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 Nf6 6.c3 O-O 7.h3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 Nf6 6.c3 O-O 7.h3 *++[ECO "B31n"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 Nf6 6.c3 O-O 7.d4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 Nf6 6.c3 O-O 7.d4 *++[ECO "B31o"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 e5 *++[ECO "B31p"]+[Variation "Sicilian: Rossolimo, Gurgenidze Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 e5 6.b4 *++[ECO "B31q"]+[Variation "Sicilian: Rossolimo, 3...g6 4.O-O Bg7 5.Re1 e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 e5 6.c3 *++[ECO "B32a"]+[Variation "Sicilian: 2...Nc6 3.d4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 *++[ECO "B32b"]+[Variation "Sicilian: 2...Nc6 3.d4 cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 *++[ECO "B32c"]+[Variation "Sicilian: Open, 2...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 *++[ECO "B32d"]+[Variation "Sicilian: Open, 2...Nc6, 4...d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 d6 *++[ECO "B32e"]+[Variation "Sicilian: Open, 2...Nc6, 4...Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Qb6 *++[ECO "B32f"]+[Variation "Sicilian: Flohr Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Qc7 *++[ECO "B32g"]+[Variation "Sicilian: Flohr, 5.Nb5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Qc7 5.Nb5 *++[ECO "B32h"]+[Variation "Sicilian: 2..Nc6, Nimzowitsch Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 d5 *++[ECO "B32i"]+[Variation "Sicilian: Loewenthal"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 *++[ECO "B32j"]+[Variation "Sicilian: Loewenthal, 5.Nb5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 *++[ECO "B32k"]+[Variation "Sicilian: Loewenthal, 5...a6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 a6 *++[ECO "B32l"]+[Variation "Sicilian: Loewenthal, 5...a6, Queenswap"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 a6 6.Nd6+ Bxd6 7.Qxd6 Qf6 8.Qxf6 *++[ECO "B32m"]+[Variation "Sicilian: Loewenthal, 5...a6, 8.Qd1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 a6 6.Nd6+ Bxd6 7.Qxd6 Qf6 8.Qd1 *++[ECO "B32n"]+[Variation "Sicilian: Loewenthal, Kalashnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 *++[ECO "B32o"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.a4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.a4 *++[ECO "B32p"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.N1c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.N1c3 *++[ECO "B32q"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.N1c3 a6 7.Na3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.N1c3 a6 7.Na3 b5 *++[ECO "B32r"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.N1c3 a6 7.Na3 b5 8.Nd5 Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.N1c3 a6 7.Na3 b5 8.Nd5 Nge7 *++[ECO "B32s"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.c4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 *++[ECO "B32t"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.c4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 *++[ECO "B32u"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.c4 Be7 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.Be2 *++[ECO "B32v"]+[Variation "Sicilian: Loewenthal, Kalashnikov, 6.c4 Be7 7.N1c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.N1c3 *++[ECO "B32w"]+[Variation "Sicilian: Loewenthal, Kalashnikov, Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.N1c3 a6 8.Na3 Be6 *++[ECO "B32x"]+[Variation "Sicilian: Loewenthal, Kalashnikov, Main Line, 9.Nc2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.N1c3 a6 8.Na3 Be6 9.Nc2 *++[ECO "B32y"]+[Variation "Sicilian: Loewenthal, Kalashnikov, Main Line, 9.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.N1c3 a6 8.Na3 Be6 9.Be2 *++[ECO "B33a"]+[Variation "Sicilian: Open, 2...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B33b"]+[Variation "Sicilian: Open, 2...Nc6, 5...Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Qb6 *++[ECO "B33b"]+[Variation "Sicilian: Open, 2...Nc6, 5...Qb6 6.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Qb6 6.Nb3 *++[ECO "B33b"]+[Variation "Sicilian: Open, 2...Nc6, 5...Qb6 6.Nb3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Qb6 6.Nb3 e6 *++[ECO "B33c"]+[Variation "Sicilian: Open, 2...Nc6, 5...Qb6 6.Nb3 e6 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Qb6 6.Nb3 e6 7.Bd3 *++[ECO "B33d"]+[Variation "Sicilian: Pelikan/Sveshnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 *++[ECO "B33d"]+[Variation "Sicilian: Pelikan/Sveshnikov, 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Nxc6 *++[ECO "B33d"]+[Variation "Sicilian: Pelikan/Sveshnikov, 6.Nf5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Nf5 *++[ECO "B33d"]+[Variation "Sicilian: Pelikan/Sveshnikov, 6.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Nf3 *++[ECO "B33d"]+[Variation "Sicilian: Pelikan/Sveshnikov, 6.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Nb3 *++[ECO "B33e"]+[Variation "Sicilian: Pelikan/Sveshnikov, 6.Nbd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 *++[ECO "B33e"]+[Variation "Sicilian: Pelikan, Haberditz Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 h6 *++[ECO "B33f"]+[Variation "Sicilian: Pelikan/Sveshnikov, Pelikan Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 *++[ECO "B33f"]+[Variation "Sicilian: Pelikan, 7.Na3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Na3 *++[ECO "B33g"]+[Variation "Sicilian: Pelikan, 7.a4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.a4 *++[ECO "B33g"]+[Variation "Sicilian: Pelikan, 7.a4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.a4 a6 8.Na3 *++[ECO "B33h"]+[Variation "Sicilian: Pelikan, 7.Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Nd5 *++[ECO "B33i"]+[Variation "Sicilian: Pelikan, 7.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 *++[ECO "B33i"]+[Variation "Sicilian: Pelikan, 7.Bg5 a6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 *++[ECO "B33j"]+[Variation "Sicilian: Pelikan, 7.Bg5 a6 8.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Bxf6 *++[ECO "B33k"]+[Variation "Sicilian: Pelikan, 7.Bg5 a6 8.Na3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 *++[ECO "B33k"]+[Variation "Sicilian: Pelikan, Bird Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 Be6 *++[ECO "B33l"]+[Variation "Sicilian: Pelikan, Chelyabinsk Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 *++[ECO "B33l"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 *++[ECO "B33m"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 *++[ECO "B33n"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7, 11.c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 10.Bxf6 Bxf6 11.c3 *++[ECO "B33o"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7, 11.c3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 10.Bxf6 Bxf6 11.c3 O-O *++[ECO "B33p"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7, 11.c3 Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 10.Bxf6 Bxf6 11.c3 Bg5 *++[ECO "B33q"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7, 11.c3 O-O 12.Nc2 Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 10.Bxf6 Bxf6 11.c3 O-O 12.Nc2 Bg5 *++[ECO "B33r"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Nd5 Be7, 11.c3 O-O 12.Nc2 Bg5 13.a4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Nd5 Be7 10.Bxf6 Bxf6 11.c3 O-O 12.Nc2 Bg5 13.a4 *++[ECO "B33s"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 *++[ECO "B33s"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Bxf6 gxf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 *++[ECO "B33s"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Bxf6 gxf6 10.Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 *++[ECO "B33s"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Bxf6 gxf6 10.Nd5 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 Bg7 *++[ECO "B33t"]+[Variation "Sicilian: Pelikan, Chelyabinsk, 9.Bxf6 gxf6 10.Nd5 Bg7 11.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 Bg7 11.Bd3 *++[ECO "B33u"]+[Variation "Sicilian: Pelikan, Sveshnikov Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 *++[ECO "B33v"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.c3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.c3 *++[ECO "B33v"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.c3 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.c3 Bg7 *++[ECO "B33v"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.c3 Bg7 12.exf5 Bxf5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.c3 Bg7 12.exf5 Bxf5 *++[ECO "B33w"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.c3 Bg7 12.exf5 Bxf5 13.Nc2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.c3 Bg7 12.exf5 Bxf5 13.Nc2 O-O *++[ECO "B33x"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.Bd3 *++[ECO "B33x"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.Bd3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.Bd3 Be6 *++[ECO "B33y"]+[Variation "Sicilian: Pelikan, Sveshnikov, 11.Bd3 Be6 12.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.Bd3 Be6 12.O-O *++[ECO "B34a"]+[Variation "Sicilian: Accelerated Fianchetto"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 *++[ECO "B34b"]+[Variation "Sicilian: Accelerated Fianchetto, 5.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Bc4 *++[ECO "B34c"]+[Variation "Sicilian: Accelerated Fianchetto, Exchange Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nxc6 *++[ECO "B34d"]+[Variation "Sicilian: Accelerated Fianchetto, 5.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Be2 *++[ECO "B34e"]+[Variation "Sicilian: Accelerated Fianchetto, 5.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Be3 *++[ECO "B34f"]+[Variation "Sicilian: Accelerated Fianchetto, Modern Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 *++[ECO "B34g"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 5...Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Nf6 *++[ECO "B34h"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 5...Nf6 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Nf6 6.Nxc6 *++[ECO "B34i"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 5...Nf6 6.Nxc6 bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Nf6 6.Nxc6 bxc6 *++[ECO "B34j"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 5...Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 *++[ECO "B34k"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Nde2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Nde2 *++[ECO "B34l"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Nb3 *++[ECO "B34m"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 *++[ECO "B34n"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 d6 *++[ECO "B34o"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 d6 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 d6 7.Qd2 *++[ECO "B34p"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 *++[ECO "B34q"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.f3 *++[ECO "B34r"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Nxc6 *++[ECO "B34r"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Nxc6 bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Nxc6 bxc6 *++[ECO "B34r"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Nxc6 bxc6 8.e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Nxc6 bxc6 8.e5 *++[ECO "B34s"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Nxc6 bxc6 8.e5 Ng8"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Nxc6 bxc6 8.e5 Ng8 *++[ECO "B34t"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Be2 *++[ECO "B34u"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Be2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Be2 O-O *++[ECO "B34v"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Be2 O-O 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Be2 O-O 8.O-O *++[ECO "B34v"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Be2 O-O 8.O-O d5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Be2 O-O 8.O-O d5 *++[ECO "B34w"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 6.Be3 Nf6 7.Be2 O-O 8.O-O d5 9.exd5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Be2 O-O 8.O-O d5 9.exd5 *++[ECO "B35a"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 *++[ECO "B35b"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 Qa5 *++[ECO "B35c"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 Qa5 8.O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 Qa5 8.O-O O-O *++[ECO "B35d"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 Qa5 8.O-O O-O 9.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 Qa5 8.O-O O-O 9.Bb3 *++[ECO "B35e"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 Qa5 8.O-O O-O 9.Bb3 d6 10.h3 Bd7 11.f4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 Qa5 8.O-O O-O 9.Bb3 d6 10.h3 Bd7 11.f4 *++[ECO "B35f"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O *++[ECO "B35g"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.f3 *++[ECO "B35h"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.O-O *++[ECO "B35i"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 *++[ECO "B35j"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 Ng4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 Ng4 *++[ECO "B35k"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 Qa5 *++[ECO "B35l"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 a5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 a5 *++[ECO "B35m"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 a5 9.a4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 a5 9.a4 *++[ECO "B35n"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 a5 9.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 a5 9.f3 *++[ECO "B35o"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 d6 *++[ECO "B35o"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 d6 9.h3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 d6 9.h3 *++[ECO "B35p"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 d6 9.h3 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 d6 9.h3 Bd7 *++[ECO "B35q"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 d6 9.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 d6 9.f3 *++[ECO "B35r"]+[Variation "Sicilian: Accelerated Fianchetto, Modern, 7.Bc4 O-O 8.Bb3 d6 9.f3 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 O-O 8.Bb3 d6 9.f3 Bd7 *++[ECO "B36a"]+[Variation "Sicilian: Maroczy Bind"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 *++[ECO "B36b"]+[Variation "Sicilian: Maroczy Bind, 5...d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 d6 *++[ECO "B36b"]+[Variation "Sicilian: Maroczy Bind, 5...d6 6.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 d6 6.Nc3 *++[ECO "B36b"]+[Variation "Sicilian: Maroczy Bind, 5...d6 6.Nc3 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 d6 6.Nc3 Bg7 *++[ECO "B36c"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 *++[ECO "B36d"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 *++[ECO "B36e"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 Nxd4 *++[ECO "B36f"]+[Variation "Sicilian: Maroczy Bind, Gurgenidze Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 Nxd4 7.Qxd4 d6 *++[ECO "B36g"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 *++[ECO "B36h"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 *++[ECO "B36i"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 *++[ECO "B36i"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 *++[ECO "B36j"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.O-O *++[ECO "B36k"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5 *++[ECO "B36l"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5 O-O *++[ECO "B36m"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5 O-O 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Bg5 O-O 10.Qd2 *++[ECO "B36n"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 *++[ECO "B36n"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O *++[ECO "B36o"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2 *++[ECO "B36p"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2 Be6 *++[ECO "B36q"]+[Variation "Sicilian: Maroczy Bind, 5...Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2 Be6 11.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 d6 7.Be2 Nxd4 8.Qxd4 Bg7 9.Be3 O-O 10.Qd2 Be6 11.O-O *++[ECO "B37a"]+[Variation "Sicilian: Maroczy Bind, 5...Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 *++[ECO "B37b"]+[Variation "Sicilian: Maroczy Bind, 6.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nb3 *++[ECO "B37c"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 *++[ECO "B37d"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 d6 *++[ECO "B37e"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 d6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 d6 7.Be2 *++[ECO "B37f"]+[Variation "Sicilian: Maroczy Bind, Simagin Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 d6 7.Be2 Nh6 *++[ECO "B37g"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 *++[ECO "B37g"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 *++[ECO "B37h"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 O-O *++[ECO "B37i"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 *++[ECO "B37i"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 *++[ECO "B37j"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 Nd7 *++[ECO "B37k"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O *++[ECO "B37l"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O *++[ECO "B37m"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Be6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Be6 *++[ECO "B37n"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 *++[ECO "B37o"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 *++[ECO "B37o"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 a5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 a5 *++[ECO "B37p"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 Nc5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 Nc5 *++[ECO "B37q"]+[Variation "Sicilian: Maroczy Bind, 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 Nc5 11.b4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 Nf6 7.Nc3 d6 8.Be2 O-O 9.O-O Nd7 10.Bd2 Nc5 11.b4 *++[ECO "B38a"]+[Variation "Sicilian: Maroczy Bind, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 *++[ECO "B38b"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 Nh6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nh6 *++[ECO "B38c"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 d6 *++[ECO "B38c"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 d6 7.Nc3 Nh6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 d6 7.Nc3 Nh6 *++[ECO "B38d"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 *++[ECO "B38d"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 Nf6 7.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 *++[ECO "B38e"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 Nf6 7.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 d6 *++[ECO "B38f"]+[Variation "Sicilian: Maroczy Bind, 6.Be3 Nf6 7.Nc3 d6 8.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 d6 8.Be2 *++[ECO "B38g"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O *++[ECO "B38g"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 *++[ECO "B38h"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 b6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 b6 *++[ECO "B38i"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 b6 9.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 b6 9.O-O *++[ECO "B38i"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7 *++[ECO "B38j"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7 10.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7 10.f3 *++[ECO "B38k"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7 10.f3 Qb8"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 b6 9.O-O Bb7 10.f3 Qb8 *++[ECO "B38l"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 *++[ECO "B38m"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.f3 *++[ECO "B38n"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O *++[ECO "B38o"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Nd7 *++[ECO "B38p"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O a6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O a6 *++[ECO "B38q"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Nxd4 *++[ECO "B38r"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 *++[ECO "B38s"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Nc2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Nc2 *++[ECO "B38t"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.f3 *++[ECO "B38u"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Rc1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Rc1 *++[ECO "B38v"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 *++[ECO "B38w"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 *++[ECO "B38w"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 11.Bxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 11.Bxd4 *++[ECO "B38x"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4, 12.f3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 11.Bxd4 Bc6 12.f3 *++[ECO "B38y"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4, 12.f3 a5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 11.Bxd4 Bc6 12.f3 a5 *++[ECO "B38z"]+[Variation "Sicilian: Maroczy Bind, 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4, 12.f3 a5 13.b3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 O-O 8.Be2 d6 9.O-O Bd7 10.Qd2 Nxd4 11.Bxd4 Bc6 12.f3 a5 13.b3 *++[ECO "B39a"]+[Variation "Sicilian: Maroczy Bind, Breyer Variation"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 *++[ECO "B39b"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 *++[ECO "B39c"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 *++[ECO "B39d"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 *++[ECO "B39e"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 e5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 e5 *++[ECO "B39f"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 e5 10.Nb5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 e5 10.Nb5 *++[ECO "B39g"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 e5 10.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 e5 10.Bd3 *++[ECO "B39h"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 Ne6"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 Ne6 *++[ECO "B39i"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Qd2 *++[ECO "B39j"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1 *++[ECO "B39k"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1 Qa5 *++[ECO "B39l"]+[Variation "Sicilian: Maroczy Bind, Breyer, 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1 Qa5 11.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 8.Qxg4 Nxd4 9.Qd1 Ne6 10.Rc1 Qa5 11.Qd2 *++[ECO "B40a"]+[Variation "Sicilian: 2...e6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 *++[ECO "B40b"]+[Variation "Sicilian: 2...e6 3.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.c4 *++[ECO "B40c"]+[Variation "Sicilian: 2...e6 3.b3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.b3 *++[ECO "B40d"]+[Variation "Sicilian: 2...e6 3.b3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.b3 Nc6 *++[ECO "B40e"]+[Variation "Sicilian: 2...e6 3.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.g3 *++[ECO "B40f"]+[Variation "Sicilian: 2...e6 3.d3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 *++[ECO "B40g"]+[Variation "Sicilian: 2...e6 3.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.Nc3 *++[ECO "B40h"]+[Variation "Sicilian: 2...e6 3.Nc3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.Nc3 Nc6 *++[ECO "B40i"]+[Variation "Sicilian: 2...e6 3.d4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 *++[ECO "B40j"]+[Variation "Sicilian: Marshall Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 d5 *++[ECO "B40k"]+[Variation "Sicilian: Open, 2...e6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 *++[ECO "B40l"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 *++[ECO "B40l"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 d6 *++[ECO "B40m"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Bc5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Bc5 *++[ECO "B40n"]+[Variation "Sicilian: Kveinys Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Qb6 *++[ECO "B40o"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B40p"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Nf6 5.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Bd3 *++[ECO "B40p"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Nf6 5.Bd3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Bd3 Nc6 *++[ECO "B40q"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Nf6 5.Bd3 Nc6 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Bd3 Nc6 6.Nxc6 *++[ECO "B40r"]+[Variation "Sicilian: Open, 2...e6, 4.Nxd4 Nf6 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 *++[ECO "B40s"]+[Variation "Sicilian: Pin Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 *++[ECO "B40t"]+[Variation "Sicilian: Pin, Jaffe Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 6.Bd3 e5 *++[ECO "B40u"]+[Variation "Sicilian: Pin, Koch Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 6.e5 *++[ECO "B41a"]+[Variation "Sicilian: Kan (Paulsen)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 *++[ECO "B41b"]+[Variation "Sicilian: Kan, 5.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.g3 *++[ECO "B41c"]+[Variation "Sicilian: Kan, 5.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Be3 *++[ECO "B41d"]+[Variation "Sicilian: Kan, 5.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Be2 *++[ECO "B41e"]+[Variation "Sicilian: Kan, 5.Be2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Be2 Nf6 *++[ECO "B41f"]+[Variation "Sicilian: Kan, 5.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 *++[ECO "B41g"]+[Variation "Sicilian: Kan, 5.c4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Qc7 *++[ECO "B41h"]+[Variation "Sicilian: Kan, 5.c4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 *++[ECO "B41i"]+[Variation "Sicilian: Kan, 5.c4 Nf6 6.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 *++[ECO "B41j"]+[Variation "Sicilian: Kan, 5.c4 Nf6 6.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 d6 *++[ECO "B41k"]+[Variation "Sicilian: Kan, 5.c4 Nf6 6.Nc3 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 Bb4 *++[ECO "B41k"]+[Variation "Sicilian: Kan, 5.c4 Nf6, Bronstein Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 Bb4 7.Bd3 Nc6 8.Bc2 *++[ECO "B41l"]+[Variation "Sicilian: Kan, 5.c4 Nf6 6.Nc3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 Qc7 *++[ECO "B41m"]+[Variation "Sicilian: Kan, 5.c4 Nf6 6.Nc3 Qc7 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 Qc7 7.Be2 *++[ECO "B42a"]+[Variation "Sicilian: Kan, 5.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 *++[ECO "B42b"]+[Variation "Sicilian: Kan, Swiss Cheese Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 g6 *++[ECO "B42c"]+[Variation "Sicilian: Kan, 5.Bd3 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Qb6 *++[ECO "B42d"]+[Variation "Sicilian: Kan, 5.Bd3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Qc7 *++[ECO "B42e"]+[Variation "Sicilian: Kan, 5.Bd3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nc6 *++[ECO "B42f"]+[Variation "Sicilian: Kan, Polugaevsky Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Bc5 *++[ECO "B42g"]+[Variation "Sicilian: Kan, Polugaevsky, 6.Nb3 Ba7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Bc5 6.Nb3 Ba7 *++[ECO "B42h"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 *++[ECO "B42h"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.c4 *++[ECO "B42h"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O *++[ECO "B42i"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O d6 *++[ECO "B42j"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O d6 7.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O d6 7.c4 *++[ECO "B42k"]+[Variation "Sicilian: Kan, Gipslis Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O d6 7.c4 g6 *++[ECO "B42l"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O Qc7 *++[ECO "B42m"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O Qc7 7.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O Qc7 7.c4 *++[ECO "B42n"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O Qc7 7.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O Qc7 7.Qe2 *++[ECO "B42n"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O Qc7 7.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O Qc7 7.Qe2 d6 *++[ECO "B42o"]+[Variation "Sicilian: Kan, 5.Bd3 Nf6 6.O-O Qc7 7.Qe2 d6 8.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O Qc7 7.Qe2 d6 8.c4 *++[ECO "B43a"]+[Variation "Sicilian: Kan, 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 *++[ECO "B43b"]+[Variation "Sicilian: Kan, 5.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 d6 *++[ECO "B43c"]+[Variation "Sicilian: Kan, 5.Nc3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 b5 *++[ECO "B43d"]+[Variation "Sicilian: Kan, 5.Nc3 b5 6.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 b5 6.Bd3 *++[ECO "B43e"]+[Variation "Sicilian: Kan, 5.Nc3 b5 6.Bd3 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 b5 6.Bd3 Qb6 *++[ECO "B43f"]+[Variation "Sicilian: Kan, 5.Nc3 b5 6.Bd3 Qb6 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 b5 6.Bd3 Qb6 7.Nb3 *++[ECO "B43g"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 *++[ECO "B43h"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.g3 *++[ECO "B43i"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.g3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.g3 Nf6 *++[ECO "B43j"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Be2 *++[ECO "B43k"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Be2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Be2 Nf6 *++[ECO "B43l"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Be2 Nf6 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Be2 Nf6 7.O-O *++[ECO "B43m"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Bd3 *++[ECO "B43n"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Bd3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Bd3 Nf6 *++[ECO "B43o"]+[Variation "Sicilian: Kan, 5.Nc3 Qc7 6.Bd3 Nf6 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 Qc7 6.Bd3 Nf6 7.O-O *++[ECO "B44a"]+[Variation "Sicilian: Taimanov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 *++[ECO "B44b"]+[Variation "Sicilian: Taimanov, 5.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.g3 *++[ECO "B44c"]+[Variation "Sicilian: Taimanov, 5.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Be2 *++[ECO "B44d"]+[Variation "Sicilian: Taimanov, 5.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 *++[ECO "B44d"]+[Variation "Sicilian: Taimanov, 5.c4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 Nf6 *++[ECO "B44e"]+[Variation "Sicilian: Taimanov, 5.c4 Nf6 6.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 Nf6 6.Nc3 *++[ECO "B44e"]+[Variation "Sicilian: Taimanov, 5.c4 Nf6 6.Nc3 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 Nf6 6.Nc3 Bb4 *++[ECO "B44e"]+[Variation "Sicilian: Taimanov, 5.c4 Nf6 6.Nc3 Bb4 7.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 Nf6 6.Nc3 Bb4 7.Nxc6 *++[ECO "B44f"]+[Variation "Sicilian: Taimanov, 5.c4 Nf6 6.Nc3 Bb4 7.Nxc6 bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.c4 Nf6 6.Nc3 Bb4 7.Nxc6 bxc6 *++[ECO "B44g"]+[Variation "Sicilian: Taimanov, 5.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Be3 *++[ECO "B44h"]+[Variation "Sicilian: Taimanov, 5.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Be3 Nf6 *++[ECO "B44i"]+[Variation "Sicilian: Taimanov, 5.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nxc6 *++[ECO "B44j"]+[Variation "Sicilian: Taimanov, 5.Nxc6 bxc6 6.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nxc6 bxc6 6.Bd3 *++[ECO "B44k"]+[Variation "Sicilian, Taimanov, Szen Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 *++[ECO "B44k"]+[Variation "Sicilian, Taimanov, Szen, 5...d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 *++[ECO "B44l"]+[Variation "Sicilian, Taimanov, Szen, 6.Bf4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.Bf4 *++[ECO "B44m"]+[Variation "Sicilian, Taimanov, Szen, 6.Bf4 e5 7.Be3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.Bf4 e5 7.Be3 a6 *++[ECO "B44n"]+[Variation "Sicilian, Taimanov, Szen, 6.Bf4 e5 7.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.Bf4 e5 7.Be3 Nf6 *++[ECO "B44o"]+[Variation "Sicilian, Taimanov, Szen, 6.c4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 *++[ECO "B44o"]+[Variation "Sicilian, Taimanov, Szen, 6.c4 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 a6 *++[ECO "B44o"]+[Variation "Sicilian, Taimanov, Szen, 6.c4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 *++[ECO "B44p"]+[Variation "Sicilian, Taimanov, Szen, 7.N5c3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N5c3 *++[ECO "B44q"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 *++[ECO "B44q"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 *++[ECO "B44r"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 *++[ECO "B44r"]+[Variation "Sicilian: Taimanov, Szen, Kasparov Gambit"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 d5 *++[ECO "B44s"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3 b6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 b6 *++[ECO "B44t"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 *++[ECO "B44u"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3 Be7 9.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 *++[ECO "B44u"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3 Be7 9.Be2 b6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 b6 *++[ECO "B44v"]+[Variation "Sicilian, Taimanov, Szen, 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O *++[ECO "B44w"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 *++[ECO "B44x"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog, 11.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 11.Be3 *++[ECO "B44x"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog, 11.Be3 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 11.Be3 Bd7 *++[ECO "B44x"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog, 11.Be3 Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 11.Be3 Ne5 *++[ECO "B44y"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog, 11.Be3 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 11.Be3 Bb7 *++[ECO "B44z"]+[Variation "Sicilian: Taimanov, Szen, Hedgehog, 11.Be3 Bb7 12.Qb3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 11.Be3 Bb7 12.Qb3 *++[ECO "B45a"]+[Variation "Sicilian: Taimanov, 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 *++[ECO "B45b"]+[Variation "Sicilian: Taimanov, 5.Nc3 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Bb4 *++[ECO "B45c"]+[Variation "Sicilian: Taimanov, 5.Nc3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 d6 *++[ECO "B45c"]+[Variation "Sicilian: Taimanov, 5.Nc3 d6 6.g4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 d6 6.g4 *++[ECO "B45d"]+[Variation "Sicilian: Taimanov, Four Knights"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 *++[ECO "B45e"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Bg5 *++[ECO "B45f"]+[Variation "Sicilian: Taimanov, Four Knights, 6.a3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.a3 *++[ECO "B45g"]+[Variation "Sicilian: Taimanov, Four Knights, 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.g3 *++[ECO "B45h"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Be2 *++[ECO "B45i"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Be3 *++[ECO "B45i"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Be3 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Be3 Bb4 *++[ECO "B45j"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Be3 Bb4 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Be3 Bb4 7.Bd3 *++[ECO "B45k"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Nxc6 *++[ECO "B45l"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Nxc6 bxc6 7.e5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Nxc6 bxc6 7.e5 *++[ECO "B45l"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Nxc6 bxc6 7.e5 Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Nxc6 bxc6 7.e5 Nd5 *++[ECO "B45m"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Nxc6 bxc6 7.e5 Nd5 8.Ne4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Nxc6 bxc6 7.e5 Nd5 8.Ne4 *++[ECO "B45n"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Nxc6 bxc6 7.e5 Nd5 8.Ne4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Nxc6 bxc6 7.e5 Nd5 8.Ne4 Qc7 *++[ECO "B45o"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 *++[ECO "B45o"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 d6 *++[ECO "B45o"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 d6 7.Bf4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 d6 7.Bf4 *++[ECO "B45p"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 *++[ECO "B45q"]+[Variation "Sicilian: Taimanov, Four Knights, American Attack"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.Nd6+ *++[ECO "B45r"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 *++[ECO "B45s"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5 *++[ECO "B45t"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3, 9.ed5 ed5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5 9.exd5 exd5 *++[ECO "B45u"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3, 9.ed5 ed5 10.Bd3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5 9.exd5 exd5 10.Bd3 O-O *++[ECO "B45v"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3, 10.Bd3 O-O 11.O-O d4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5 9.exd5 exd5 10.Bd3 O-O 11.O-O d4 *++[ECO "B45w"]+[Variation "Sicilian: Taimanov, Four Knights, 6.Ndb5 Bb4 7.a3, 10.Bd3 O-O 11.O-O d4 12.Ne2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.a3 Bxc3+ 8.Nxc3 d5 9.exd5 exd5 10.Bd3 O-O 11.O-O d4 12.Ne2 *++[ECO "B46a"]+[Variation "Sicilian: Taimanov, 5...a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 *++[ECO "B46b"]+[Variation "Sicilian: Taimanov, 5...a6 6.f4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.f4 *++[ECO "B46c"]+[Variation "Sicilian: Taimanov, 5...a6 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Nxc6 *++[ECO "B46d"]+[Variation "Sicilian: Taimanov, 5...a6 6.Nxc6 bxc6 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Nxc6 bxc6 7.Bd3 *++[ECO "B46e"]+[Variation "Sicilian: Taimanov, 5...a6 6.Nxc6 bxc6 7.Bd3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Nxc6 bxc6 7.Bd3 d5 *++[ECO "B46f"]+[Variation "Sicilian: Taimanov, 5...a6 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.g3 *++[ECO "B46g"]+[Variation "Sicilian: Taimanov, 5...a6 6.g3 Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.g3 Nge7 *++[ECO "B46h"]+[Variation "Sicilian: Taimanov, 5...a6 6.g3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.g3 d6 *++[ECO "B46i"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be3 *++[ECO "B46j"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be3 d6 *++[ECO "B46k"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be3 Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be3 Nge7 *++[ECO "B46l"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be3 Nf6 *++[ECO "B46m"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 *++[ECO "B46n"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 Nf6 *++[ECO "B46o"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2 Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 Nge7 *++[ECO "B46p"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2 Nge7 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 Nge7 7.O-O *++[ECO "B46q"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2 Nge7 7.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 Nge7 7.Be3 *++[ECO "B46r"]+[Variation "Sicilian: Taimanov, 5...a6 6.Be2 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 6.Be2 d6 *++[ECO "B47a"]+[Variation "Sicilian: Taimanov, Bastrikov Variation"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 *++[ECO "B47b"]+[Variation "Sicilian: Taimanov, 6.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Nxc6 *++[ECO "B47c"]+[Variation "Sicilian: Taimanov, 6.Ndb5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Ndb5 *++[ECO "B47d"]+[Variation "Sicilian: Taimanov, 6.f4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.f4 *++[ECO "B47e"]+[Variation "Sicilian: Taimanov, 6.f4 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.f4 a6 *++[ECO "B47f"]+[Variation "Sicilian: Taimanov, 6.f4 a6 7.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.f4 a6 7.Nxc6 *++[ECO "B47g"]+[Variation "Sicilian: Taimanov, 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 *++[ECO "B47h"]+[Variation "Sicilian: Taimanov, 6.g3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 *++[ECO "B47h"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 *++[ECO "B47i"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 d6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 d6 *++[ECO "B47i"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 d6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 d6 8.O-O *++[ECO "B47j"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 d6 8.O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 d6 8.O-O Bd7 *++[ECO "B47k"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 d6 8.O-O Bd7 9.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 d6 8.O-O Bd7 9.Re1 *++[ECO "B47l"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 Nf6 *++[ECO "B47m"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 Nf6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 Nf6 8.O-O *++[ECO "B47n"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 Nf6 8.O-O Bc5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 Nf6 8.O-O Bc5 *++[ECO "B47o"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 Nf6 8.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 Nf6 8.O-O Be7 *++[ECO "B47p"]+[Variation "Sicilian: Taimanov, 6.g3 a6 7.Bg2 Nf6 8.O-O Be7 9.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.g3 a6 7.Bg2 Nf6 8.O-O Be7 9.Re1 *++[ECO "B47q"]+[Variation "Sicilian: Taimanov, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 *++[ECO "B47q"]+[Variation "Sicilian: Taimanov, 6.Be2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 Nf6 *++[ECO "B47r"]+[Variation "Sicilian: Taimanov, 6.Be2 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 *++[ECO "B47s"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.f4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.f4 *++[ECO "B47t"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O *++[ECO "B47u"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O b5 *++[ECO "B47v"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 *++[ECO "B47v"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.a3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.a3 *++[ECO "B47w"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 *++[ECO "B47x"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Be7 *++[ECO "B47y"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4 *++[ECO "B47y"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4, 10.Qd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4 9.Qxd4 Bc5 10.Qd3 *++[ECO "B47y"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4, 10.Qd3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4 9.Qxd4 Bc5 10.Qd3 b5 *++[ECO "B47z"]+[Variation "Sicilian: Taimanov, 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4, 10.Qd3 b5 11.f4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4 9.Qxd4 Bc5 10.Qd3 b5 11.f4 *++[ECO "B48a"]+[Variation "Sicilian: Taimanov, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 *++[ECO "B48b"]+[Variation "Sicilian: Taimanov, 6.Be3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 Nf6 *++[ECO "B48c"]+[Variation "Sicilian: Taimanov, 6.Be3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 *++[ECO "B48d"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.a3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.a3 *++[ECO "B48e"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.f4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.f4 *++[ECO "B48f"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.f4 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.f4 b5 *++[ECO "B48g"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Qd2 *++[ECO "B48h"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Qd2 Nf6 8.f3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Qd2 Nf6 8.f3 *++[ECO "B48i"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 *++[ECO "B48j"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 b5 *++[ECO "B48k"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 b5 8.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 b5 8.Nxc6 *++[ECO "B48l"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 b5 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 b5 8.O-O *++[ECO "B48m"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 *++[ECO "B48n"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O *++[ECO "B48o"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Nxd4 *++[ECO "B48p"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O h5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O h5 *++[ECO "B48q"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O b5 *++[ECO "B48r"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Bd6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Bd6 *++[ECO "B48s"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 *++[ECO "B48t"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3 *++[ECO "B48u"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3 Bc5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3 Bc5 *++[ECO "B48v"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3 Bc5 10.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Bd3 Nf6 8.O-O Ne5 9.h3 Bc5 10.Kh1 *++[ECO "B49a"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 *++[ECO "B49a"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nge7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nge7 *++[ECO "B49b"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 b5 *++[ECO "B49b"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 b5 8.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 b5 8.Nxc6 *++[ECO "B49c"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 *++[ECO "B49d"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.a3"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.a3 *++[ECO "B49d"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.a3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.a3 b5 *++[ECO "B49e"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.a3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.a3 Be7 *++[ECO "B49e"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.a3 Be7 9.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.a3 Be7 9.O-O *++[ECO "B49f"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O *++[ECO "B49f"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O b5"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O b5 *++[ECO "B49g"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Be7 *++[ECO "B49h"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 *++[ECO "B49i"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Nxc6 *++[ECO "B49j"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 *++[ECO "B49k"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 O-O *++[ECO "B49l"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 *++[ECO "B49m"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6 *++[ECO "B49m"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6 bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6 bxc6 *++[ECO "B49n"]+[Variation "Sicilian: Taimanov, 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6 bxc6 11.Nb6"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 Nf6 8.O-O Bb4 9.Na4 Be7 10.Nxc6 bxc6 11.Nb6 *++[ECO "B50a"]+[Variation "Sicilian: 2.Nf3 d6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 *++[ECO "B50b"]+[Variation "Sicilian: Wing Gambit deferred"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.b4 *++[ECO "B50c"]+[Variation "Sicilian: 2.Nf3 d6 3.b3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.b3 *++[ECO "B50d"]+[Variation "Sicilian: 2.Nf3 d6 3.b3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.b3 e6 *++[ECO "B50e"]+[Variation "Sicilian: 2.Nf3 d6 3.d3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d3 *++[ECO "B50f"]+[Variation "Sicilian: 2.Nf3 d6 3.g3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.g3 *++[ECO "B50g"]+[Variation "Sicilian: 2.Nf3 d6 3.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bc4 *++[ECO "B50h"]+[Variation "Sicilian: 2.Nf3 d6 3.Bc4 Nf6 4.d3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bc4 Nf6 4.d3 *++[ECO "B50i"]+[Variation "Sicilian: 2.Nf3 d6 3.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Nc3 *++[ECO "B50j"]+[Variation "Sicilian: 2.Nf3 d6 3.Nc3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Nc3 e6 *++[ECO "B50k"]+[Variation "Sicilian: 2.Nf3 d6 3.Nc3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Nc3 Nf6 *++[ECO "B50l"]+[Variation "Sicilian: 2.Nf3 d6 3.c3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 *++[ECO "B50m"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 *++[ECO "B50n"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.h3 *++[ECO "B50o"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.h3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.h3 Nc6 *++[ECO "B50p"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Bc4 *++[ECO "B50q"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Bd3 *++[ECO "B50r"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Bd3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Bd3 Nc6 *++[ECO "B50s"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Be2 *++[ECO "B50t"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Be2 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Be2 Nc6 *++[ECO "B50u"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Be2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Be2 Nbd7 *++[ECO "B50v"]+[Variation "Sicilian: 2.Nf3 d6 3.c3 Nf6 4.Be2 g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Be2 g6 *++[ECO "B50w"]+[Variation "Sicilian: 2.Nf3 d6 3.c3, Torre Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Be2 g6 5.O-O Bg7 6.Bb5+ *++[ECO "B51a"]+[Variation "Sicilian: Moscow"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ *++[ECO "B51a"]+[Variation "Sicilian: Moscow 3...Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 *++[ECO "B51b"]+[Variation "Sicilian: Moscow 3...Nd7 4.c3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.c3 *++[ECO "B51c"]+[Variation "Sicilian: Moscow 3...Nd7 4.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.O-O *++[ECO "B51d"]+[Variation "Sicilian: Moscow 3...Nd7 4.O-O Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.O-O Nf6 *++[ECO "B51e"]+[Variation "Sicilian: Moscow 3...Nd7 4.O-O Nf6 5.Re1 a6 6.Bf1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.O-O Nf6 5.Re1 a6 6.Bf1 *++[ECO "B51f"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 *++[ECO "B51f"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 cxd4 *++[ECO "B51g"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 Nf6 *++[ECO "B51h"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 Nf6 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 Nf6 5.Nc3 *++[ECO "B51i"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 Nf6 5.Nc3 cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 Nf6 5.Nc3 cxd4 *++[ECO "B51i"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 Nf6 5.Nc3 cxd4 6.Qxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 Nf6 5.Nc3 cxd4 6.Qxd4 *++[ECO "B51j"]+[Variation "Sicilian: Moscow 3...Nd7 4.d4 Nf6 5.Nc3 cxd4 6.Qxd4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nd7 4.d4 Nf6 5.Nc3 cxd4 6.Qxd4 e5 *++[ECO "B51k"]+[Variation "Sicilian: Moscow 3...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 *++[ECO "B51l"]+[Variation "Sicilian: Moscow 3...Nc6 4.Bxc6+"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.Bxc6+ *++[ECO "B51m"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O *++[ECO "B51n"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 *++[ECO "B51o"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 *++[ECO "B51p"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 a6 *++[ECO "B51q"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 Nf6 *++[ECO "B51r"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 *++[ECO "B51s"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Ba4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Ba4 *++[ECO "B51t"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Bf1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Bf1 *++[ECO "B51u"]+[Variation "Sicilian: Moscow 3...Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Bf1 Bg4 8.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Nc6 4.O-O Bd7 5.Re1 Nf6 6.c3 a6 7.Bf1 Bg4 8.h3 *++[ECO "B52a"]+[Variation "Sicilian: Moscow 3...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 *++[ECO "B52b"]+[Variation "Sicilian: Moscow 3...Bd7 4.Bxd7+ Nxd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Nxd7 *++[ECO "B52c"]+[Variation "Sicilian: Moscow 3...Bd7 4.Bxd7+ Nxd7 5.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Nxd7 5.O-O *++[ECO "B52d"]+[Variation "Sicilian: Moscow 3...Bd7 4.Bxd7+ Nxd7 5.O-O Ngf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Nxd7 5.O-O Ngf6 *++[ECO "B52e"]+[Variation "Sicilian: Moscow 3...Bd7 4.Bxd7+ Nxd7 5.O-O Ngf6 6.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Nxd7 5.O-O Ngf6 6.Qe2 *++[ECO "B52f"]+[Variation "Sicilian: Moscow 3...Bd7 4.Bxd7+ Qxd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 *++[ECO "B52g"]+[Variation "Sicilian: 3.Bb5+, Sokolsky Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 *++[ECO "B52h"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 *++[ECO "B52i"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6 6.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 6.O-O *++[ECO "B52j"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6 6.O-O Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 6.O-O Nf6 *++[ECO "B52k"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6 6.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 6.Nc3 *++[ECO "B52l"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6 6.Nc3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 6.Nc3 Nf6 *++[ECO "B52m"]+[Variation "Sicilian: 3.Bb5+, Sokolsky, 5...Nc6 6.Nc3 Nf6 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 Nc6 6.Nc3 Nf6 7.O-O *++[ECO "B52n"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O *++[ECO "B52o"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 *++[ECO "B52p"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.Re1 *++[ECO "B52q"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.Re1 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.Re1 Nf6 *++[ECO "B52r"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3 *++[ECO "B52s"]+[Variation "Sicilian: 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3 Nf6 *++[ECO "B52t"]+[Variation "Sicilian: 3.Bb5+, Bronstein Gambit"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3 Nf6 7.d4 *++[ECO "B53a"]+[Variation "Sicilian: 2...d6 3.d4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 *++[ECO "B53b"]+[Variation "Sicilian: 2...d6 3.d4 Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 Nf6 *++[ECO "B53c"]+[Variation "Sicilian: 2...d6 3.d4 cxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 *++[ECO "B53d"]+[Variation "Sicilian, Chekhover Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 *++[ECO "B53e"]+[Variation "Sicilian, Chekhover, 4...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Bd7 *++[ECO "B53f"]+[Variation "Sicilian, Chekhover, 4...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 a6 *++[ECO "B53g"]+[Variation "Sicilian, Chekhover, 4...a6 5.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 a6 5.Be3 *++[ECO "B53h"]+[Variation "Sicilian, Chekhover, 4...a6 5.c4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 a6 5.c4 *++[ECO "B53i"]+[Variation "Sicilian, Chekhover, 4...a6 5.c4 Nc6 6.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 a6 5.c4 Nc6 6.Qd2 *++[ECO "B53j"]+[Variation "Sicilian, Chekhover, 4...a6 5.c4 Nc6 6.Qd2 g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 a6 5.c4 Nc6 6.Qd2 g6 *++[ECO "B53k"]+[Variation "Sicilian, Chekhover, 4...Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nf6 *++[ECO "B53k"]+[Variation "Sicilian, Chekhover, 4...Nf6 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nf6 5.Nc3 *++[ECO "B53l"]+[Variation "Sicilian, Chekhover, 4...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 *++[ECO "B53m"]+[Variation "Sicilian: Chekhover, Zaitsev Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Qd7 *++[ECO "B53n"]+[Variation "Sicilian, Chekhover, 4...Nc6 5.Bb5 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 *++[ECO "B53o"]+[Variation "Sicilian, Chekhover, 4...Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 *++[ECO "B53p"]+[Variation "Sicilian, Chekhover, 7.c4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.c4 *++[ECO "B53q"]+[Variation "Sicilian, Chekhover, 7.c4 Nf6 8.Nc3 g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.c4 Nf6 8.Nc3 g6 *++[ECO "B53r"]+[Variation "Sicilian, Chekhover, 7.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 *++[ECO "B53s"]+[Variation "Sicilian, Chekhover, 7.Nc3 Nf6 8.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 *++[ECO "B53t"]+[Variation "Sicilian, Chekhover, 7.Nc3 Nf6 8.Bg5 e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 e6 *++[ECO "B53u"]+[Variation "Sicilian, Chekhover, Main Line, 10.Qd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 e6 9.O-O-O Be7 10.Qd3 *++[ECO "B53v"]+[Variation "Sicilian, Chekhover, Main Line, 10.Rhe1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 e6 9.O-O-O Be7 10.Rhe1 *++[ECO "B53w"]+[Variation "Sicilian, Chekhover, Main Line, 10.Rhe1 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 e6 9.O-O-O Be7 10.Rhe1 O-O *++[ECO "B53x"]+[Variation "Sicilian, Chekhover, Main Line, 11.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Bd7 6.Bxc6 Bxc6 7.Nc3 Nf6 8.Bg5 e6 9.O-O-O Be7 10.Rhe1 O-O 11.Qd2 *++[ECO "B54a"]+[Variation "Sicilian: Open, 2...d6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 *++[ECO "B54b"]+[Variation "Sicilian: Open, 2...d6, 4...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 e5 *++[ECO "B54c"]+[Variation "Sicilian: Open, 2...d6, 4...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 a6 *++[ECO "B54d"]+[Variation "Sicilian: Open, 2...d6, 4...Nf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B54e"]+[Variation "Sicilian: Open, 2...d6, 4...Nf6 5.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Bd3 *++[ECO "B54f"]+[Variation "Sicilian: Prins (Moscow) Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 *++[ECO "B54g"]+[Variation "Sicilian: Prins (Moscow), 5...e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e6 *++[ECO "B54h"]+[Variation "Sicilian: Prins (Moscow), 5...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 a6 *++[ECO "B54i"]+[Variation "Sicilian: Prins (Moscow), 5...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 Nc6 *++[ECO "B54j"]+[Variation "Sicilian: Prins (Moscow), 5...Nc6 6.c4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 Nc6 6.c4 Nxd4 *++[ECO "B54k"]+[Variation "Sicilian: Prins (Moscow), 5...Nc6 6.c4 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 Nc6 6.c4 Qb6 *++[ECO "B54l"]+[Variation "Sicilian: Prins (Moscow), 5...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 *++[ECO "B54m"]+[Variation "Sicilian: Prins (Moscow), 5...e5 6.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Nb3 *++[ECO "B54n"]+[Variation "Sicilian: Prins (Moscow), 5...e5 6.Nb3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Nb3 Be6 *++[ECO "B54o"]+[Variation "Sicilian: Prins (Moscow), 5...e5 6.Nb3 d5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Nb3 d5 *++[ECO "B55"]+[Variation "Sicilian: Prins, Venice Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ *++[ECO "B55"]+[Variation "Sicilian: Prins, Venice Attack, 6...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ Bd7 *++[ECO "B55"]+[Variation "Sicilian: Prins, Venice Attack, 6...Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ Nbd7 *++[ECO "B55"]+[Variation "Sicilian: Prins, Venice Attack, 6...Nbd7 7.Nf5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ Nbd7 7.Nf5 *++[ECO "B55"]+[Variation "Sicilian: Prins, Venice Attack, 6...Nbd7 7.Nf5 d5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ Nbd7 7.Nf5 d5 *++[ECO "B56a"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 *++[ECO "B56b"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 *++[ECO "B56c"]+[Variation "Sicilian: Venice Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Bb5+ *++[ECO "B56d"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nbd7 *++[ECO "B56e"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nbd7 6.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nbd7 6.Bc4 *++[ECO "B56f"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bd7 *++[ECO "B56g"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Bd7 6.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bd7 6.Bg5 *++[ECO "B56h"]+[Variation "Sicilian: Open, 2...d6 5.Nc3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 *++[ECO "B56i"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.h3 *++[ECO "B56j"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.g3 *++[ECO "B56k"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.f4 *++[ECO "B56l"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.f3 *++[ECO "B56m"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.f3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.f3 e5 *++[ECO "B56m"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.f3 e5 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.f3 e5 7.Nb3 *++[ECO "B56n"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.f3 e5 7.Nb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.f3 e5 7.Nb3 Be7 *++[ECO "B56o"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be3 *++[ECO "B56p"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.Be3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be3 e5 *++[ECO "B56q"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.Be3 Ng4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be3 Ng4 *++[ECO "B56r"]+[Variation "Sicilian: Open, 2...d6, 5.Nc3 Nc6 6.Be3 Ng4 7.Bb5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be3 Ng4 7.Bb5 *++[ECO "B57a"]+[Variation "Sicilian: Sozin"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 *++[ECO "B57a"]+[Variation "Sicilian: Sozin, Magnus Smith Trap"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 g6 7.Nxc6 bxc6 8.e5 *++[ECO "B57b"]+[Variation "Sicilian: Sozin, 6...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Bd7 *++[ECO "B57c"]+[Variation "Sicilian: Sozin, 6...Bd7 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Bd7 7.O-O *++[ECO "B57d"]+[Variation "Sicilian: Sozin, Benko Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 *++[ECO "B57e"]+[Variation "Sicilian: Sozin, Benko, 7.Nde2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nde2 *++[ECO "B57f"]+[Variation "Sicilian: Sozin, Benko, 7.Ndb5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Ndb5 *++[ECO "B57g"]+[Variation "Sicilian: Sozin, Benko, 7.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nxc6 *++[ECO "B57h"]+[Variation "Sicilian: Sozin, Benko, 7.Nxc6 bxc6 8.O-O g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nxc6 bxc6 8.O-O g6 *++[ECO "B57i"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 *++[ECO "B57j"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 *++[ECO "B57k"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6 8.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 8.Be3 *++[ECO "B57l"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6 8.Bf4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 8.Bf4 *++[ECO "B57m"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 8.O-O *++[ECO "B57n"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6 8.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 8.O-O Be7 *++[ECO "B57o"]+[Variation "Sicilian: Sozin, Benko, 7.Nb3 e6 8.O-O Be7 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 7.Nb3 e6 8.O-O Be7 9.Be3 *++[ECO "B58a"]+[Variation "Sicilian: Boleslavsky Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 *++[ECO "B58b"]+[Variation "Sicilian: Boleslavsky, 6...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 Bd7 *++[ECO "B58c"]+[Variation "Sicilian: Boleslavsky, 6...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 a6 *++[ECO "B58d"]+[Variation "Sicilian: Boleslavsky, 6...Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 Nxd4 *++[ECO "B58e"]+[Variation "Sicilian: Boleslavsky, 6...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 *++[ECO "B58f"]+[Variation "Sicilian: Boleslavsky, 7.Ndb5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Ndb5 *++[ECO "B58g"]+[Variation "Sicilian: Boleslavsky, Louma Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nxc6 *++[ECO "B58g"]+[Variation "Sicilian: Boleslavsky, Louma Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nxc6 bxc6 *++[ECO "B58h"]+[Variation "Sicilian: Boleslavsky, 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 *++[ECO "B58i"]+[Variation "Sicilian: Boleslavsky, 7.Nf3 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 *++[ECO "B58j"]+[Variation "Sicilian: Boleslavsky, 7.Nf3 h6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O *++[ECO "B58k"]+[Variation "Sicilian: Boleslavsky, 7.Nf3 h6 8.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 *++[ECO "B58l"]+[Variation "Sicilian: Boleslavsky, 7.Nf3 h6 8.O-O Be7 9.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.h3 *++[ECO "B58m"]+[Variation "Sicilian: Boleslavsky, 7.Nf3 h6 8.O-O Be7 9.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 *++[ECO "B58n"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 *++[ECO "B58o"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 a6 *++[ECO "B58p"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 *++[ECO "B58p"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 *++[ECO "B58q"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 Qa5 *++[ECO "B58r"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 *++[ECO "B58s"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.a4 *++[ECO "B58t"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.b3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.b3 *++[ECO "B58u"]+[Variation "Sicilian: Boleslavsky, 7.Nf3, 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.b3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nf3 h6 8.O-O Be7 9.Re1 O-O 10.h3 Be6 11.Bf1 Nb8 12.b3 a6 *++[ECO "B59a"]+[Variation "Sicilian: Boleslavsky, 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 *++[ECO "B59b"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be6 *++[ECO "B59c"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 *++[ECO "B59d"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.Bg5 *++[ECO "B59e"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.Be3 *++[ECO "B59f"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O *++[ECO "B59g"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O *++[ECO "B59h"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Bg5 *++[ECO "B59i"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 *++[ECO "B59j"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.f4 *++[ECO "B59k"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 *++[ECO "B59l"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 *++[ECO "B59m"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Bf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Bf3 *++[ECO "B59n"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Be3 a5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 a5 *++[ECO "B59o"]+[Variation "Sicilian: Boleslavsky, 7.Nb3 Be7 8.O-O O-O 9.Be3 a5 10.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 a5 10.a4 *++[ECO "B60a"]+[Variation "Sicilian: Richter-Rauzer"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 *++[ECO "B60b"]+[Variation "Sicilian: Richter-Rauzer, Bondarevsky Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 g6 *++[ECO "B60c"]+[Variation "Sicilian: Richter-Rauzer, 6...Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Qa5 *++[ECO "B60d"]+[Variation "Sicilian: Richter-Rauzer, 6...Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Qb6 *++[ECO "B60e"]+[Variation "Sicilian: Richter-Rauzer, 6...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 a6 *++[ECO "B60f"]+[Variation "Sicilian: Richter-Rauzer, Larsen Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 *++[ECO "B60g"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Nb3 *++[ECO "B60h"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Bxf6 *++[ECO "B60i"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Be2 *++[ECO "B60j"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Be2 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Be2 a6 *++[ECO "B60k"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Be2 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Be2 Qa5 *++[ECO "B61a"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 *++[ECO "B61b"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 a6 *++[ECO "B61c"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Nxd4 *++[ECO "B61d"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2 Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 *++[ECO "B61e"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2 Rc8 8.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 8.f4 *++[ECO "B61f"]+[Variation "Sicilian: Richter-Rauzer, Larsen, 7.Qd2 Rc8 8.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 8.O-O-O *++[ECO "B61g"]+[Variation "Sicilian: Richter-Rauzer, Larsen, Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 8.O-O-O Nxd4 9.Qxd4 Qa5 *++[ECO "B61h"]+[Variation "Sicilian: Richter-Rauzer, Larsen, Main Line, 10.Bd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 8.O-O-O Nxd4 9.Qxd4 Qa5 10.Bd2 *++[ECO "B61i"]+[Variation "Sicilian: Richter-Rauzer, Larsen, Main Line, 10.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Rc8 8.O-O-O Nxd4 9.Qxd4 Qa5 10.f4 *++[ECO "B62a"]+[Variation "Sicilian: Richter-Rauzer, 6...e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 *++[ECO "B62b"]+[Variation "Sicilian: Richter-Rauzer, 6...e6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Be2 *++[ECO "B62c"]+[Variation "Sicilian: Richter-Rauzer, 6...e6 7.Be2 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Be2 Be7 *++[ECO "B62d"]+[Variation "Sicilian: Richter-Rauzer, Podebrady Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nb3 *++[ECO "B62e"]+[Variation "Sicilian: Richter-Rauzer, Richter Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nxc6 *++[ECO "B62f"]+[Variation "Sicilian: Richter-Rauzer, Keres Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd3 *++[ECO "B62g"]+[Variation "Sicilian: Richter-Rauzer, Margate (Alekhine) Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Bb5 *++[ECO "B62h"]+[Variation "Sicilian: Richter-Rauzer, Margate, 7...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Bb5 Bd7 *++[ECO "B62i"]+[Variation "Sicilian: Richter-Rauzer, Margate, 7...Bd7 8.Bxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Bb5 Bd7 8.Bxc6 *++[ECO "B63a"]+[Variation "Sicilian: Richter-Rauzer, Rauzer Attack (7.Qd2)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 *++[ECO "B63b"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Nxd4 *++[ECO "B63c"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Qb6 *++[ECO "B63d"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Qb6 8.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Qb6 8.Nb3 *++[ECO "B63e"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Qb6 8.Nb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Qb6 8.Nb3 a6 *++[ECO "B63f"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Qb6 8.Nb3 a6 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Qb6 8.Nb3 a6 9.O-O-O *++[ECO "B63g"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Qb6 8.Nb3 a6 9.O-O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Qb6 8.Nb3 a6 9.O-O-O Be7 *++[ECO "B63h"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 h6 *++[ECO "B63i"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 h6 8.Bxf6 gxf6 9.O-O-O a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 h6 8.Bxf6 gxf6 9.O-O-O a6 *++[ECO "B63j"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 h6 8.Bxf6 gxf6 9.O-O-O a6 10.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 h6 8.Bxf6 gxf6 9.O-O-O a6 10.f4 *++[ECO "B63k"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 *++[ECO "B63l"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7 8.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O *++[ECO "B63m"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7 8.O-O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O Nxd4 *++[ECO "B63m"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7 8.O-O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O Nxd4 9.Qxd4 *++[ECO "B63n"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7 8.O-O-O Nxd4 9.Qxd4 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O Nxd4 9.Qxd4 O-O *++[ECO "B63o"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7 8.O-O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O *++[ECO "B63p"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f3 *++[ECO "B63q"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 *++[ECO "B63r"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.Nb3 a5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 a5 *++[ECO "B63s"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.Nb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 a6 *++[ECO "B63t"]+[Variation "Sicilian: Richter-Rauzer, Podebrad Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 Qb6 *++[ECO "B63u"]+[Variation "Sicilian: Richter-Rauzer, Podebrad, 10.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 Qb6 10.f3 *++[ECO "B63v"]+[Variation "Sicilian: Richter-Rauzer, Podebrad, 10.f3 Rd8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 Qb6 10.f3 Rd8 *++[ECO "B63w"]+[Variation "Sicilian: Richter-Rauzer, Podebrad, 10.f3 Rd8 11.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 Qb6 10.f3 Rd8 11.Kb1 *++[ECO "B64a"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 *++[ECO "B64b"]+[Variation "Sicilian: Richter-Rauzer, Geller Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 e5 *++[ECO "B64c"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f4 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 h6 *++[ECO "B64d"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f4 h6 10.Bh4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 h6 10.Bh4 *++[ECO "B64e"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f4 h6 10.Bh4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 h6 10.Bh4 Bd7 *++[ECO "B64f"]+[Variation "Sicilian: Richter-Rauzer, 7.Qd2 Be7, 9.f4 h6 10.Bh4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 h6 10.Bh4 e5 *++[ECO "B65a"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 *++[ECO "B65a"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 *++[ECO "B65b"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 h6 *++[ECO "B65c"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 Qa5 *++[ECO "B65d"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 Qa5 11.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 Qa5 11.Kb1 *++[ECO "B65e"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4 *++[ECO "B65f"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4 Bd7 *++[ECO "B65g"]+[Variation "Sicilian: Richter-Rauzer, 7...Be7, 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4 Bd7 12.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 Qa5 11.Bc4 Bd7 12.e5 *++[ECO "B66a"]+[Variation "Sicilian: Richter-Rauzer, 7...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 *++[ECO "B66b"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.Be2 *++[ECO "B66c"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O *++[ECO "B66d"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Be7 *++[ECO "B66e"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Nxd4 *++[ECO "B66e"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O Nxd4 9.Qxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Nxd4 9.Qxd4 *++[ECO "B66e"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O Nxd4 9.Qxd4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Nxd4 9.Qxd4 Be7 *++[ECO "B66f"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 *++[ECO "B66g"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Bf4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Bf4 *++[ECO "B66h"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Bf4, 11.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Bf4 Bd7 10.Nxc6 Bxc6 11.f3 *++[ECO "B66i"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 *++[ECO "B66j"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Qc7 *++[ECO "B66k"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Bd7 *++[ECO "B66l"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Bd7 10.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Bd7 10.f3 *++[ECO "B66m"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 *++[ECO "B66m"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7 10.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 10.f3 *++[ECO "B66m"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7 10.f3 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 10.f3 Nxd4 *++[ECO "B66n"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7 10.f3 Nxd4 11.Bxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 10.f3 Nxd4 11.Bxd4 *++[ECO "B66o"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7 10.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 10.f4 *++[ECO "B66p"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O h6 9.Be3 Be7 10.f4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Be7 10.f4 Nxd4 *++[ECO "B67a"]+[Variation "Sicilian: Richter-Rauzer, 7...a6 8.O-O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 *++[ECO "B67b"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.Be2 *++[ECO "B67c"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f3 *++[ECO "B67d"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f3 Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f3 Rc8 *++[ECO "B67e"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f3 Be7 *++[ECO "B67f"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f3 Be7 10.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f3 Be7 10.h4 *++[ECO "B67g"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 *++[ECO "B67h"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 h6 *++[ECO "B67i"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 h6 10.Bh4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 h6 10.Bh4 *++[ECO "B67j"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 h6 10.Bh4 g5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 h6 10.Bh4 g5 *++[ECO "B67k"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 *++[ECO "B67l"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Nxc6 *++[ECO "B67m"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 *++[ECO "B67m"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 *++[ECO "B67n"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.f5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.f5 *++[ECO "B67o"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.Nxc6 *++[ECO "B67p"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.Nxc6 Bxc6 12.Qe1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.Nxc6 Bxc6 12.Qe1 *++[ECO "B67q"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.Kb1 *++[ECO "B67r"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.Kb1 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.Kb1 Qb6 *++[ECO "B67s"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 b5 10.Bxf6 gxf6 11.Kb1 Qb6 12.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 b5 10.Bxf6 gxf6 11.Kb1 Qb6 12.Nxc6 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Be2 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Be2 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Be2 Qc7 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 *++[ECO "B68"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5 11.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.e5 *++[ECO "B69"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5 11.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bxf6 *++[ECO "B69"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6 *++[ECO "B69"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6 12.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6 12.Kb1 *++[ECO "B69"]+[Variation "Sicilian: Richter-Rauzer, 7...a6, 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6 12.f5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bxf6 gxf6 12.f5 *++[ECO "B70a"]+[Variation "Sicilian: Dragon"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 *++[ECO "B70a"]+[Variation "Sicilian: Dragon, 6.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f3 *++[ECO "B70b"]+[Variation "Sicilian: Dragon, 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.g3 *++[ECO "B70c"]+[Variation "Sicilian: Dragon, 6.g3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.g3 Nc6 *++[ECO "B70c"]+[Variation "Sicilian: Dragon, 6.g3 Nc6 7.Bg2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.g3 Nc6 7.Bg2 *++[ECO "B70d"]+[Variation "Sicilian: Dragon, 6.g3 Nc6 7.Nde2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.g3 Nc6 7.Nde2 *++[ECO "B70e"]+[Variation "Sicilian: Dragon, 6.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bg5 *++[ECO "B70e"]+[Variation "Sicilian: Dragon, 6.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bg5 Bg7 *++[ECO "B70f"]+[Variation "Sicilian: Dragon, 6.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bc4 *++[ECO "B70f"]+[Variation "Sicilian: Dragon, 6.Bc4 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bc4 Bg7 *++[ECO "B70g"]+[Variation "Sicilian: Dragon, 6.Bc4 Bg7 7.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bc4 Bg7 7.h3 *++[ECO "B70h"]+[Variation "Sicilian: Dragon, 6.Bc4 Bg7 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Bc4 Bg7 7.O-O *++[ECO "B70i"]+[Variation "Sicilian: Dragon, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 *++[ECO "B70i"]+[Variation "Sicilian: Dragon, 6.Be2 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Nc6 *++[ECO "B70j"]+[Variation "Sicilian: Dragon, 6.Be2 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 a6 *++[ECO "B70j"]+[Variation "Sicilian: Dragon, 6.Be2 a6 7.a4 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 a6 7.a4 Bg7 *++[ECO "B70k"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 *++[ECO "B70l"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O *++[ECO "B70l"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O Nc6 *++[ECO "B70m"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O Nc6 8.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O Nc6 8.Nb3 *++[ECO "B70n"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O Nc6 8.Nb3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O Nc6 8.Nb3 O-O *++[ECO "B70o"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O *++[ECO "B70p"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Re1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Re1 *++[ECO "B70p"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6 *++[ECO "B70q"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6 9.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6 9.Nb3 *++[ECO "B70r"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6 9.Nb3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Re1 Nc6 9.Nb3 Be6 *++[ECO "B70s"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 *++[ECO "B70s"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 *++[ECO "B70t"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 *++[ECO "B70u"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 a6 *++[ECO "B70v"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 Be6 *++[ECO "B70w"]+[Variation "Sicilian: Dragon, 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 Be6 10.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be2 Bg7 7.O-O O-O 8.Bg5 Nc6 9.Nb3 Be6 10.Kh1 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Bg7 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Bg7 7.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Bg7 7.e5 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nbd7 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nc6 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Nc6 7.Bb5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nc6 7.Bb5 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Nc6 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nc6 7.Nf3 *++[ECO "B71"]+[Variation "Sicilian: Dragon, Levenfish, 6...Nc6 7.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nc6 7.Nxc6 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3 Bg7 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Qd2 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3 Bg7 7.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Bc4 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3 Bg7 7.Bc4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Bc4 Nc6 *++[ECO "B72"]+[Variation "Sicilian: Dragon, 6.Be3 Bg7 7.Bc4 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Bc4 O-O *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 O-O *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 O-O 8.O-O *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical, Amsterdam Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Qd2 *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical, Grigoriev Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Qd2 O-O 9.O-O-O *++[ECO "B72"]+[Variation "Sicilian: Dragon, Classical, Nottingham Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Nb3 *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, 8.O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, 9.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Kh1 *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, Richter Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Qd2 *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.f4 *++[ECO "B73"]+[Variation "Sicilian: Dragon, Classical, Zollner Gambit"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.f4 Qb6 10.e5 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3 b6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 b6 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Alekhine Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 a5 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 a6 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3 Be6 10.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, 9.Nb3 Be6 10.f4 Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Rc8 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Tartakower Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Qc8 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Maroczy Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Stockholm Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Nxa5 Bxe2 13.Qxe2 Qxa5 14.g4 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Spielmann Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Bd3 *++[ECO "B74"]+[Variation "Sicilian: Dragon, Classical, Bernard Defence"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Bd3 Bxd3 13.cxd3 d5 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 a6 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6 8.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 8.Bc4 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 8.Qd2 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6 8.Qd2 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 8.Qd2 Bd7 *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6 8.Qd2 Bd7 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 8.Qd2 Bd7 9.O-O-O *++[ECO "B75"]+[Variation "Sicilian: Dragon, Yugoslav, 7...Nc6 8.Qd2 Bd7 9.O-O-O Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 Nc6 8.Qd2 Bd7 9.O-O-O Rc8 *++[ECO "B76a"]+[Variation "Sicilian: Dragon, Yugoslav, 7.f3 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O *++[ECO "B76b"]+[Variation "Sicilian: Dragon, Yugoslav, 7.f3 O-O 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 *++[ECO "B76c"]+[Variation "Sicilian: Dragon, Yugoslav, 8.Qd2 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 *++[ECO "B76d"]+[Variation "Sicilian: Dragon, Yugoslav, 9.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.g4 *++[ECO "B76e"]+[Variation "Sicilian: Dragon, Yugoslav, 9.g4 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.g4 Be6 *++[ECO "B76f"]+[Variation "Sicilian: Dragon, Yugoslav, 9.g4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.g4 Nxd4 *++[ECO "B76g"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O *++[ECO "B76h"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Bd7 *++[ECO "B76i"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Bd7 10.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Bd7 10.g4 *++[ECO "B76j"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Nxd4 *++[ECO "B76k"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Nxd4 10.Bxd4 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Nxd4 10.Bxd4 Be6 *++[ECO "B76l"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Nxd4: 11.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Nxd4 10.Bxd4 Be6 11.Kb1 *++[ECO "B76m"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Nxd4: 11.Kb1 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Nxd4 10.Bxd4 Be6 11.Kb1 Qc7 *++[ECO "B76n"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O Nxd4: 11.Kb1 Qc7 12.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O Nxd4 10.Bxd4 Be6 11.Kb1 Qc7 12.g4 *++[ECO "B76o"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 *++[ECO "B76p"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5 10.Qe1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.Qe1 *++[ECO "B76q"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5 10.exd5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 *++[ECO "B76q"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6 *++[ECO "B76r"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5: 12.Nxd5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6 bxc6 12.Nxd5 *++[ECO "B76s"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5: 12.Bd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6 bxc6 12.Bd4 *++[ECO "B76t"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5: 12.Bd4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6 bxc6 12.Bd4 e5 *++[ECO "B76u"]+[Variation "Sicilian: Dragon, Yugoslav, 9.O-O-O d5: 12.Bd4 e5 13.Bc5 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O d5 10.exd5 Nxd5 11.Nxc6 bxc6 12.Bd4 e5 13.Bc5 Be6 *++[ECO "B77a"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 *++[ECO "B77b"]+[Variation "Sicilian: Dragon, Yugoslav, Byrne Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 a5 *++[ECO "B77c"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Ne5 *++[ECO "B77d"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Nd7 *++[ECO "B77e"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Nxd4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Nxd4 *++[ECO "B77f"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 *++[ECO "B77g"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Bd7 10.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.Bb3 *++[ECO "B77h"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Bd7 10.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.g4 *++[ECO "B77i"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Bd7 10.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.h4 *++[ECO "B77j"]+[Variation "Sicilian: Dragon, Yugoslav, 9.Bc4 Bd7 10.h4 Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.h4 Rc8 *++[ECO "B78a"]+[Variation "Sicilian: Dragon, Yugoslav, 10.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O *++[ECO "B78b"]+[Variation "Sicilian: Dragon, Yugoslav, 10.O-O-O Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Ne5 *++[ECO "B78c"]+[Variation "Sicilian: Dragon, Yugoslav, 10.O-O-O Rc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 *++[ECO "B78c"]+[Variation "Sicilian: Dragon, Yugoslav, 10.O-O-O Rc8 11.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 *++[ECO "B78d"]+[Variation "Sicilian: Dragon, Yugoslav, Modern Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 *++[ECO "B78e"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.Kb1 *++[ECO "B78e"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.Kb1 Nc4 13.Bxc4 Rxc4 *++[ECO "B78f"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.Kb1: 14.g4 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.Kb1 Nc4 13.Bxc4 Rxc4 14.g4 b5 *++[ECO "B78g"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 *++[ECO "B78g"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 Nc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 Nc4 *++[ECO "B78h"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 Nc4: 14.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 Nc4 13.Bxc4 Rxc4 14.g4 *++[ECO "B78i"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 Nc4: 14.h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 Nc4 13.Bxc4 Rxc4 14.h5 *++[ECO "B78j"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 *++[ECO "B78k"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Kb1 *++[ECO "B78l"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bh6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bh6 *++[ECO "B78m"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bh6 Bxh6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bh6 Bxh6 *++[ECO "B78n"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bg5 *++[ECO "B78o"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bg5 Rc5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bg5 Rc5 *++[ECO "B78p"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bg5 Rc5 14.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bg5 Rc5 14.g4 *++[ECO "B78q"]+[Variation "Sicilian: Dragon, Yugoslav, Main Line, 12.h4 h5 13.Bg5 Rc5 14.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Rc8 11.Bb3 Ne5 12.h4 h5 13.Bg5 Rc5 14.Kb1 *++[ECO "B78r"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 *++[ECO "B78s"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 11.Bb3 Rac8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rac8 *++[ECO "B78t"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 11.Bb3 Rfc8"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 *++[ECO "B79a"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 *++[ECO "B79a"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 h5 *++[ECO "B79b"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 Ne5 *++[ECO "B79c"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 Ne5 13.Kb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 Ne5 13.Kb1 *++[ECO "B79d"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 Ne5 13.Kb1 Nc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 Ne5 13.Kb1 Nc4 *++[ECO "B79e"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 Ne5 13.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 Ne5 13.g4 *++[ECO "B79f"]+[Variation "Sicilian: Dragon, Yugoslav, Old Main Line, 12.h4 Ne5 13.h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 Ne5 13.h5 *++[ECO "B80a"]+[Variation "Sicilian: Scheveningen"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 *++[ECO "B80b"]+[Variation "Sicilian: Scheveningen, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 *++[ECO "B80c"]+[Variation "Sicilian: Scheveningen, 6.Be3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 Nc6 *++[ECO "B80d"]+[Variation "Sicilian: Scheveningen, 6.Be3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 Nc6 7.f3 *++[ECO "B80e"]+[Variation "Sicilian: Scheveningen, 6.Be3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 *++[ECO "B80f"]+[Variation "Sicilian: Scheveningen, 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.Qd2 *++[ECO "B80g"]+[Variation "Sicilian: Scheveningen, English Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 *++[ECO "B80h"]+[Variation "Sicilian: Scheveningen, English Attack, 7...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 Nc6 *++[ECO "B80h"]+[Variation "Sicilian: Scheveningen, English, 7...Nc6 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 Nc6 8.Qd2 *++[ECO "B80i"]+[Variation "Sicilian: Scheveningen, English, 7...Nc6 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 Nc6 8.Qd2 Be7 *++[ECO "B80j"]+[Variation "Sicilian: Scheveningen, English Attack, 7...b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 b5 *++[ECO "B80k"]+[Variation "Sicilian: Scheveningen, English, 7...b5 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 b5 8.Qd2 *++[ECO "B80l"]+[Variation "Sicilian: Scheveningen, English, 7...b5, 8.Qd2 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 b5 8.Qd2 Bb7 *++[ECO "B80l"]+[Variation "Sicilian: Scheveningen, English, 7...b5 8.Qd2 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 b5 8.Qd2 Bb7 9.g4 *++[ECO "B80m"]+[Variation "Sicilian: Scheveningen, English, 7...b5 8.Qd2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.f3 b5 8.Qd2 Nbd7 *++[ECO "B80n"]+[Variation "Sicilian: Scheveningen, Vitolins Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bb5+ *++[ECO "B80n"]+[Variation "Sicilian: Scheveningen, Vitolins, 6...Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bb5+ Bd7 *++[ECO "B80o"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 *++[ECO "B80p"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 a6 *++[ECO "B80q"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 *++[ECO "B80r"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 a6 *++[ECO "B80r"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 a6 8.O-O *++[ECO "B80r"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 a6 8.O-O Bd7 *++[ECO "B80s"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 Qc7 *++[ECO "B80t"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 Qc7 8.O-O a6 *++[ECO "B80u"]+[Variation "Sicilian: Scheveningen, Fianchetto Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 Nc6 7.Bg2 Qc7 8.O-O a6 9.Re1 Be7 *++[ECO "B81a"]+[Variation "Sicilian: Scheveningen, Keres Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 *++[ECO "B81b"]+[Variation "Sicilian: Scheveningen, Keres, 6...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 e5 *++[ECO "B81c"]+[Variation "Sicilian: Scheveningen, Keres, 6...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 a6 *++[ECO "B81d"]+[Variation "Sicilian: Scheveningen, Keres, Perenyi Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 a6 7.Be3 *++[ECO "B81e"]+[Variation "Sicilian: Scheveningen, Keres, Perenyi Attack, 7...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 a6 7.Be3 e5 *++[ECO "B81f"]+[Variation "Sicilian: Scheveningen, Keres, Perenyi Attack, 7...h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 a6 7.Be3 h6 *++[ECO "B81g"]+[Variation "Sicilian: Scheveningen, Keres, Perenyi Attack, 7...h6 8.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 a6 7.Be3 h6 8.f4 *++[ECO "B81h"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 *++[ECO "B81i"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h3 *++[ECO "B81i"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h3 Nc6 8.Bg2 *++[ECO "B81i"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h3 a6 8.Bg2 *++[ECO "B81j"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h4 *++[ECO "B81k"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h4 Be7 *++[ECO "B81l"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h4 Nc6 *++[ECO "B81m"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h4 Nc6 8.Rg1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h4 Nc6 8.Rg1 *++[ECO "B81n"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.h4 Nc6 8.Rg1 h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.h4 Nc6 8.Rg1 h5 *++[ECO "B81o"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.g5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.g5 *++[ECO "B81p"]+[Variation "Sicilian: Scheveningen, Keres, 6...h6 7.Rg1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 h6 7.Rg1 *++[ECO "B81q"]+[Variation "Sicilian: Scheveningen, Keres, 6...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 Nc6 *++[ECO "B81r"]+[Variation "Sicilian: Scheveningen, Keres, 6...Nc6 7.g5 Nd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 Nc6 7.g5 Nd7 *++[ECO "B81s"]+[Variation "Sicilian: Scheveningen, Keres, 6...Nc6 7.g5 Nd7 8.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 Nc6 7.g5 Nd7 8.Be3 *++[ECO "B81t"]+[Variation "Sicilian: Scheveningen, Keres, 6...Nc6 7.g5 Nd7 8.Be3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 Nc6 7.g5 Nd7 8.Be3 Be7 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Qb6 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Be7 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 a6 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 a6 7.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 a6 7.Be3 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 a6 7.Be3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 a6 7.Be3 b5 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Nc6 7.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Nc6 7.Be3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Qc7 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, 6.f4 Nc6 7.Be3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Be7 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, Tal Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Be7 8.Qf3 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, Tal, 8...e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Be7 8.Qf3 e5 *++[ECO "B82"]+[Variation "Sicilian: Scheveningen, Tal, 8...Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Be7 8.Qf3 Qc7 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 e5 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 e5 10.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 e5 10.Nb3 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 e5 10.Nb3 exf4 11.Bxf4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 e5 10.Nb3 exf4 11.Bxf4 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7 10.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Nb3 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7 10.Nb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Nb3 a6 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7 10.Nb3 a6 11.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Nb3 a6 11.a4 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7 10.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Kh1 *++[ECO "B83"]+[Variation "Sicilian: Scheveningen, Modern, 9.f4 Bd7 10.Qe1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Qe1 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.a4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.f4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.Be3 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nbd7 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Nbd7 8.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nbd7 8.a4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Nbd7 8.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nbd7 8.f4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.Kh1 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.Kh1 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.Kh1 Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.a4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.a4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.a4 Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.Bf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.Bf3 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.Be3 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.Be3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.Be3 Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.f4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Qc7 8.f4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.f4 Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 Qc7 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4 Qc7 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 Qc7 9.Be3 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4 Qc7 9.Be3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 Qc7 9.Be3 Nc6 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4 Qc7 9.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 Qc7 9.Kh1 *++[ECO "B84"]+[Variation "Sicilian: Scheveningen, Classical, 7.O-O Be7 8.f4 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Qc7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Qe1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Qe1 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Qe1 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Qe1 Qc7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Qe1 Qc7 11.Qg3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Qe1 Qc7 11.Qg3 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Kh1 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Kh1 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Kh1 Bd7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.Kh1 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.Kh1 Qc7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.a4 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.a4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.a4 Bd7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.a4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.a4 Qc7 *++[ECO "B85"]+[Variation "Sicilian: Scheveningen, Classical, Main Line, 9...Nc6 10.a4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Be7 8.f4 O-O 9.Be3 Nc6 10.a4 Qc7 11.Kh1 *++[ECO "B86"]+[Variation "Sicilian: Sozin-Scheveningen"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 *++[ECO "B86"]+[Variation "Sicilian: Sozin-Scheveningen, 6...Qb6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Qb6 *++[ECO "B86"]+[Variation "Sicilian: Sozin-Najdorf"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 *++[ECO "B86"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 *++[ECO "B86"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 Be7 *++[ECO "B87"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 *++[ECO "B87"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 b5 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 8.O-O *++[ECO "B87"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 b5 8.O-O Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 8.O-O Be7 *++[ECO "B87"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 b5 8.O-O Be7 9.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 8.O-O Be7 9.Qf3 *++[ECO "B87"]+[Variation "Sicilian: Sozin-Najdorf, 7.Bb3 b5 8.O-O Be7 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 8.O-O Be7 9.f4 *++[ECO "B88"]+[Variation "Sicilian: Sozin-Scheveningen"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 *++[ECO "B88"]+[Variation "Sicilian: Sozin-Scheveningen, 7.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.O-O *++[ECO "B88"]+[Variation "Sicilian: Sozin-Scheveningen, 7.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Bb3 *++[ECO "B88"]+[Variation "Sicilian: Sozin-Scheveningen, 7.Bb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Bb3 Be7 8.Be3 *++[ECO "B88"]+[Variation "Sicilian: Sozin, Fischer Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Bb3 Be7 8.Be3 O-O 9.f4 *++[ECO "B89"]+[Variation "Sicilian: Sozin, 7.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 *++[ECO "B89"]+[Variation "Sicilian: Sozin, 7.Be3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 a6 *++[ECO "B89"]+[Variation "Sicilian: Velimirovic vs. 7...a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 a6 8.Qe2 *++[ECO "B89"]+[Variation "Sicilian: Sozin, 7.Be3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 *++[ECO "B89"]+[Variation "Sicilian: Velimirovic"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 8.Qe2 *++[ECO "B89"]+[Variation "Sicilian: Velimirovic, 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 8.Qe2 O-O 9.O-O-O *++[ECO "B89"]+[Variation "Sicilian: Velimirovic, 9.O-O-O Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 8.Qe2 O-O 9.O-O-O Qc7 *++[ECO "B89"]+[Variation "Sicilian: Velimirovic, 9.O-O-O Qc7 10.Bb3 a6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 8.Qe2 O-O 9.O-O-O Qc7 10.Bb3 a6 *++[ECO "B90a"]+[Variation "Sicilian: Najdorf"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 *++[ECO "B90b"]+[Variation "Sicilian: Najdorf, 6.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.a4 *++[ECO "B90c"]+[Variation "Sicilian: Najdorf, 6.a4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.a4 e5 *++[ECO "B90d"]+[Variation "Sicilian: Najdorf, 6.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f3 *++[ECO "B90e"]+[Variation "Sicilian: Najdorf, Adams Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.h3 *++[ECO "B90f"]+[Variation "Sicilian: Najdorf, Fischer-Sozin Attack"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bc4 *++[ECO "B90g"]+[Variation "Sicilian: Najdorf, 6.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 *++[ECO "B90h"]+[Variation "Sicilian: Najdorf, 6.Be3 Ng4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 Ng4 *++[ECO "B90h"]+[Variation "Sicilian: Najdorf, 6.Be3 Ng4 7.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 Ng4 7.Bg5 *++[ECO "B90i"]+[Variation "Sicilian: Najdorf, 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7 *++[ECO "B90j"]+[Variation "Sicilian: Najdorf, 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7 10.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7 10.Be2 *++[ECO "B90j"]+[Variation "Sicilian: Najdorf, 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7 10.Be2 h5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 Ng4 7.Bg5 h6 8.Bh4 g5 9.Bg3 Bg7 10.Be2 h5 *++[ECO "B90k"]+[Variation "Sicilian: Najdorf, 6.Be3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 *++[ECO "B90l"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 *++[ECO "B90m"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.Qd2 *++[ECO "B90n"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 *++[ECO "B90o"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 *++[ECO "B90o"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 *++[ECO "B90p"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 Nbd7 *++[ECO "B90q"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O *++[ECO "B90q"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O 10.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O 10.O-O-O *++[ECO "B90r"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O 10.O-O-O Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 O-O 10.O-O-O Nbd7 *++[ECO "B90s"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Nbd7 *++[ECO "B90t"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Nbd7 9.Qd2 *++[ECO "B90u"]+[Variation "Sicilian: Najdorf, 6.Be3 e5 7.Nb3 Be6 8.f3 Be7 9.Qd2 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.f3 Nbd7 9.Qd2 b5 *++[ECO "B91a"]+[Variation "Sicilian: Najdorf, 6.g3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 *++[ECO "B91b"]+[Variation "Sicilian: Najdorf, 6.g3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 b5 *++[ECO "B91c"]+[Variation "Sicilian: Najdorf, 6.g3 g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 g6 *++[ECO "B91d"]+[Variation "Sicilian: Najdorf, 6.g3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 Nc6 *++[ECO "B91e"]+[Variation "Sicilian: Najdorf, 6.g3 Bg4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 Bg4 *++[ECO "B91f"]+[Variation "Sicilian: Najdorf, 6.g3 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 *++[ECO "B91g"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nb3 *++[ECO "B91h"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nb3 Be7 *++[ECO "B91i"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 *++[ECO "B91j"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 b5 *++[ECO "B91k"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 Nbd7 *++[ECO "B91l"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 Be7 *++[ECO "B91m"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2 Be7 8.Bg2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 Be7 8.Bg2 Nbd7 *++[ECO "B91n"]+[Variation "Sicilian: Najdorf, 6.g3 e5 7.Nde2 Be7 8.Bg2 O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 e5 7.Nde2 Be7 8.Bg2 O-O *++[ECO "B92a"]+[Variation "Sicilian: Najdorf, 6.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 *++[ECO "B92b"]+[Variation "Sicilian: Najdorf, 6.Be2 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 Nbd7 *++[ECO "B92c"]+[Variation "Sicilian: Najdorf, 6.Be2 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 *++[ECO "B92d"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nf3 *++[ECO "B92e"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 *++[ECO "B92f"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 *++[ECO "B92g"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.Be3 *++[ECO "B92g"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.Be3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.Be3 Be6 *++[ECO "B92h"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O *++[ECO "B92h"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O Be6 *++[ECO "B92i"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O Be6 9.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O Be6 9.f4 *++[ECO "B92j"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O *++[ECO "B92k"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 *++[ECO "B92k"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 *++[ECO "B92l"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.a4 *++[ECO "B92m"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Nd5 *++[ECO "B92n"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Be3 Be6 10.Qd2 *++[ECO "B92o"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 *++[ECO "B92p"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Be6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Be6 *++[ECO "B92q"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Nc6 *++[ECO "B92r"]+[Variation "Sicilian: Najdorf, 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e5 7.Nb3 Be7 8.O-O O-O 9.Kh1 Qc7 *++[ECO "B93a"]+[Variation "Sicilian: Najdorf, 6.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 *++[ECO "B93b"]+[Variation "Sicilian: Najdorf, 6.f4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Nc6 *++[ECO "B93c"]+[Variation "Sicilian: Najdorf, 6.f4 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Nbd7 *++[ECO "B93d"]+[Variation "Sicilian: Najdorf, 6.f4 Nbd7 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Nbd7 7.Be2 *++[ECO "B93e"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 *++[ECO "B93f"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 7.Bd3 *++[ECO "B93g"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7 7.Bd3 g6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 7.Bd3 g6 *++[ECO "B93h"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 7.Nf3 *++[ECO "B93i"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7 7.Nf3 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 7.Nf3 Nbd7 *++[ECO "B93j"]+[Variation "Sicilian: Najdorf, 6.f4 Qc7 7.Nf3 Nbd7 8.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 Qc7 7.Nf3 Nbd7 8.Bd3 *++[ECO "B93k"]+[Variation "Sicilian: Najdorf, 6.f4 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 *++[ECO "B93k"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 *++[ECO "B93l"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Qc7 *++[ECO "B93m"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Qc7 8.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Qc7 8.a4 *++[ECO "B93n"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 *++[ECO "B93o"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.Bd3 *++[ECO "B93p"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 *++[ECO "B93q"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Qc7 *++[ECO "B93r"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 *++[ECO "B93r"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bc4 *++[ECO "B93s"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3 *++[ECO "B93t"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3 O-O 10.O-O Nc5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3 O-O 10.O-O Nc5 *++[ECO "B93u"]+[Variation "Sicilian: Najdorf, 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3 O-O 10.O-O exf4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e5 7.Nf3 Nbd7 8.a4 Be7 9.Bd3 O-O 10.O-O exf4 *++[ECO "B94a"]+[Variation "Sicilian: Najdorf, 6.Bg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 *++[ECO "B94b"]+[Variation "Sicilian: Najdorf, 6.Bg5 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 b5 *++[ECO "B94c"]+[Variation "Sicilian: Najdorf, 6.Bg5 e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e5 *++[ECO "B94d"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 *++[ECO "B94e"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.f4 *++[ECO "B94f"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.f4 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.f4 b5 *++[ECO "B94g"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 *++[ECO "B94h"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.Bc4 e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 e6 *++[ECO "B94i"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.Bc4 e6 8.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 e6 8.O-O *++[ECO "B94j"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.Bc4 Qa5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 Qa5 *++[ECO "B94k"]+[Variation "Sicilian: Najdorf, 6.Bg5 Nbd7 7.Bc4 Qa5 8.Qd2 e6 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 Qa5 8.Qd2 e6 9.O-O-O *++[ECO "B95a"]+[Variation "Sicilian: Najdorf, 6...e6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 *++[ECO "B95b"]+[Variation "Sicilian: Najdorf, 6...e6 7.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Bd3 *++[ECO "B95c"]+[Variation "Sicilian: Najdorf, 6...e6 7.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Be2 *++[ECO "B95d"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qe2 *++[ECO "B95e"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qd2 *++[ECO "B95f"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qd2 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qd2 Be7 *++[ECO "B95g"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qd2 Be7 8.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O *++[ECO "B95h"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qd3 *++[ECO "B95i"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qd3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qd3 Nc6 *++[ECO "B95j"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qf3 *++[ECO "B95k"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qf3 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qf3 Nbd7 *++[ECO "B95l"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qf3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qf3 Be7 *++[ECO "B95m"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qf3 Be7 8.O-O-O Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qf3 Be7 8.O-O-O Nbd7 *++[ECO "B95n"]+[Variation "Sicilian: Najdorf, 6...e6 7.Qf3 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.Qf3 h6 *++[ECO "B96a"]+[Variation "Sicilian: Najdorf, 7.f4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 *++[ECO "B96b"]+[Variation "Sicilian: Najdorf, 7.f4 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 h6 *++[ECO "B96b"]+[Variation "Sicilian: Najdorf, Delayed Poisoned Pawn"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 h6 8.Bh4 Qb6 *++[ECO "B96c"]+[Variation "Sicilian: Najdorf, 7.f4 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nc6 *++[ECO "B96c"]+[Variation "Sicilian: Najdorf, 7.f4 Nc6 8.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nc6 8.e5 *++[ECO "B96d"]+[Variation "Sicilian: Najdorf, 7.f4 Nc6 8.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nc6 8.Nxc6 *++[ECO "B96e"]+[Variation "Sicilian: Najdorf, 7.f4 Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Bd7 *++[ECO "B96f"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 *++[ECO "B96f"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Bxf6 *++[ECO "B96g"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Qf3 *++[ECO "B96h"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Qf3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Qf3 b5 *++[ECO "B96h"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Qf3 b5 9.f5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Qf3 b5 9.f5 *++[ECO "B96h"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Qf3 b5 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Qf3 b5 9.O-O-O *++[ECO "B96h"]+[Variation "Sicilian: Najdorf, 7.f4 Qc7 8.Qf3 b5 9.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qc7 8.Qf3 b5 9.Bxf6 *++[ECO "B96i"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 *++[ECO "B96i"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Bc4 *++[ECO "B96i"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qe2 *++[ECO "B96i"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qe2 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qe2 Qc7 *++[ECO "B96j"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qf3 *++[ECO "B96j"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qf3 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qf3 Qc7 *++[ECO "B96k"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5 *++[ECO "B96l"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5 10.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5 10.Bd3 *++[ECO "B96m"]+[Variation "Sicilian: Najdorf, 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5 10.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Nbd7 8.Qf3 Qc7 9.O-O-O b5 10.e5 *++[ECO "B96n"]+[Variation "Sicilian: Najdorf, Polugaevsky Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 *++[ECO "B96n"]+[Variation "Sicilian: Najdorf, Polugaevsky, 8.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 *++[ECO "B96n"]+[Variation "Sicilian: Najdorf, Polugaevsky, 9.fxe5 Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 *++[ECO "B96o"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Nf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Nf3 *++[ECO "B96p"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Bxb5+"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Bxb5+ *++[ECO "B96q"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.exf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.exf6 *++[ECO "B96r"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.exf6 Qe5+ 11.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.exf6 Qe5+ 11.Be2 *++[ECO "B96s"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.exf6 Qe5+ 11.Be2 Qxg5 12.Qd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.exf6 Qe5+ 11.Be2 Qxg5 12.Qd3 *++[ECO "B96t"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Qe2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 *++[ECO "B96u"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Qe2 Nfd7 11.O-O-O Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 Nfd7 11.O-O-O Nc6 *++[ECO "B96v"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Qe2 Nfd7 11.O-O-O Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 Nfd7 11.O-O-O Bb7 *++[ECO "B96w"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Qe2 Nfd7 11.O-O-O Bb7 12.Qg4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 Nfd7 11.O-O-O Bb7 12.Qg4 *++[ECO "B96w"]+[Variation "Sicilian: Najdorf, Polugaevsky, 10.Qe2 Nfd7 11.O-O-O Bb7 12.Qg4 Qxe5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 Nfd7 11.O-O-O Bb7 12.Qg4 Qxe5 *++[ECO "B97a"]+[Variation "Sicilian: Najdorf, Poisoned Pawn"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 *++[ECO "B97b"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Bxf6 *++[ECO "B97c"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.a3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.a3 *++[ECO "B97d"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Qd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd3 *++[ECO "B97e"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Nb3 *++[ECO "B97f"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Nb3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Nb3 Be7 *++[ECO "B97g"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Nb3 Nbd7 9.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Nb3 Nbd7 9.Qf3 *++[ECO "B97h"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Nb3 Nbd7 9.Qf3 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Nb3 Nbd7 9.Qf3 Be7 *++[ECO "B97i"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 8.Qd2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 *++[ECO "B97i"]+[Variation "Sicilian: Najdorf, Poisoned Pawn Accepted"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 *++[ECO "B97j"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Nb3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Nb3 *++[ECO "B97j"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Nb3 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Nb3 Nc6 *++[ECO "B97k"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Nb3 Qa3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Nb3 Qa3 *++[ECO "B97l"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Nb3 Qa3 10.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Nb3 Qa3 10.Bxf6 *++[ECO "B97m"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Rb1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 *++[ECO "B97m"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 9.Rb1 Qa3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 *++[ECO "B97n"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Be2 *++[ECO "B97n"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Be2 Be7 11.O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Be2 Be7 11.O-O *++[ECO "B97n"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Be2 Be7 11.O-O Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Be2 Be7 11.O-O Nbd7 *++[ECO "B97o"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Bxf6 *++[ECO "B97o"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Bxf6 gxf6 11.Be2 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Bxf6 gxf6 11.Be2 Nc6 *++[ECO "B97o"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.Bxf6 gxf6 11.Be2 Bg7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.Bxf6 gxf6 11.Be2 Bg7 *++[ECO "B97p"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.e5 *++[ECO "B97p"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.e5 dxe5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.e5 dxe5 *++[ECO "B97p"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.e5 dxe5 11.fxe5 Nfd7 12.Bc4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.e5 dxe5 11.fxe5 Nfd7 12.Bc4 *++[ECO "B97p"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.e5 dxe5 11.fxe5 Nfd7 12.Bc4 Bb4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.e5 dxe5 11.fxe5 Nfd7 12.Bc4 Bb4 *++[ECO "B97q"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.f5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 *++[ECO "B97q"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, 10.f5 Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 *++[ECO "B97r"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 *++[ECO "B97s"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, Timman's 13.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.Be2 *++[ECO "B97t"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 *++[ECO "B97t"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 Nd5 *++[ECO "B97u"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 *++[ECO "B97u"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5: 15.Ne4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 14.Bxf6 gxf6 15.Ne4 *++[ECO "B97v"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5: 15.Ne4 Qxa2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 14.Bxf6 gxf6 15.Ne4 Qxa2 *++[ECO "B97w"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5: 15.Ne4 Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 14.Bxf6 gxf6 15.Ne4 Be7 *++[ECO "B97x"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5 with 18.c4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 14.Bxf6 gxf6 15.Ne4 Be7 16.Be2 h5 17.Rb3 Qa4 18.c4 *++[ECO "B97y"]+[Variation "Sicilian: Najdorf, Poisoned Pawn, Main Line, 13.e5 dxe5 with 18.Nxf6+"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 10.f5 Nc6 11.fxe6 fxe6 12.Nxc6 bxc6 13.e5 dxe5 14.Bxf6 gxf6 15.Ne4 Be7 16.Be2 h5 17.Rb3 Qa4 18.Nxf6+ *++[ECO "B98a"]+[Variation "Sicilian: Najdorf, 7...Be7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 *++[ECO "B98b"]+[Variation "Sicilian: Najdorf, 7...Be7 8.Qf3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 *++[ECO "B98c"]+[Variation "Sicilian: Najdorf, Danner Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qa5 *++[ECO "B98d"]+[Variation "Sicilian: Najdorf, Danner, 9.O-O-O Bd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qa5 9.O-O-O Bd7 *++[ECO "B98e"]+[Variation "Sicilian: Najdorf, Danner, 9.O-O-O Bd7 10.e5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qa5 9.O-O-O Bd7 10.e5 *++[ECO "B98f"]+[Variation "Sicilian: Najdorf, 7...Be7 8.Qf3 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 *++[ECO "B98g"]+[Variation "Sicilian: Najdorf, Browne Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 Qc7 *++[ECO "B98h"]+[Variation "Sicilian: Najdorf, Browne, 10.O-O-O Nbd7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 Qc7 10.O-O-O Nbd7 *++[ECO "B98i"]+[Variation "Sicilian: Najdorf, Browne, 10.O-O-O Nbd7 11.Qg3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 Qc7 10.O-O-O Nbd7 11.Qg3 *++[ECO "B98j"]+[Variation "Sicilian: Najdorf, Browne, 10.O-O-O Nbd7 11.Be2"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 Qc7 10.O-O-O Nbd7 11.Be2 *++[ECO "B98k"]+[Variation "Sicilian: Najdorf, Gothenburg (Argentine) Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 g5 *++[ECO "B98l"]+[Variation "Sicilian: Najdorf, Gothenburg, 11.Nxe6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 g5 10.fxg5 Nfd7 11.Nxe6 *++[ECO "B98m"]+[Variation "Sicilian: Najdorf, Gothenburg, 11.Qh5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 g5 10.fxg5 Nfd7 11.Qh5 *++[ECO "B98n"]+[Variation "Sicilian: Najdorf, 8...Qc7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 *++[ECO "B98n"]+[Variation "Sicilian: Najdorf, 8...Qc7 9.O-O-O"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O *++[ECO "B98o"]+[Variation "Sicilian: Najdorf, 8...Qc7 9.O-O-O b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O b5 *++[ECO "B98p"]+[Variation "Sicilian: Najdorf, 8...Qc7 9.O-O-O Nc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nc6 *++[ECO "B98q"]+[Variation "Sicilian: Najdorf, 8...Qc7 9.O-O-O Nc6 10.Nxc6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nc6 10.Nxc6 *++[ECO "B99a"]+[Variation "Sicilian: Najdorf, Main Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 *++[ECO "B99b"]+[Variation "Sicilian: Najdorf, Main Line, 10.Qg3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Qg3 *++[ECO "B99c"]+[Variation "Sicilian: Najdorf, Main Line, Keres Variation"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Be2 *++[ECO "B99c"]+[Variation "Sicilian: Najdorf, Main Line, Keres 10...b5 11.Bxf6 Nxf6 12.e5 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Be2 b5 11.Bxf6 Nxf6 12.e5 Bb7 *++[ECO "B99d"]+[Variation "Sicilian: Najdorf, Main Line, Keres, Queen Sacrifice Line"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Be2 b5 11.Bxf6 Nxf6 12.e5 Bb7 13.exf6 *++[ECO "B99e"]+[Variation "Sicilian: Najdorf, Main Line, Keres, 13.Qg3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Be2 b5 11.Bxf6 Nxf6 12.e5 Bb7 13.Qg3 *++[ECO "B99e"]+[Variation "Sicilian: Najdorf, Main Line, Keres, 13.Qg3 dxe5 14.fxe5 Nd7 15.Bxb5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Be2 b5 11.Bxf6 Nxf6 12.e5 Bb7 13.Qg3 dxe5 14.fxe5 Nd7 15.Bxb5 *++[ECO "B99f"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 *++[ECO "B99f"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 h6 *++[ECO "B99g"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 h6 11.Qh3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 h6 11.Qh3 *++[ECO "B99h"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 h6 11.Bh4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 h6 11.Bh4 *++[ECO "B99h"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 h6 11.Bh4 g5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 h6 11.Bh4 g5 *++[ECO "B99i"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 h6 11.Bh4 g5 12.fxg5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 h6 11.Bh4 g5 12.fxg5 *++[ECO "B99j"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 b5 *++[ECO "B99j"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 b5 11.Rhe1 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 b5 11.Rhe1 Bb7 *++[ECO "B99k"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 b5 11.Rhe1 Bb7 12.Nd5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 b5 11.Rhe1 Bb7 12.Nd5 *++[ECO "B99l"]+[Variation "Sicilian: Najdorf, Main Line, 10.Bd3 b5 11.Rhe1 Bb7 12.Qg3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.Bd3 b5 11.Rhe1 Bb7 12.Qg3 *++[ECO "B99m"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 *++[ECO "B99m"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 h6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 h6 *++[ECO "B99n"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 *++[ECO "B99n"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bd3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bd3 *++[ECO "B99n"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bd3 Bb7"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bd3 Bb7 *++[ECO "B99o"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.a3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.a3 *++[ECO "B99p"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 *++[ECO "B99q"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bxf6 gxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 gxf6 *++[ECO "B99r"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bxf6 Nxf6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 *++[ECO "B99r"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bxf6 Nxf6 12.g5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 *++[ECO "B99r"]+[Variation "Sicilian: Najdorf, Main Line, 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.a3"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.a3 *++[ECO "B99s"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 *++[ECO "B99t"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Bxg5+"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Bxg5+ *++[ECO "B99u"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Bxg5+ 14.Kb1 Ne5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Bxg5+ 14.Kb1 Ne5 *++[ECO "B99v"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Nc5"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Nc5 *++[ECO "B99w"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Nc5 14.h4"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Nc5 14.h4 *++[ECO "B99x"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Nc5 14.f6"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Nc5 14.f6 *++[ECO "B99y"]+[Variation "Sicilian: Najdorf, Modern Main Line 13.f5 Nc5 14.f6: Perenyi's 16.Rg1"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 10.g4 b5 11.Bxf6 Nxf6 12.g5 Nd7 13.f5 Nc5 14.f6 gxf6 15.gxf6 Bf8 16.Rg1 *++[ECO "C00a"]+[Variation "French"]+[Result "*"]+1.e4 e6 *++[ECO "C00a"]+[Variation "French: Bird Variation"]+[Result "*"]+1.e4 e6 2.Bb5 *++[ECO "C00b"]+[Variation "French: Reti (Spielmann) Variation"]+[Result "*"]+1.e4 e6 2.b3 *++[ECO "C00c"]+[Variation "French: La Bourdonnais Variation"]+[Result "*"]+1.e4 e6 2.f4 *++[ECO "C00d"]+[Variation "French: Steinitz Attack"]+[Result "*"]+1.e4 e6 2.e5 *++[ECO "C00e"]+[Variation "French: Steiner (Anglo-French) Variation"]+[Result "*"]+1.e4 e6 2.c4 *++[ECO "C00e"]+[Variation "French: Steiner (Anglo-French) Variation"]+[Result "*"]+1.e4 e6 2.c4 d5 *++[ECO "C00e"]+[Variation "French: Orthoschnapp Gambit"]+[Result "*"]+1.e4 e6 2.c4 d5 3.cxd5 exd5 4.Qb3 *++[ECO "C00f"]+[Variation "French: 2.Nc3"]+[Result "*"]+1.e4 e6 2.Nc3 *++[ECO "C00f"]+[Variation "French: 2.Nc3 d5"]+[Result "*"]+1.e4 e6 2.Nc3 d5 *++[ECO "C00f"]+[Variation "French: Pelikan Variation"]+[Result "*"]+1.e4 e6 2.Nc3 d5 3.f4 *++[ECO "C00g"]+[Variation "French: Chigorin Variation"]+[Result "*"]+1.e4 e6 2.Qe2 *++[ECO "C00h"]+[Variation "French: Chigorin, 2...c5"]+[Result "*"]+1.e4 e6 2.Qe2 c5 *++[ECO "C00i"]+[Variation "French: Chigorin, 2...c5 3.Nf3"]+[Result "*"]+1.e4 e6 2.Qe2 c5 3.Nf3 *++[ECO "C00j"]+[Variation "French: 2.Nf3"]+[Result "*"]+1.e4 e6 2.Nf3 *++[ECO "C00j"]+[Variation "French: 2.Nf3 d5"]+[Result "*"]+1.e4 e6 2.Nf3 d5 *++[ECO "C00j"]+[Variation "French: 2.Nf3 d5 3.e5"]+[Result "*"]+1.e4 e6 2.Nf3 d5 3.e5 *++[ECO "C00j"]+[Variation "French: 2.Nf3 d5 3.e5 c5"]+[Result "*"]+1.e4 e6 2.Nf3 d5 3.e5 c5 *++[ECO "C00k"]+[Variation "French: Wing Gambit"]+[Result "*"]+1.e4 e6 2.Nf3 d5 3.e5 c5 4.b4 *++[ECO "C00l"]+[Variation "French: Two Knights Variation"]+[Result "*"]+1.e4 e6 2.Nf3 d5 3.Nc3 *++[ECO "C00m"]+[Variation "French: KIA 2.d3"]+[Result "*"]+1.e4 e6 2.d3 *++[ECO "C00m"]+[Variation "French: KIA 2.d3 d5"]+[Result "*"]+1.e4 e6 2.d3 d5 *++[ECO "C00n"]+[Variation "French: KIA 2.d3 d5 3.Qe2"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Qe2 *++[ECO "C00o"]+[Variation "French: KIA 2.d3 d5 3.Qe2 Nf6"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Qe2 Nf6 *++[ECO "C00p"]+[Variation "French: KIA 2.d3 d5 3.Nd2"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 *++[ECO "C00q"]+[Variation "French: KIA 2.d3 d5 3.Nd2 c5"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 c5 *++[ECO "C00r"]+[Variation "French: KIA 2.d3 d5 3.Nd2 Nf6"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 *++[ECO "C00s"]+[Variation "French: KIA, Reversed Philidor"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 4.Ngf3 *++[ECO "C00t"]+[Variation "French: KIA, Reversed Philidor, 4...b6"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 4.Ngf3 b6 *++[ECO "C00u"]+[Variation "French: KIA, Reversed Philidor, 4...Nc6"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 4.Ngf3 Nc6 *++[ECO "C00v"]+[Variation "French: KIA, Reversed Philidor, 4...Nc6 5.c3"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 4.Ngf3 Nc6 5.c3 *++[ECO "C00w"]+[Variation "French: 2.d4"]+[Result "*"]+1.e4 e6 2.d4 *++[ECO "C00w"]+[Variation "French: St. George"]+[Result "*"]+1.e4 e6 2.d4 a6 *++[ECO "C00w"]+[Variation "French: Franco-Benoni"]+[Result "*"]+1.e4 e6 2.d4 c5 *++[ECO "C00x"]+[Variation "French: 2.d4 d5"]+[Result "*"]+1.e4 e6 2.d4 d5 *++[ECO "C00x"]+[Variation "French: Alapin-Diemer Gambit (ADG)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Be3 *++[ECO "C00y"]+[Variation "French: Schlechter"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Bd3 *++[ECO "C01a"]+[Variation "French: Exchange"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 *++[ECO "C01a"]+[Variation "French: Exchange, 3...Qxd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 Qxd5 *++[ECO "C01b"]+[Variation "French: Exchange"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 *++[ECO "C01c"]+[Variation "French: Exchange, 4.c4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 *++[ECO "C01c"]+[Variation "French: Exchange, 4.c4 c6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 c6 *++[ECO "C01d"]+[Variation "French: Exchange, 4.c4 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 *++[ECO "C01d"]+[Variation "French: Exchange, 4.c4 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nf3 *++[ECO "C01e"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 *++[ECO "C01e"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3 c6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 c6 *++[ECO "C01e"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3 Bb4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 Bb4 *++[ECO "C01e"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3 Bb4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 Bb4 6.Nf3 *++[ECO "C01f"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 Be7 *++[ECO "C01f"]+[Variation "French: Exchange, 4.c4 Nf6 5.Nc3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.c4 Nf6 5.Nc3 Be7 6.Nf3 *++[ECO "C01g"]+[Variation "French: Exchange, 4.Bf4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bf4 *++[ECO "C01h"]+[Variation "French: Exchange, 4.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bd3 *++[ECO "C01i"]+[Variation "French: Exchange, 4.Bd3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bd3 Nc6 *++[ECO "C01j"]+[Variation "French: Exchange, 4.Bd3 Bd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bd3 Bd6 *++[ECO "C01k"]+[Variation "French: Exchange, 4.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 *++[ECO "C01l"]+[Variation "French: Exchange, 4.Nf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 Nf6 *++[ECO "C01m"]+[Variation "French: Exchange, 4.Nf3 Nf6 5.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 Nf6 5.Bd3 *++[ECO "C01n"]+[Variation "French: Exchange, 4.Nf3 Bd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 Bd6 *++[ECO "C01o"]+[Variation "French: Exchange, 4.Nf3 Bd6 5.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bd3 Bd6 5.Nf3 *++[ECO "C01p"]+[Variation "French: Exchange, 4.Nf3 Bd6 5.Bd3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Bd3 Bd6 5.Nf3 Nf6 *++[ECO "C01q"]+[Variation "French: Exchange, 4.Nf3 Bd6 5.c4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 Bd6 5.c4 *++[ECO "C01r"]+[Variation "French: Exchange, 4.Nc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 *++[ECO "C01s"]+[Variation "French: Exchange, 4.Nc3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 *++[ECO "C01s"]+[Variation "French: Exchange, 4.Nc3 Nf6 5.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 5.Nf3 *++[ECO "C01t"]+[Variation "French: Exchange, Svenonius Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 5.Bg5 *++[ECO "C01t"]+[Variation "French: Exchange, Bogoljubow Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 5.Bg5 Nc6 *++[ECO "C01u"]+[Variation "French: Exchange Winawer"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Bb4 *++[ECO "C01v"]+[Variation "French: Exchange Winawer, 5.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Bb4 5.Bd3 *++[ECO "C01v"]+[Variation "French: Exchange, Canal Attack"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Bb4 5.Bd3 Ne7 6.Qh5 *++[ECO "C01w"]+[Variation "French: Exchange Winawer, 5.Bd3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Bb4 5.Bd3 Nc6 *++[ECO "C02a"]+[Variation "French: Advance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 *++[ECO "C02a"]+[Variation "French: Advance, 3...Ne7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 Ne7 *++[ECO "C02b"]+[Variation "French: Advance, 3...b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 b6 *++[ECO "C02b"]+[Variation "French: Advance, 3...b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 b6 4.c3 Qd7 *++[ECO "C02c"]+[Variation "French: Advance, 3...c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 *++[ECO "C02c"]+[Variation "French: Advance, Wing Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.b4 *++[ECO "C02d"]+[Variation "French: Advance, Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.dxc5 *++[ECO "C02e"]+[Variation "French: Advance, Nimzowitsch Attack"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Qg4 *++[ECO "C02e"]+[Variation "French: Advance, Nimzowitsch Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Qg4 cxd4 5.Nf3 *++[ECO "C02f"]+[Variation "French: Advance, 4.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Nf3 *++[ECO "C02f"]+[Variation "French: Advance, Ruisdonk Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Nf3 cxd4 5.Bd3 *++[ECO "C02g"]+[Variation "French: Advance, 4.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 *++[ECO "C02h"]+[Variation "French: Advance, 4.c3 Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Qb6 *++[ECO "C02i"]+[Variation "French: Advance, Wade"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Qb6 5.Nf3 Bd7 *++[ECO "C02j"]+[Variation "French: Advance, Wade, 6.Be2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Qb6 5.Nf3 Bd7 6.Be2 *++[ECO "C02k"]+[Variation "French: Advance, 4...Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 *++[ECO "C02l"]+[Variation "French: Advance, Paulsen"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 *++[ECO "C02m"]+[Variation "French: Advance, 5.Nf3 Nge7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Nge7 *++[ECO "C02n"]+[Variation "French: Advance, Euwe"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Bd7 *++[ECO "C02o"]+[Variation "French: Advance, Euwe, 6.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Bd7 6.a3 *++[ECO "C02p"]+[Variation "French: Advance, Euwe, 6.Be2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Bd7 6.Be2 *++[ECO "C02q"]+[Variation "French: Advance, Euwe, 6.Be2 Nge7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Bd7 6.Be2 Nge7 *++[ECO "C02r"]+[Variation "French: Advance, 5.Nf3 Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 *++[ECO "C02s"]+[Variation "French: Advance, Milner-Barry Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.Bd3 *++[ECO "C02t"]+[Variation "French: Advance, 5.Nf3 Qb6 6.Be2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.Be2 *++[ECO "C02u"]+[Variation "French: Advance, 5.Nf3 Qb6 6.Be2 cxd4 7.cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.Be2 cxd4 7.cxd4 *++[ECO "C02v"]+[Variation "French: Advance, 5.Nf3 Qb6 6.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.a3 *++[ECO "C02w"]+[Variation "French: Advance, 5.Nf3 Qb6 6.a3 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.a3 Bd7 *++[ECO "C02x"]+[Variation "French: Advance, 5.Nf3 Qb6 6.a3 Nh6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.a3 Nh6 *++[ECO "C02y"]+[Variation "French: Advance, 5.Nf3 Qb6 6.a3 c4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.a3 c4 *++[ECO "C02z"]+[Variation "French: Advance, 5.Nf3 Qb6 6.a3 c4 7.Nbd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.a3 c4 7.Nbd2 *++[ECO "C03a"]+[Variation "French: Tarrasch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 *++[ECO "C03a"]+[Variation "French: Tarrasch, 3...dxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 dxe4 *++[ECO "C03b"]+[Variation "French: Tarrasch, Haberditz Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 f5 *++[ECO "C03c"]+[Variation "French: Tarrasch, 3...b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 b6 *++[ECO "C03d"]+[Variation "French: Tarrasch, 3...a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 a6 *++[ECO "C03e"]+[Variation "French: Tarrasch, 3...a6 4.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 a6 4.Ngf3 *++[ECO "C03f"]+[Variation "French: Tarrasch, 3...Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 *++[ECO "C03g"]+[Variation "French: Tarrasch, 3...Be7 4.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Bd3 *++[ECO "C03h"]+[Variation "French: Tarrasch, 3...Be7 4.Bd3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Bd3 c5 *++[ECO "C03i"]+[Variation "French: Tarrasch, 3...Be7 4.Bd3 c5 5.dxc5 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Bd3 c5 5.dxc5 Nf6 *++[ECO "C03j"]+[Variation "French: Tarrasch, 3...Be7 4.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Ngf3 *++[ECO "C03j"]+[Variation "French: Tarrasch, 3...Be7 4.Ngf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Ngf3 Nf6 *++[ECO "C03k"]+[Variation "French: Tarrasch, 3...Be7 4.Ngf3 Nf6 5.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Be7 4.Ngf3 Nf6 5.Bd3 *++[ECO "C03l"]+[Variation "French: Tarrasch, Guimard Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 *++[ECO "C03m"]+[Variation "French: Tarrasch, Guimard, 4.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.c3 *++[ECO "C03n"]+[Variation "French: Tarrasch, Guimard, 4.c3 e5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.c3 e5 *++[ECO "C03o"]+[Variation "French: Tarrasch, Guimard, 4.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 *++[ECO "C04a"]+[Variation "French: Tarrasch, Guimard, 4.Ngf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 *++[ECO "C04b"]+[Variation "French: Tarrasch, Guimard, 4.Ngf3 Nf6 5.e5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 *++[ECO "C04c"]+[Variation "French: Tarrasch, Guimard, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 *++[ECO "C04d"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.c3 *++[ECO "C04e"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Bb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Bb5 *++[ECO "C04f"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Be2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Be2 *++[ECO "C04g"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Be2 f6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Be2 f6 *++[ECO "C04h"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Nb3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Nb3 *++[ECO "C04i"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Nb3 a5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Nb3 a5 *++[ECO "C04j"]+[Variation "French: Tarrasch, Guimard, Main Line, 6.Nb3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 5.e5 Nd7 6.Nb3 Be7 *++[ECO "C05a"]+[Variation "French: Tarrasch, Closed"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 *++[ECO "C05b"]+[Variation "French: Tarrasch, Closed, 4.e5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 *++[ECO "C05c"]+[Variation "French: Tarrasch, Closed, 4...Ne4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Ne4 *++[ECO "C05c"]+[Variation "French: Tarrasch, Closed, 4...Ne4 5.Nxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Ne4 5.Nxe4 *++[ECO "C05d"]+[Variation "French: Tarrasch, Closed, 4...Nfd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 *++[ECO "C05e"]+[Variation "French: Tarrasch, Closed, 5.f4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 *++[ECO "C05f"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 *++[ECO "C05g"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 *++[ECO "C05h"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 cxd4 *++[ECO "C05i"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 *++[ECO "C05j"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.h4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.h4 *++[ECO "C05j"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.h4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.h4 cxd4 9.cxd4 *++[ECO "C05k"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.Ne2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.Ne2 *++[ECO "C05k"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.Ne2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.Ne2 cxd4 9.cxd4 *++[ECO "C05l"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.g3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.g3 *++[ECO "C05l"]+[Variation "French: Tarrasch, Closed, 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.g3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.f4 c5 6.c3 Nc6 7.Ndf3 Qb6 8.g3 cxd4 9.cxd4 *++[ECO "C05m"]+[Variation "French: Tarrasch, Closed, 5.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.c3 *++[ECO "C05n"]+[Variation "French: Tarrasch, 5.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 *++[ECO "C05o"]+[Variation "French: Tarrasch, Botvinnik"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 b6 *++[ECO "C05p"]+[Variation "French: Tarrasch, Closed, 6...Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 *++[ECO "C05p"]+[Variation "French: Tarrasch, Closed, 7.Ndf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ndf3 *++[ECO "C05q"]+[Variation "French: Tarrasch, Closed, 7.Ndf3 Qa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ndf3 Qa5 *++[ECO "C05r"]+[Variation "French: Tarrasch, Closed, 7.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ngf3 *++[ECO "C05s"]+[Variation "French: Tarrasch, Closed, 7.Ngf3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ngf3 Be7 *++[ECO "C05t"]+[Variation "French: Tarrasch, Closed, 7.Ngf3 Be7 8.O-O g5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ngf3 Be7 8.O-O g5 *++[ECO "C05u"]+[Variation "French: Tarrasch, Closed, Nunn-Korchnoi Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ngf3 Qb6 8.O-O *++[ECO "C05v"]+[Variation "French: Tarrasch, Closed, 7.Ne2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 *++[ECO "C05w"]+[Variation "French: Tarrasch, Closed, 7.Ne2 a5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 a5 *++[ECO "C06a"]+[Variation "French: Tarrasch, Closed, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 *++[ECO "C06b"]+[Variation "French: Tarrasch, Closed, Leningrad"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 *++[ECO "C06c"]+[Variation "French: Tarrasch, Closed, Leningrad, 9.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 9.Nf3 *++[ECO "C06d"]+[Variation "French: Tarrasch, Closed, Leningrad, 9.O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 9.O-O *++[ECO "C06e"]+[Variation "French: Tarrasch, Closed, Leningrad, 9.O-O a5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 9.O-O a5 *++[ECO "C06f"]+[Variation "French: Tarrasch, Closed, Leningrad, 9.O-O Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 9.O-O Bd7 *++[ECO "C06g"]+[Variation "French: Tarrasch, Closed, 8...Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Qb6 *++[ECO "C06h"]+[Variation "French: Tarrasch, Closed, 8...Qb6 9.O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Qb6 9.O-O *++[ECO "C06i"]+[Variation "French: Tarrasch, Closed, 8...Qb6 9.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Qb6 9.Nf3 *++[ECO "C06j"]+[Variation "French: Tarrasch, Closed, 8...Qb6 9.Nf3 f6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Qb6 9.Nf3 f6 *++[ECO "C06k"]+[Variation "French: Tarrasch, Closed, 8...f6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 *++[ECO "C06l"]+[Variation "French: Tarrasch, Closed, 8...f6 9.Nf4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.Nf4 *++[ECO "C06m"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 *++[ECO "C06n"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6 Nxf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 *++[ECO "C06o"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 *++[ECO "C06o"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 Qb6 *++[ECO "C06p"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...Qb6 12.Nc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 Qb6 12.Nc3 *++[ECO "C06q"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...Qc7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 Qc7 *++[ECO "C06r"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...Qc7 12.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 Qc7 12.Bg5 *++[ECO "C06s"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 O-O *++[ECO "C06t"]+[Variation "French: Tarrasch, Closed, 8...f6 9.exf6, 11...O-O 12.Bf4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 f6 9.exf6 Nxf6 10.O-O Bd6 11.Nf3 O-O 12.Bf4 *++[ECO "C07a"]+[Variation "French: Tarrasch, Open"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 *++[ECO "C07b"]+[Variation "French: Tarrasch, Open, 4.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.c3 *++[ECO "C07c"]+[Variation "French: Tarrasch, Open, 4.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.dxc5 *++[ECO "C07d"]+[Variation "French: Tarrasch, Open, 4.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.Ngf3 *++[ECO "C07e"]+[Variation "French: Tarrasch, Open, 4.Ngf3 a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.Ngf3 a6 *++[ECO "C07f"]+[Variation "French: Tarrasch, Open, 4.Ngf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.Ngf3 Nf6 *++[ECO "C07g"]+[Variation "French: Tarrasch, Open, 4.Ngf3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.Ngf3 Nc6 *++[ECO "C07h"]+[Variation "French: Tarrasch, Open, 4.Ngf3 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.Ngf3 cxd4 *++[ECO "C07i"]+[Variation "French: Tarrasch, Open, 4.exd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 *++[ECO "C07i"]+[Variation "French: Tarrasch, Shaposhnikov Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Nf6 *++[ECO "C07j"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 *++[ECO "C07k"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5 5.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 *++[ECO "C07l"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5 5.Ngf3 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 *++[ECO "C07m"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 *++[ECO "C07n"]+[Variation "French: Tarrasch, Open, Eliskases Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd8 *++[ECO "C07o"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 *++[ECO "C07p"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Qxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Qxd4 *++[ECO "C07p"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Qxd4 Qxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Qxd4 Qxd4 *++[ECO "C07q"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Nxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Nxd4 *++[ECO "C07r"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Nxd4 a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Nxd4 a6 *++[ECO "C07s"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Nxd4 a6 11.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Nxd4 a6 11.c3 *++[ECO "C07t"]+[Variation "French: Tarrasch, Open, 4.exd5 Qxd5, Main Line, 10.Nxd4 a6 11.Re1"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd6 7.O-O Nf6 8.Nb3 Nc6 9.Nbxd4 Nxd4 10.Nxd4 a6 11.Re1 *++[ECO "C08a"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 *++[ECO "C08b"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Bb5+ Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Nc6 *++[ECO "C08c"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Bb5+ Nc6 6.Qe2+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Nc6 6.Qe2+ *++[ECO "C08d"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Bb5+ Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Bd7 *++[ECO "C08e"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Bb5+ Bd7 6.Qe2+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Bd7 6.Qe2+ *++[ECO "C08f"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Bb5+ Bd7 6.Qe2+ Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Bd7 6.Qe2+ Be7 *++[ECO "C08g"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 *++[ECO "C08h"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 a6 *++[ECO "C08i"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 a6 6.Be2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 a6 6.Be2 *++[ECO "C08j"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nf6 *++[ECO "C08k"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 Nf6, 7.Bxd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nf6 6.Bb5+ Bd7 7.Bxd7+ *++[ECO "C08l"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 Nf6, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nf6 6.Bb5+ Bd7 7.Bxd7+ Nbd7 8.O-O Be7 9.dxc5 *++[ECO "C08m"]+[Variation "French: Tarrasch, Open, 4.exd5 exd5 5.Ngf3 Nf6, Main Line, 10.Nb3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nf6 6.Bb5+ Bd7 7.Bxd7+ Nbd7 8.O-O Be7 9.dxc5 Nxc5 10.Nb3 *++[ECO "C09a"]+[Variation "French: Tarrasch, Open, 5.Ngf3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 *++[ECO "C09b"]+[Variation "French: Tarrasch, Open, 5.Ngf3 Nc6 6.Bb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 *++[ECO "C09c"]+[Variation "French: Tarrasch, Open, 5.Ngf3 Nc6 6.Bb5 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 cxd4 *++[ECO "C09d"]+[Variation "French: Tarrasch, Open, 5.Ngf3 Nc6 6.Bb5 Bd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 *++[ECO "C09d"]+[Variation "French: Tarrasch, Open, 7.O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O *++[ECO "C09e"]+[Variation "French: Tarrasch, Open, 7.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.dxc5 *++[ECO "C09f"]+[Variation "French: Tarrasch, Open, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.dxc5 Bxc5 8.O-O Ne7 *++[ECO "C09g"]+[Variation "French: Tarrasch, Open, Main Line, 9.c3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.c3 *++[ECO "C09h"]+[Variation "French: Tarrasch, Open, Main Line, 9.c3 O-O 10.Nb3 Bd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.c3 O-O 10.Nb3 Bd6 *++[ECO "C09i"]+[Variation "French: Tarrasch, Open, Main Line, 9.c3 O-O 10.Nb3 Bb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.c3 O-O 10.Nb3 Bb6 *++[ECO "C09j"]+[Variation "French: Tarrasch, Open, Main Line, 9.c3 O-O 10.Nb3 Bb6 11.Re1"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.c3 O-O 10.Nb3 Bb6 11.Re1 *++[ECO "C09k"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 *++[ECO "C09k"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bb6 *++[ECO "C09l"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 *++[ECO "C09m"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6 10.Nbd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Nbd4 *++[ECO "C09n"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6 10.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Bg5 *++[ECO "C09o"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6 10.Re1"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Re1 *++[ECO "C09p"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6 10.Re1 O-O 11.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Re1 O-O 11.Bg5 *++[ECO "C09q"]+[Variation "French: Tarrasch, Open, Main Line, 9.Nb3 Bd6 10.Re1 O-O 11.Bg5 Bg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Re1 O-O 11.Bg5 Bg4 *++[ECO "C10a"]+[Variation "French: 3.Nc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 *++[ECO "C10b"]+[Variation "French: Marshall Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 c5 *++[ECO "C10c"]+[Variation "French: 3.Nc3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nc6 *++[ECO "C10d"]+[Variation "French: 3.Nc3 Nc6 4.Nf3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nc6 4.Nf3 Nf6 *++[ECO "C10e"]+[Variation "French: 3.Nc3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Be7 *++[ECO "C10f"]+[Variation "French: Rubinstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 *++[ECO "C10f"]+[Variation "French: Rubinstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 *++[ECO "C10f"]+[Variation "French: Rubinstein, Ellis Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 e5 *++[ECO "C10f"]+[Variation "French: Rubinstein, Frere (Becker) Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Qd5 *++[ECO "C10g"]+[Variation "French: Rubinstein, 4...Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 *++[ECO "C10h"]+[Variation "French: Rubinstein, 4...Nd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 *++[ECO "C10i"]+[Variation "French: Rubinstein, 5.Nf3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Be7 *++[ECO "C10j"]+[Variation "French: Rubinstein, 5.Nf3 Ngf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 *++[ECO "C10k"]+[Variation "French: Rubinstein, 5.Nf3 Ngf6 6.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Bd3 *++[ECO "C10l"]+[Variation "French: Rubinstein, 5.Nf3 Ngf6 6.Nxf6+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ *++[ECO "C10m"]+[Variation "French: Rubinstein, Capablanca"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Ne5 *++[ECO "C10n"]+[Variation "French: Rubinstein, 7.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bd3 *++[ECO "C10o"]+[Variation "French: Rubinstein, 7.Bd3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bd3 c5 *++[ECO "C10p"]+[Variation "French: Rubinstein, 7.Bd3 c5 8.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bd3 c5 8.dxc5 *++[ECO "C10q"]+[Variation "French: Rubinstein, 7.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Bg5 *++[ECO "C10r"]+[Variation "French: Rubinstein, 4...Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 *++[ECO "C10s"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 *++[ECO "C10t"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3 Bc6 6.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 6.Bd3 *++[ECO "C10u"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3 Bc6 6.Bd3 Nd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 6.Bd3 Nd7 *++[ECO "C10v"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O *++[ECO "C10w"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O Ngf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O Ngf6 *++[ECO "C10x"]+[Variation "French: Rubinstein, 4...Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O Ngf6 8.Ng3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 6.Bd3 Nd7 7.O-O Ngf6 8.Ng3 *++[ECO "C11a"]+[Variation "French: 3.Nc3 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 *++[ECO "C11a"]+[Variation "French: Henneberger Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Be3 *++[ECO "C11a"]+[Variation "French: 3.Nc3 Nf6 4.exd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.exd5 *++[ECO "C11b"]+[Variation "French: Swiss Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bd3 *++[ECO "C11c"]+[Variation "French: Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 *++[ECO "C11c"]+[Variation "French: Steinitz, Gledhill Attack"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.Qg4 *++[ECO "C11d"]+[Variation "French: Steinitz, 5.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.Nf3 *++[ECO "C11d"]+[Variation "French: Steinitz, 5.Nf3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.Nf3 c5 *++[ECO "C11e"]+[Variation "French: Steinitz, 5.Nf3 c5 6.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.Nf3 c5 6.dxc5 *++[ECO "C11f"]+[Variation "French: Steinitz, 5.f4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 *++[ECO "C11f"]+[Variation "French: Steinitz, 5.f4 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 *++[ECO "C11g"]+[Variation "French: Steinitz, 6.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 *++[ECO "C11g"]+[Variation "French: Steinitz, Bradford Attack"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Bxc5 7.Qg4 *++[ECO "C11g"]+[Variation "French: Steinitz, 6.dxc5 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Nc6 *++[ECO "C11g"]+[Variation "French: Steinitz, Brodsky-Jones Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Nc6 7.a3 Bxc5 8.Qg4 O-O 9.Nf3 f6 *++[ECO "C11h"]+[Variation "French: Steinitz, 6.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 *++[ECO "C11i"]+[Variation "French: Steinitz, Boleslavsky Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 *++[ECO "C11j"]+[Variation "French: Steinitz, Boleslavsky, 7...a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 a6 *++[ECO "C11k"]+[Variation "French: Steinitz, Boleslavsky, 7...a6 8.Qd2 b5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 a6 8.Qd2 b5 *++[ECO "C11l"]+[Variation "French: Steinitz, Boleslavsky, 7...cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 cxd4 *++[ECO "C11m"]+[Variation "French: Steinitz, Boleslavsky, 7...cxd4 8.Nxd4 Qb6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 cxd4 8.Nxd4 Qb6 *++[ECO "C11n"]+[Variation "French: Steinitz, Boleslavsky, 7...cxd4 8.Nxd4 Bc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 cxd4 8.Nxd4 Bc5 *++[ECO "C11o"]+[Variation "French: 3.Nc3 Nf6 4.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 *++[ECO "C11o"]+[Variation "French: Burn Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 *++[ECO "C11p"]+[Variation "French: Burn, 5.Nxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 *++[ECO "C11p"]+[Variation "French: Burn, 5.Nxe4 Nbd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Nbd7 *++[ECO "C11q"]+[Variation "French: Burn, 5.Nxe4 Nbd7 6.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Nbd7 6.Nf3 *++[ECO "C11r"]+[Variation "French: Burn, 5.Nxe4 Nbd7 6.Nf3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Nbd7 6.Nf3 Be7 *++[ECO "C11r"]+[Variation "French: Burn, 5.Nxe4 Nbd7 6.Nf3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Nbd7 6.Nf3 Be7 7.Nxf6+ Nxf6 *++[ECO "C11s"]+[Variation "French: Burn, 5.Nxe4 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 *++[ECO "C11t"]+[Variation "French: Burn, 6.Bxf6 Bxf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 Bxf6 *++[ECO "C11u"]+[Variation "French: Burn, 6.Bxf6 gxf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 *++[ECO "C11v"]+[Variation "French: Burn, 6.Bxf6 gxf6 7.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 7.Nf3 *++[ECO "C11w"]+[Variation "French: Burn, 6.Bxf6 gxf6 7.Nf3 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 7.Nf3 b6 *++[ECO "C11w"]+[Variation "French: Burn, 6.Bxf6 gxf6 7.Nf3 b6 8.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 7.Nf3 b6 8.Bd3 *++[ECO "C11w"]+[Variation "French: Burn, 6.Bxf6 gxf6 7.Nf3 b6 8.Bc4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 7.Nf3 b6 8.Bc4 *++[ECO "C11x"]+[Variation "French: Burn, 6.Bxf6 gxf6 7.Nf3 f5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 5.Nxe4 Be7 6.Bxf6 gxf6 7.Nf3 f5 *++[ECO "C12a"]+[Variation "French: MacCutcheon"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 *++[ECO "C12b"]+[Variation "French: MacCutcheon, 5.exd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.exd5 *++[ECO "C12c"]+[Variation "French: MacCutcheon, 5.exd5 Qxd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.exd5 Qxd5 *++[ECO "C12c"]+[Variation "French: MacCutcheon, Bogoljubow Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.exd5 Qxd5 6.Bxf6 gxf6 7.Qd2 Qa5 *++[ECO "C12d"]+[Variation "French: MacCutcheon, Advance Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 *++[ECO "C12d"]+[Variation "French: MacCutcheon, Advance Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 *++[ECO "C12e"]+[Variation "French: MacCutcheon, Chigorin Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.exf6 *++[ECO "C12e"]+[Variation "French: MacCutcheon, Grigoriev Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.exf6 hxg5 7.fxg7 Rg8 8.h4 gxh4 9.Qg4 *++[ECO "C12f"]+[Variation "French: MacCutcheon, Olland (Dutch) Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bc1 *++[ECO "C12g"]+[Variation "French: MacCutcheon, Bernstein Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bh4 *++[ECO "C12h"]+[Variation "French: MacCutcheon, Janowski Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Be3 *++[ECO "C12i"]+[Variation "French: MacCutcheon, 6.Bd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 *++[ECO "C12i"]+[Variation "French: MacCutcheon, Tartakower Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Nfd7 *++[ECO "C12j"]+[Variation "French: MacCutcheon, Lasker Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 *++[ECO "C12k"]+[Variation "French: MacCutcheon, Lasker, 7.bxc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 *++[ECO "C12l"]+[Variation "French: MacCutcheon, 8.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 *++[ECO "C12l"]+[Variation "French: MacCutcheon, 8.Qg4 Kf8"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 Kf8 *++[ECO "C12l"]+[Variation "French: MacCutcheon, Duras Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 Kf8 9.Bc1 *++[ECO "C12m"]+[Variation "French: MacCutcheon, 8.Qg4 Kf8 9.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 Kf8 9.Bd3 *++[ECO "C12n"]+[Variation "French: MacCutcheon, 8.Qg4 g6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 *++[ECO "C12o"]+[Variation "French: MacCutcheon, 8.Qg4 g6 9.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 9.Bd3 *++[ECO "C12p"]+[Variation "French: MacCutcheon, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 9.Bd3 Nxd2 10.Kxd2 c5 *++[ECO "C12q"]+[Variation "French: MacCutcheon, Main Line, 11.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 9.Bd3 Nxd2 10.Kxd2 c5 11.Nf3 *++[ECO "C12r"]+[Variation "French: MacCutcheon, Main Line, 11.Nf3 Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 9.Bd3 Nxd2 10.Kxd2 c5 11.Nf3 Nc6 *++[ECO "C13a"]+[Variation "French: Classical"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 *++[ECO "C13b"]+[Variation "French: Classical, Anderssen Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.Bxf6 *++[ECO "C13c"]+[Variation "French: Classical, Anderssen-Richter Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.Bxf6 Bxf6 6.e5 Be7 7.Qg4 *++[ECO "C13d"]+[Variation "French: Classical, 5.e5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 *++[ECO "C13d"]+[Variation "French: Classical, Nimzowitsch Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ng8 *++[ECO "C13e"]+[Variation "French: Classical, Frankfurt Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ng8 6.Be3 b6 *++[ECO "C13f"]+[Variation "French: Classical, Tartakower Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ne4 *++[ECO "C13g"]+[Variation "French: Classical, Tartakower, 6.Bxe7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ne4 6.Bxe7 *++[ECO "C13h"]+[Variation "French: Classical, 5.e5 Nfd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 *++[ECO "C13i"]+[Variation "French: Chatard-Alekhine Attack"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 *++[ECO "C13j"]+[Variation "French: Chatard-Alekhine, Teichmann Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 f6 *++[ECO "C13k"]+[Variation "French: Chatard-Alekhine, Spielmann Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 O-O *++[ECO "C13l"]+[Variation "French: Chatard-Alekhine, 6...Bxg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 Bxg5 *++[ECO "C13l"]+[Variation "French: Chatard-Alekhine, 6...Bxg5 7.hxg5 Qxg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 Bxg5 7.hxg5 Qxg5 *++[ECO "C13m"]+[Variation "French: Chatard-Alekhine, 6...Bxg5 7.hxg5 Qxg5 8.Nh3 Qe7 9.Nf4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 Bxg5 7.hxg5 Qxg5 8.Nh3 Qe7 9.Nf4 *++[ECO "C13n"]+[Variation "French: Chatard-Alekhine, Maroczy Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 a6 *++[ECO "C13o"]+[Variation "French: Chatard-Alekhine, Maroczy, 7.Qg4 Bxg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 a6 7.Qg4 Bxg5 *++[ECO "C13p"]+[Variation "French: Chatard-Alekhine, Breyer Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 c5 *++[ECO "C13q"]+[Variation "French: Chatard-Alekhine, Breyer, 7.Bxe7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 c5 7.Bxe7 *++[ECO "C13r"]+[Variation "French: Chatard-Alekhine, Breyer, 7.Bxe7 Kxe7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 c5 7.Bxe7 Kxe7 *++[ECO "C14a"]+[Variation "French: Classical, 6.Bxe7 Qxe7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 *++[ECO "C14b"]+[Variation "French: Classical, Pollock Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Qg4 *++[ECO "C14c"]+[Variation "French: Classical, Tarrasch Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Bd3 *++[ECO "C14d"]+[Variation "French: Classical, Alapin Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Nb5 *++[ECO "C14e"]+[Variation "French: Classical, Rubinstein Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Qd2 *++[ECO "C14f"]+[Variation "French: Classical, Steinitz Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 *++[ECO "C14g"]+[Variation "French: Classical, Steinitz, 7...a6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 a6 *++[ECO "C14h"]+[Variation "French: Classical, Steinitz, 7...a6 8.Nf3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 a6 8.Nf3 c5 *++[ECO "C14i"]+[Variation "French: Classical, Steinitz, 7...a6 8.Nf3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 a6 8.Nf3 c5 9.dxc5 *++[ECO "C14j"]+[Variation "French: Classical, Steinitz, 7...O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O *++[ECO "C14k"]+[Variation "French: Classical, Steinitz, 7...O-O 8.Nf3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 *++[ECO "C14l"]+[Variation "French: Classical, Steinitz, 8.Nf3 c5 9.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.dxc5 *++[ECO "C14m"]+[Variation "French: Classical, Steinitz, 9.Qd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.Qd2 *++[ECO "C14m"]+[Variation "French: Classical, Stahlberg Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.Qd2 Nc6 10.O-O-O c4 *++[ECO "C14n"]+[Variation "French: Classical, Steinitz, 9.Qd2 Nc6 10.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.Qd2 Nc6 10.dxc5 *++[ECO "C14o"]+[Variation "French: Classical, Steinitz, 9.Qd2 Nc6 10.dxc5 Qxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.Qd2 Nc6 10.dxc5 Qxc5 *++[ECO "C15a"]+[Variation "French: Winawer"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 *++[ECO "C15b"]+[Variation "French: Winawer, 4.exd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.exd5 *++[ECO "C15b"]+[Variation "French: Winawer, 4.exd5 Qxd5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.exd5 Qxd5 *++[ECO "C15c"]+[Variation "French: Winawer, 4.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Qg4 *++[ECO "C15d"]+[Variation "French: Winawer, 4.Qd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Qd3 *++[ECO "C15d"]+[Variation "French: Winawer, 4.Qd3 dxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Qd3 dxe4 *++[ECO "C15e"]+[Variation "French: Winawer, 4.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 *++[ECO "C15f"]+[Variation "French: Winawer, 4.Bd3 c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 c5 *++[ECO "C15f"]+[Variation "French: Winawer, Kondratiyev Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 c5 5.exd5 Qxd5 6.Bd2 *++[ECO "C15g"]+[Variation "French: Winawer, 4.Bd3 dxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 dxe4 *++[ECO "C15g"]+[Variation "French: Winawer, 4.Bd3 dxe4 5.Bxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 dxe4 5.Bxe4 *++[ECO "C15g"]+[Variation "French: Winawer, 4.Bd3 dxe4 5.Bxe4 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 dxe4 5.Bxe4 Nf6 *++[ECO "C15h"]+[Variation "French: Winawer, Mueller-Zhuravlev Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 *++[ECO "C15h"]+[Variation "French: Winawer, Mueller-Zhuravlev Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 dxe4 *++[ECO "C15i"]+[Variation "French: Winawer, Mueller-Zhuravlev Gambit, 5.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 dxe4 5.Qg4 *++[ECO "C15i"]+[Variation "French: Winawer, Mueller-Zhuravlev Gambit, Kunin Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 dxe4 5.Qg4 Qxd4 *++[ECO "C15j"]+[Variation "French: Winawer, Mueller-Zhuravlev Gambit, 5.Qg4 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 dxe4 5.Qg4 Nf6 *++[ECO "C15k"]+[Variation "French: Winawer, 4.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 *++[ECO "C15k"]+[Variation "French: Winawer, 4.a3 Bxc3+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ *++[ECO "C15k"]+[Variation "French: Winawer, 4.a3 Bxc3+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 *++[ECO "C15k"]+[Variation "French: Winawer, 4.a3 Bxc3+ 5.bxc3 dxe4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 *++[ECO "C15l"]+[Variation "French: Winawer, Winkelmann-Reimer Gambit (WRG)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 6.f3 *++[ECO "C15l"]+[Variation "French: Winawer, Winkelmann-Reimer Gambit Accepted"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 6.f3 exf3 *++[ECO "C15l"]+[Variation "French: Winawer, Winkelmann-Reimer, Huebner Defence"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 6.f3 e5 *++[ECO "C15l"]+[Variation "French: Winawer, Winkelmann-Reimer, 6...c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 6.f3 c5 *++[ECO "C15m"]+[Variation "French: Winawer, 4.a3 Bxc3+ 5.bxc3 dxe4 6.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 dxe4 6.Qg4 *++[ECO "C15n"]+[Variation "French: Winawer, Alekhine Gambit"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 *++[ECO "C15o"]+[Variation "French: Winawer, Alekhine Gambit, 4...Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 Nf6 *++[ECO "C15p"]+[Variation "French: Winawer, Alekhine Gambit, 4...Nc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 Nc6 *++[ECO "C15q"]+[Variation "French: Winawer, Alekhine Gambit Accepted"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 *++[ECO "C15q"]+[Variation "French: Winawer, Alekhine Gambit, 5.a3 Bxc3+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Bxc3+ *++[ECO "C15r"]+[Variation "French: Winawer, Alekhine Gambit, Kan Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Bxc3+ 6.Nxc3 Nc6 *++[ECO "C15s"]+[Variation "French: Winawer, Alekhine Gambit, Kan, 7.Bb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Bxc3+ 6.Nxc3 Nc6 7.Bb5 *++[ECO "C15t"]+[Variation "French: Winawer, Alekhine Gambit, 5.a3 Be7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Be7 *++[ECO "C15u"]+[Variation "French: Winawer, Alekhine Gambit, 5.a3 Be7 6.Nxe4 Nf6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Be7 6.Nxe4 Nf6 *++[ECO "C15u"]+[Variation "French: Winawer, Alekhine Gambit, Alatortsev Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Be7 6.Nxe4 Nf6 7.N2g3 O-O 8.Be2 Nc6 *++[ECO "C15v"]+[Variation "French: Winawer, Alekhine Gambit, 5.a3 Be7 6.Nxe4 Nf6 7.Qd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Ne2 dxe4 5.a3 Be7 6.Nxe4 Nf6 7.Qd3 *++[ECO "C16a"]+[Variation "French: Winawer, Advance Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 *++[ECO "C16b"]+[Variation "French: Winawer, 4.e5 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 b6 *++[ECO "C16c"]+[Variation "French: Winawer, 4.e5 b6 5.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 b6 5.Qg4 *++[ECO "C16d"]+[Variation "French: Winawer, 4.e5 b6 5.Qg4 Bf8 6.Bg5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 b6 5.Qg4 Bf8 6.Bg5 *++[ECO "C16e"]+[Variation "French: Winawer, 4.e5 b6 5.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 b6 5.a3 *++[ECO "C16e"]+[Variation "French: Winawer, 4.e5 b6 5.a3 Bf8"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 b6 5.a3 Bf8 *++[ECO "C16f"]+[Variation "French: Winawer, Petrosian Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 *++[ECO "C16g"]+[Variation "French: Winawer, Petrosian, 5.Bd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 5.Bd2 *++[ECO "C16h"]+[Variation "French: Winawer, Petrosian, 5.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 5.a3 *++[ECO "C16i"]+[Variation "French: Winawer, Petrosian, 5.a3 Bxc3+ 6.bxc3 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 5.a3 Bxc3+ 6.bxc3 b6 *++[ECO "C16i"]+[Variation "French: Winawer, Petrosian, 5.a3 Bxc3+ 6.bxc3 b6 7.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 5.a3 Bxc3+ 6.bxc3 b6 7.Qg4 *++[ECO "C16j"]+[Variation "French: Winawer, Advance, 4...Ne7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 *++[ECO "C16k"]+[Variation "French: Winawer, Advance, 4...Ne7 5.Bd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 5.Bd2 *++[ECO "C16l"]+[Variation "French: Winawer, Advance, 4...Ne7 5.Bd2 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 5.Bd2 b6 *++[ECO "C16m"]+[Variation "French: Winawer, Advance, 4...Ne7 5.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 5.a3 *++[ECO "C16n"]+[Variation "French: Winawer, Advance, 4...Ne7 5.a3 Bxc3+ 6.bxc3 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 5.a3 Bxc3+ 6.bxc3 b6 *++[ECO "C16o"]+[Variation "French: Winawer, Advance, 4...Ne7 5.a3 Bxc3+ 6.bxc3 b6 7.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Ne7 5.a3 Bxc3+ 6.bxc3 b6 7.Qg4 *++[ECO "C17a"]+[Variation "French: Winawer, Advance, 4...c5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 *++[ECO "C17b"]+[Variation "French: Winawer, Advance, 5.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.dxc5 *++[ECO "C17c"]+[Variation "French: Winawer, Russian Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Qg4 *++[ECO "C17d"]+[Variation "French: Winawer, Russian, 6.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Qg4 Ne7 6.dxc5 *++[ECO "C17e"]+[Variation "French: Winawer, Bogoljubow Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 *++[ECO "C17f"]+[Variation "French: Winawer, Bogoljubow, 5...cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 cxd4 *++[ECO "C17g"]+[Variation "French: Winawer, Bogoljubow, 5...Ne7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 Ne7 *++[ECO "C17h"]+[Variation "French: Winawer, Bogoljubow, 5...Ne7 6.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 Ne7 6.a3 *++[ECO "C17i"]+[Variation "French: Winawer, Bogoljubow, 5...Ne7 6.dxc5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 Ne7 6.dxc5 *++[ECO "C17j"]+[Variation "French: Winawer, Bogoljubow, 5...Ne7 6.Nb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 Ne7 6.Nb5 *++[ECO "C17k"]+[Variation "French: Winawer, 5.a3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 *++[ECO "C17l"]+[Variation "French: Winawer, 5.a3 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 cxd4 *++[ECO "C17l"]+[Variation "French: Winawer, Rauzer Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 cxd4 6.axb4 dxc3 7.Nf3 *++[ECO "C17m"]+[Variation "French: Winawer, Swiss Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 *++[ECO "C17n"]+[Variation "French: Winawer, Swiss, 6.b4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 *++[ECO "C17o"]+[Variation "French: Winawer, Swiss, 6.b4 cxd4 7.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 cxd4 7.Qg4 *++[ECO "C17p"]+[Variation "French: Winawer, Swiss, 6.b4 cxd4 7.Qg4 Ne7 8.bxa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 cxd4 7.Qg4 Ne7 8.bxa5 *++[ECO "C17q"]+[Variation "French: Winawer, Swiss, 6.b4 cxd4 7.Nb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 cxd4 7.Nb5 *++[ECO "C17r"]+[Variation "French: Winawer, Swiss, 6.b4 cxd4 7.Nb5 Bc7 8.f4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 cxd4 7.Nb5 Bc7 8.f4 *++[ECO "C17s"]+[Variation "French: Winawer, Swiss, 6.b4 cxd4 7.Nb5 Bc7 8.f4 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Ba5 6.b4 cxd4 7.Nb5 Bc7 8.f4 Bd7 *++[ECO "C18a"]+[Variation "French: Winawer, 5...Bxc3+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ *++[ECO "C18a"]+[Variation "French: Winawer, 5...Bxc3+ 6.bxc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 *++[ECO "C18b"]+[Variation "French: Winawer, 6...Qa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qa5 *++[ECO "C18c"]+[Variation "French: Winawer, 6...Qc7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 *++[ECO "C18d"]+[Variation "French: Winawer, 6...Qc7 7.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 7.Qg4 *++[ECO "C18d"]+[Variation "French: Winawer, 6...Qc7 7.Qg4 f6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 7.Qg4 f6 *++[ECO "C18e"]+[Variation "French: Winawer, 6...Qc7 7.Qg4 f5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 7.Qg4 f5 *++[ECO "C18f"]+[Variation "French: Winawer, 6...Ne7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 *++[ECO "C18g"]+[Variation "French: Winawer, 6...Ne7 7.h4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 *++[ECO "C18h"]+[Variation "French: Winawer, 6...Ne7 7.h4 Qc7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 Qc7 *++[ECO "C18h"]+[Variation "French: Winawer, 6...Ne7 7.h4 Qc7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 Qc7 8.Nf3 *++[ECO "C18i"]+[Variation "French: Winawer, 6...Ne7 7.h4 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 Nbc6 *++[ECO "C18i"]+[Variation "French: Winawer, 6...Ne7 7.h4 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 Nbc6 8.Nf3 *++[ECO "C18j"]+[Variation "French: Winawer, 6...Ne7 7.Qg4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 *++[ECO "C18k"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Nbc6 *++[ECO "C18l"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 Kf8"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Kf8 *++[ECO "C18m"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 cxd4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 cxd4 *++[ECO "C18n"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 O-O"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 O-O *++[ECO "C18o"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 O-O 8.Bd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 O-O 8.Bd3 *++[ECO "C18p"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 O-O 8.Bd3 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 O-O 8.Bd3 Nbc6 *++[ECO "C18q"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 O-O 8.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 O-O 8.Nf3 *++[ECO "C18q"]+[Variation "French: Winawer, 6...Ne7 7.Qg4 O-O 8.Nf3 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 O-O 8.Nf3 Nbc6 *++[ECO "C18r"]+[Variation "French: Winawer, Poisoned Pawn"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 *++[ECO "C18r"]+[Variation "French: Winawer, Poisoned Pawn, 8.Qxg7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 *++[ECO "C18r"]+[Variation "French: Winawer, Poisoned Pawn, 10.Qd3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Qd3 *++[ECO "C18s"]+[Variation "French: Winawer, Poisoned Pawn, Euwe-Gligoric Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Kd1 *++[ECO "C18t"]+[Variation "French: Winawer, Poisoned Pawn, Konstantinopolsky Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Ne2 *++[ECO "C18u"]+[Variation "French: Winawer, Poisoned Pawn, Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Ne2 Nbc6 11.f4 Bd7 12.Qd3 dxc3 *++[ECO "C18v"]+[Variation "French: Winawer, Poisoned Pawn, Main Line, 13.Nxc3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Ne2 Nbc6 11.f4 Bd7 12.Qd3 dxc3 13.Nxc3 *++[ECO "C19a"]+[Variation "French: Winawer, Smyslov Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.a4 *++[ECO "C19b"]+[Variation "French: Winawer, Smyslov, 7...Qa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.a4 Qa5 *++[ECO "C19c"]+[Variation "French: Winawer, 6...Ne7 7.Nf3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 *++[ECO "C19d"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Qc7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Qc7 *++[ECO "C19e"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Qc7 8.a4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Qc7 8.a4 *++[ECO "C19f"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Qc7 8.a4 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Qc7 8.a4 b6 *++[ECO "C19g"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Qa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Qa5 *++[ECO "C19h"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 b6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 b6 *++[ECO "C19h"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 b6 8.a4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 b6 8.a4 *++[ECO "C19i"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 b6 8.Bb5+"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 b6 8.Bb5+ *++[ECO "C19j"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Bd7 *++[ECO "C19k"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Bd7 8.a4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Bd7 8.a4 *++[ECO "C19l"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 *++[ECO "C19m"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 *++[ECO "C19m"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Bd7 *++[ECO "C19n"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 *++[ECO "C19n"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Qd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Qd2 *++[ECO "C19o"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Qd2 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Qd2 Bd7 *++[ECO "C19p"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5+ 9.Bd2"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Bd2 *++[ECO "C19q"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5+ 9.Bd2 Bd7"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Bd2 Bd7 *++[ECO "C19r"]+[Variation "French: Winawer, 6...Ne7 7.Nf3 Nbc6 8.a4 Qa5+ 9.Bd2 Bd7 10.Bb5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 Nbc6 8.a4 Qa5 9.Bd2 Bd7 10.Bb5 *++[ECO "C20"]+[Variation "Open Game"]+[Result "*"]+1.e4 e5 *++[ECO "C20"]+[Variation "Open Game: Mengarini Opening"]+[Result "*"]+1.e4 e5 2.a3 *++[ECO "C20"]+[Variation "Open Game: Patzer/Parnham Opening"]+[Result "*"]+1.e4 e5 2.Qh5 *++[ECO "C20"]+[Variation "Open Game: Napoleon's Opening"]+[Result "*"]+1.e4 e5 2.Qf3 *++[ECO "C20"]+[Variation "Open Game: 2.d3"]+[Result "*"]+1.e4 e5 2.d3 *++[ECO "C20"]+[Variation "Open Game: 2.d3 d5"]+[Result "*"]+1.e4 e5 2.d3 d5 *++[ECO "C20"]+[Variation "Open Game: 2.c4"]+[Result "*"]+1.e4 e5 2.c4 *++[ECO "C20"]+[Variation "Open Game: Lopez/Mcleod Opening"]+[Result "*"]+1.e4 e5 2.c3 *++[ECO "C20"]+[Variation "Open Game: Lopez/Mcleod, Lasa Gambit"]+[Result "*"]+1.e4 e5 2.c3 f5 *++[ECO "C20"]+[Variation "Open Game: Alapin Opening"]+[Result "*"]+1.e4 e5 2.Ne2 *++[ECO "C20"]+[Variation "Open Game: Alapin Opening"]+[Result "*"]+1.e4 e5 2.Ne2 Nf6 *++[ECO "C20"]+[Variation "Open Game: Portuguese Opening"]+[Result "*"]+1.e4 e5 2.Bb5 *++[ECO "C20"]+[Variation "Open Game: Portuguese, 2...Nf6"]+[Result "*"]+1.e4 e5 2.Bb5 Nf6 *++[ECO "C20"]+[Variation "Open Game: Portuguese Gambit"]+[Result "*"]+1.e4 e5 2.Bb5 Nf6 3.d4 *++[ECO "C20"]+[Variation "Open Game: Portuguese, 2...Nc6"]+[Result "*"]+1.e4 e5 2.Bb5 Nc6 *++[ECO "C20"]+[Variation "Open Game: Portuguese, 2...c6"]+[Result "*"]+1.e4 e5 2.Bb5 c6 *++[ECO "C21"]+[Variation "Centre Game"]+[Result "*"]+1.e4 e5 2.d4 *++[ECO "C21"]+[Variation "Centre Game: Maroczy Defence"]+[Result "*"]+1.e4 e5 2.d4 d6 *++[ECO "C21"]+[Variation "Centre Game: Maroczy Defence, 3.dxe5"]+[Result "*"]+1.e4 e5 2.d4 d6 3.dxe5 *++[ECO "C21"]+[Variation "Centre Game: Maroczy Defence, Philidor Gambit"]+[Result "*"]+1.e4 e5 2.d4 d6 3.dxe5 Bd7 *++[ECO "C21"]+[Variation "Centre Game: Queenswap line"]+[Result "*"]+1.e4 e5 2.d4 d6 3.dxe5 dxe5 4.Qxd8+ *++[ECO "C21"]+[Variation "Centre Game"]+[Result "*"]+1.e4 e5 2.d4 exd4 *++[ECO "C21"]+[Variation "Centre Game: 3.Nf3"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Nf3 *++[ECO "C21"]+[Variation "Centre Game: Kieseritsky Variation"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Nf3 c5 4.Bc4 b5 *++[ECO "C21"]+[Variation "Centre Game: Halasz Gambit"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.f4 *++[ECO "C21"]+[Variation "Danish Gambit"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 *++[ECO "C21"]+[Variation "Danish Gambit: Svenonius Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 Ne7 *++[ECO "C21"]+[Variation "Danish Gambit: Sorensen Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 d5 *++[ECO "C21"]+[Variation "Danish Gambit: Accepted"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 *++[ECO "C21"]+[Variation "Danish Gambit: Accepted, 4.Bc4"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 *++[ECO "C21"]+[Variation "Danish Gambit: Accepted, 4.Bc4 cxb2 5.Bxb2"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 *++[ECO "C21"]+[Variation "Danish Gambit: Copenhagen Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 Bb4+ *++[ECO "C21"]+[Variation "Danish Gambit: Chigorin Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 Qe7 *++[ECO "C21"]+[Variation "Danish Gambit: Classical Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 Nf6 *++[ECO "C21"]+[Variation "Danish Gambit: Schlechter Defence"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 d5 *++[ECO "C22"]+[Variation "Centre Game"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 *++[ECO "C22"]+[Variation "Centre Game"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 *++[ECO "C22"]+[Variation "Centre Game: Hall Variation"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qc4 *++[ECO "C22"]+[Variation "Centre Game: Paulsen Attack"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 *++[ECO "C22"]+[Variation "Centre Game: Charousek Variation"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Bb4+ 5.c3 Be7 *++[ECO "C22"]+[Variation "Centre Game: Berger Variation"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Nf6 *++[ECO "C22"]+[Variation "Centre Game: Kupreichik Variation"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Nf6 5.Nc3 Bb4 6.Bd2 O-O 7.O-O-O Re8 8.Bc4 d6 9.Nh3 *++[ECO "C23"]+[Variation "Bishop's Opening"]+[Result "*"]+1.e4 e5 2.Bc4 *++[ECO "C23"]+[Variation "Bishop's Opening: Anderssen Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 b5 *++[ECO "C23"]+[Variation "Bishop's Opening: Philidor Counterattack"]+[Result "*"]+1.e4 e5 2.Bc4 c6 *++[ECO "C23"]+[Variation "Bishop's Opening: Lisitsin Variation"]+[Result "*"]+1.e4 e5 2.Bc4 c6 3.d4 d5 4.exd5 cxd5 5.Bb5+ Bd7 6.Bxd7+ Nxd7 7.dxe5 Nxe5 8.Ne2 *++[ECO "C23"]+[Variation "Bishop's Opening: Calabrese Countergambit"]+[Result "*"]+1.e4 e5 2.Bc4 f5 *++[ECO "C23"]+[Variation "Bishop's Opening: Calabrese Countergambit, Jaenisch Variation"]+[Result "*"]+1.e4 e5 2.Bc4 f5 3.d3 *++[ECO "C23"]+[Variation "Bishop's Opening: Classical Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 *++[ECO "C23"]+[Variation "Bishop's Opening: 2...Bc5 3.Qe2"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.Qe2 *++[ECO "C23"]+[Variation "Bishop's Opening: Lopez Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.Qe2 Nc6 4.c3 Nf6 5.f4 *++[ECO "C23"]+[Variation "Bishop's Opening: Lewis Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.d4 *++[ECO "C23"]+[Variation "Bishop's Opening: MacDonnell Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 *++[ECO "C23"]+[Variation "Bishop's Opening: MacDonnell Double Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 Bxb4 4.f4 *++[ECO "C23"]+[Variation "Bishop's Opening: MacDonnell, Four Pawns Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 Bxb4 4.f4 exf4 5.Nf3 Be7 6.d4 Bh4+ 7.g3 fxg3 8.O-O gxh2+ 9.Kh1 *++[ECO "C23"]+[Variation "Bishop's Opening: Philidor Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 *++[ECO "C23"]+[Variation "Bishop's Opening: del Rio Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 Qg5 *++[ECO "C23"]+[Variation "Bishop's Opening: Lewis Countergambit"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 d5 *++[ECO "C23"]+[Variation "Bishop's Opening: Lewis Countergambit, Jaenisch"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 d5 4.Bxd5 Nf6 5.Qf3 *++[ECO "C23"]+[Variation "Bishop's Opening: 2...Bc5 3.c3 Nf6"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 Nf6 *++[ECO "C23"]+[Variation "Bishop's Opening: Pratt Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 Nf6 4.d4 exd4 5.e5 d5 6.exf6 dxc4 7.Qh5 O-O *++[ECO "C24"]+[Variation "Bishop's Opening: Berlin Defence"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 *++[ECO "C24"]+[Variation "Bishop's Opening: Greco Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.f4 *++[ECO "C24"]+[Variation "Bishop's Opening: 3.d3"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d3 *++[ECO "C24"]+[Variation "Bishop's Opening: 3.d3 d5"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d3 d5 *++[ECO "C24"]+[Variation "Bishop's Opening: Paulsen Defence"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d3 c6 *++[ECO "C24"]+[Variation "Bishop's Opening: Paulsen, 4.Nf3"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d3 c6 4.Nf3 *++[ECO "C24"]+[Variation "Bishop's Opening: 3.d4"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Panov Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 d5 5.exd5 Bb4+ 6.c3 Qe7+ *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Marshall Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Nc3 Nc6 7.Qh4 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, 6.Bg5 Nc6 Defence"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Nc6 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, 7...c6 Defence"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 c6 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Larsen Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 c6 8.O-O-O d5 9.Rhe1 O-O 10.Qh4 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Karpov Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 c6 8.O-O-O d5 9.Rhe1 Be6 10.Bd3 Nbd7 11.Qh4 c5 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Forintos/Haag Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 c6 8.O-O-O d5 9.Rhe1 Be6 10.Bd3 Nbd7 11.Qh4 Nc5 12. Nd4 Ng8 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, 7...Nc6 Defence"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 Nc6 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Keres Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 Nc6 8.Qh4 d6 *++[ECO "C24"]+[Variation "Bishop's Opening: Urusov Gambit, Estrin Variation"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 Nxe4 5.Qxd4 Nf6 6.Bg5 Be7 7.Nc3 Nc6 8.Qh4 d5 *++[ECO "C25a"]+[Variation "Vienna Game"]+[Result "*"]+1.e4 e5 2.Nc3 *++[ECO "C25b"]+[Variation "Vienna: 2...Bb4"]+[Result "*"]+1.e4 e5 2.Nc3 Bb4 *++[ECO "C25b"]+[Variation "Vienna: Zhuravlev"]+[Result "*"]+1.e4 e5 2.Nc3 Bb4 3.Qg4 *++[ECO "C25c"]+[Variation "Vienna: 2...d6"]+[Result "*"]+1.e4 e5 2.Nc3 d6 *++[ECO "C25c"]+[Variation "Vienna: 2...d6 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nc3 d6 3.Bc4 *++[ECO "C25d"]+[Variation "Vienna: 2...Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Bc5 *++[ECO "C25d"]+[Variation "Vienna: Hammpe-Meitner"]+[Result "*"]+1.e4 e5 2.Nc3 Bc5 3.Na4 *++[ECO "C25e"]+[Variation "Vienna: 2...Bc5 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nc3 Bc5 3.Bc4 *++[ECO "C25f"]+[Variation "Vienna: 2...Bc5 3.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Bc5 3.Nf3 *++[ECO "C25g"]+[Variation "Vienna: 2...Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 *++[ECO "C25g"]+[Variation "Vienna: Fyfe Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.d4 *++[ECO "C25h"]+[Variation "Vienna: Paulsen Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.g3 *++[ECO "C25i"]+[Variation "Vienna: Paulsen, 3...Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.g3 Bc5 *++[ECO "C25j"]+[Variation "Vienna: 2...Nc6 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.Bc4 *++[ECO "C25j"]+[Variation "Vienna: 2...Nc6 3.Bc4 Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.Bc4 Bc5 *++[ECO "C25k"]+[Variation "Vienna: 2...Nc6 3.Bc4 Bc5 4.d3"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.Bc4 Bc5 4.d3 *++[ECO "C25l"]+[Variation "Vienna: 2...Nc6 3.Bc4 Bc5 4.Qg4"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.Bc4 Bc5 4.Qg4 *++[ECO "C25m"]+[Variation "Vienna: 2...Nc6 3.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 *++[ECO "C25m"]+[Variation "Vienna: 2...Nc6 3.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 *++[ECO "C25n"]+[Variation "Vienna: Steinitz Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 *++[ECO "C25n"]+[Variation "Vienna: Steinitz Gambit, Fraser-Minckwitz Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 Qh4+ 5.Ke2 b6 *++[ECO "C25o"]+[Variation "Vienna: Steinitz Gambit, Zukertort Defence"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 Qh4+ 5.Ke2 d5 *++[ECO "C25p"]+[Variation "Vienna: 2...Nc6 3.f4 exf4 4.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 *++[ECO "C25p"]+[Variation "Vienna: 2...Nc6 3.f4 exf4 4.Nf3 g5"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 *++[ECO "C25p"]+[Variation "Vienna: Hamppe-Muzio Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.Bc4 g4 6.O-O *++[ECO "C25p"]+[Variation "Vienna: Hamppe-Muzio, Dubois Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.Bc4 g4 6.O-O gxf3 7.Qxf3 Ne5 8.Qxf4 Qf6 *++[ECO "C25q"]+[Variation "Vienna: Hamppe-Allgaier Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.h4 *++[ECO "C25q"]+[Variation "Vienna: Hamppe-Allgaier Gambit, Alapin Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.h4 g4 6.Ng5 d6 *++[ECO "C25r"]+[Variation "Vienna: Pierce Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.d4 *++[ECO "C25r"]+[Variation "Vienna: Pierce Gambit, Rushmere Attack"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.d4 g4 6.Bc4 gxf3 7.O-O d5 8.exd5 Bg4 9.dxc6 *++[ECO "C26a"]+[Variation "Vienna: 2...Nf6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 *++[ECO "C26a"]+[Variation "Vienna: Mengarini Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.a3 *++[ECO "C26b"]+[Variation "Vienna: 2...Nf6 3.d3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.d3 *++[ECO "C26c"]+[Variation "Vienna: Smyslov Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 *++[ECO "C26d"]+[Variation "Vienna: Smyslov, 3...Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Nc6 *++[ECO "C26d"]+[Variation "Vienna: Smyslov, 3...Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Nc6 4.Bg2 *++[ECO "C26e"]+[Variation "Vienna: Smyslov, 3...Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 *++[ECO "C26e"]+[Variation "Vienna: Smyslov, 3...Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 4.Bg2 *++[ECO "C26f"]+[Variation "Vienna: Smyslov, 3...Bc5 4.Bg2 d6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 4.Bg2 d6 *++[ECO "C26g"]+[Variation "Vienna: Smyslov, 3...Bc5 4.Bg2 O-O"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 4.Bg2 O-O *++[ECO "C26h"]+[Variation "Vienna: Smyslov, 3...Bc5 4.Bg2 Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 4.Bg2 Nc6 *++[ECO "C26h"]+[Variation "Vienna: Smyslov, 3...Bc5 4.Bg2 Nc6 5.Nge2"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 Bc5 4.Bg2 Nc6 5.Nge2 *++[ECO "C26i"]+[Variation "Vienna: Smyslov, 3...d5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 d5 *++[ECO "C26i"]+[Variation "Vienna: Smyslov, 3...d5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 d5 4.exd5 Nxd5 5.Bg2 *++[ECO "C26j"]+[Variation "Vienna: Smyslov, 3...d5, 5...Nxc3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 d5 4.exd5 Nxd5 5.Bg2 Nxc3 *++[ECO "C26k"]+[Variation "Vienna: Smyslov, 3...d5, 5...Nxc3 6.bxc3 Bd6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 d5 4.exd5 Nxd5 5.Bg2 Nxc3 6.bxc3 Bd6 *++[ECO "C26l"]+[Variation "Vienna: 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 *++[ECO "C26l"]+[Variation "Vienna: Horwitz Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 b5 *++[ECO "C26m"]+[Variation "Vienna: 3.Bc4 Bb4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bb4 *++[ECO "C26n"]+[Variation "Vienna: 3.Bc4 Bb4 4.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bb4 4.Nf3 *++[ECO "C26o"]+[Variation "Vienna: 3.Bc4 Bb4 4.Nf3 O-O"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bb4 4.Nf3 O-O *++[ECO "C26p"]+[Variation "Vienna: 3.Bc4 Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 *++[ECO "C26p"]+[Variation "Vienna: 3.Bc4 Bc5 4.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.f4 *++[ECO "C26q"]+[Variation "Vienna: 3.Bc4 Bc5 4.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.Nf3 *++[ECO "C26r"]+[Variation "Vienna: 3.Bc4 Bc5 4.d3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.d3 *++[ECO "C26s"]+[Variation "Vienna: 3.Bc4 Bc5 4.d3 d6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.d3 d6 *++[ECO "C26t"]+[Variation "Vienna: 3.Bc4 Bc5 4.d3 d6 5.Na4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.d3 d6 5.Na4 *++[ECO "C26u"]+[Variation "Vienna: 3.Bc4 Bc5 4.d3 d6 5.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.d3 d6 5.f4 *++[ECO "C27a"]+[Variation "Vienna: 3.Bc4 Nxe4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 *++[ECO "C27b"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Nxe4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Nxe4 *++[ECO "C27c"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 *++[ECO "C27d"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5 Nd6 5.Qxe5+"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Qxe5+ *++[ECO "C27e"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 *++[ECO "C27f"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Be7"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Be7 *++[ECO "C27g"]+[Variation "Vienna: Alekhine Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Be7 6.Nf3 Nc6 7.Nxe5 *++[ECO "C27h"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 *++[ECO "C27h"]+[Variation "Vienna: Adams' Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.d4 *++[ECO "C27h"]+[Variation "Vienna: 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.Nb5 *++[ECO "C27i"]+[Variation "Vienna: Frankenstein-Dracula Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.Nb5 g6 7.Qf3 f5 8.Qd5 Qe7 9.Nxc7+ Kd8 10.Nxa8 *++[ECO "C27j"]+[Variation "Vienna: Frankenstein-Dracula, 11.d3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.Nb5 g6 7.Qf3 f5 8.Qd5 Qe7 9.Nxc7+ Kd8 10.Nxa8 b6 11.d3 *++[ECO "C28a"]+[Variation "Vienna: 3.Bc4 Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 *++[ECO "C28b"]+[Variation "Vienna: 3.Bc4 Nc6 4.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.f4 *++[ECO "C28b"]+[Variation "Vienna: Bronstein Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.f4 Nxe4 5.Nf3 *++[ECO "C28c"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 *++[ECO "C28d"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Be7"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Be7 *++[ECO "C28e"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Na5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Na5 *++[ECO "C28f"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Na5 5.Nge2"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Na5 5.Nge2 *++[ECO "C28g"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 *++[ECO "C28h"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5 5.Bg5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 5.Bg5 *++[ECO "C28i"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5 5.f4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 5.f4 *++[ECO "C28j"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3 *++[ECO "C28k"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3 Bg4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3 Bg4 *++[ECO "C28l"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3 a6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bc5 5.f4 d6 6.Nf3 a6 *++[ECO "C28m"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bb4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bb4 *++[ECO "C28n"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bb4 5.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bb4 5.Nf3 *++[ECO "C28o"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bb4 5.Bg5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bb4 5.Bg5 *++[ECO "C28p"]+[Variation "Vienna: 3.Bc4 Nc6 4.d3 Bb4 5.Ne2"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 Bb4 5.Ne2 *++[ECO "C29a"]+[Variation "Vienna Gambit"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 *++[ECO "C29a"]+[Variation "Vienna Gambit: 3...exf4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 exf4 *++[ECO "C29b"]+[Variation "Vienna Gambit: 3...d6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d6 *++[ECO "C29b"]+[Variation "Vienna Gambit: 3...d6 4.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d6 4.Nf3 *++[ECO "C29c"]+[Variation "Vienna Gambit: 3...d5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 *++[ECO "C29d"]+[Variation "Vienna Gambit: 3...d5 4.exd5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.exd5 *++[ECO "C29d"]+[Variation "Vienna Gambit: 3...d5 4.exd5 exf4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.exd5 exf4 *++[ECO "C29e"]+[Variation "Vienna Gambit: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.d3 *++[ECO "C29f"]+[Variation "Vienna Gambit: 4.fxe5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 *++[ECO "C29f"]+[Variation "Vienna Gambit: 4.fxe5"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 *++[ECO "C29g"]+[Variation "Vienna Gambit: Oxford Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 *++[ECO "C29g"]+[Variation "Vienna Gambit: Wurzburger Trap"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Qh4+ 6.g3 Nxg3 7.Nf3 Qh5 8.Nxd5 *++[ECO "C29h"]+[Variation "Vienna Gambit: Oxford, 5...Bb4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Bb4 *++[ECO "C29h"]+[Variation "Vienna Gambit: Oxford, 5...Bb4 6.dxe4 Qh4+ 7.Ke2"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Bb4 6.dxe4 Qh4+ 7.Ke2 *++[ECO "C29i"]+[Variation "Vienna Gambit: Oxford, 5...Nxc3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Nxc3 *++[ECO "C29j"]+[Variation "Vienna Gambit: Oxford, 5...Nxc3 6.bxc3 d4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Nxc3 6.bxc3 d4 *++[ECO "C29k"]+[Variation "Vienna Gambit: Paulsen Attack"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 *++[ECO "C29k"]+[Variation "Vienna Gambit: Paulsen Attack, 5...Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 Nc6 *++[ECO "C29l"]+[Variation "Vienna Gambit: Paulsen Attack, Bardeleben Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 f5 *++[ECO "C29l"]+[Variation "Vienna Gambit: Paulsen Attack, Heyde Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 f5 6.d4 *++[ECO "C29m"]+[Variation "Vienna Gambit: Paulsen Attack, 5...Nxc3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 Nxc3 *++[ECO "C29n"]+[Variation "Vienna Gambit: 5.Nf3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 *++[ECO "C29o"]+[Variation "Vienna Gambit: 5.Nf3 Bg4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Bg4 *++[ECO "C29o"]+[Variation "Vienna Gambit: Kaufmann Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Bg4 6.Qe2 *++[ECO "C29p"]+[Variation "Vienna Gambit: 5.Nf3 Bb4"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Bb4 *++[ECO "C29q"]+[Variation "Vienna Gambit: 5.Nf3 Nc6"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Nc6 *++[ECO "C29r"]+[Variation "Vienna Gambit: Breyer Variation"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Be7 *++[ECO "C29s"]+[Variation "Vienna Gambit: Breyer, 6.Qe2"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Be7 6.Qe2 *++[ECO "C29t"]+[Variation "Vienna Gambit: Breyer, 6.Qe2 Nxc3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Be7 6.Qe2 Nxc3 *++[ECO "C29t"]+[Variation "Vienna Gambit: Breyer, 6.Qe2 Nxc3 7.dxc3"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Be7 6.Qe2 Nxc3 7.dxc3 *++[ECO "C30a"]+[Variation "King's Gambit"]+[Result "*"]+1.e4 e5 2.f4 *++[ECO "C30b"]+[Variation "King's Gambit: Mafia Defence"]+[Result "*"]+1.e4 e5 2.f4 c5 *++[ECO "C30c"]+[Variation "King's Gambit: 2...d6"]+[Result "*"]+1.e4 e5 2.f4 d6 *++[ECO "C30c"]+[Variation "King's Gambit: 2...d6 3.Nf3"]+[Result "*"]+1.e4 e5 2.f4 d6 3.Nf3 *++[ECO "C30c"]+[Variation "King's Gambit: 2...d6 3.Nf3 Nc6"]+[Result "*"]+1.e4 e5 2.f4 d6 3.Nf3 Nc6 *++[ECO "C30d"]+[Variation "King's Gambit: Wade Variation"]+[Result "*"]+1.e4 e5 2.f4 Nf6 *++[ECO "C30e"]+[Variation "King's Gambit: Norwald Variation"]+[Result "*"]+1.e4 e5 2.f4 Qf6 *++[ECO "C30e"]+[Variation "King's Gambit: Norwald Variation, Schubert line"]+[Result "*"]+1.e4 e5 2.f4 Qf6 3.Nc3 Qxf4 4.d4 *++[ECO "C30e"]+[Variation "King's Gambit: Norwald Variation, Buecker Gambit"]+[Result "*"]+1.e4 e5 2.f4 Qf6 3.Nf3 Qxf4 4.Nc3 Bb4 5.Bc4 *++[ECO "C30f"]+[Variation "King's Gambit: Keene Defence"]+[Result "*"]+1.e4 e5 2.f4 Qh4+ *++[ECO "C30f"]+[Variation "King's Gambit: Keene Defence, 3.g3 Qe7"]+[Result "*"]+1.e4 e5 2.f4 Qh4+ 3.g3 Qe7 *++[ECO "C30g"]+[Variation "King's Gambit: 2...Nc6"]+[Result "*"]+1.e4 e5 2.f4 Nc6 *++[ECO "C30h"]+[Variation "King's Gambit: Adelaide-Wahls Variation"]+[Result "*"]+1.e4 e5 2.f4 Nc6 3.Nf3 f5 *++[ECO "C30i"]+[Variation "King's Gambit: Adelaide-Wahls, 4.exf5"]+[Result "*"]+1.e4 e5 2.f4 Nc6 3.Nf3 f5 4.exf5 *++[ECO "C30i"]+[Variation "King's Gambit: Adelaide-Wahls, 4.exf5 e4"]+[Result "*"]+1.e4 e5 2.f4 Nc6 3.Nf3 f5 4.exf5 e4 *++[ECO "C30i"]+[Variation "King's Gambit: Adelaide-Wahls, 4.exf5 e4 5.Ne5 Nf6"]+[Result "*"]+1.e4 e5 2.f4 Nc6 3.Nf3 f5 4.exf5 e4 5.Ne5 Nf6 *++[ECO "C30j"]+[Variation "King's Gambit: Classical KGD"]+[Result "*"]+1.e4 e5 2.f4 Bc5 *++[ECO "C30j"]+[Variation "KGD: Classical, 3.Bc4"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Bc4 *++[ECO "C30j"]+[Variation "KGD: Classical, 3.Nf3"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 *++[ECO "C30j"]+[Variation "KGD: Classical, Senechaud Countergambit"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 g5 *++[ECO "C30k"]+[Variation "KGD: Classical, 3.Nf3 d6"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 *++[ECO "C30k"]+[Variation "KGD: Classical, Heath Variation"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.b4 *++[ECO "C30k"]+[Variation "KGD: Classical, Soldatenkov Variation"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.fxe5 *++[ECO "C30l"]+[Variation "KGD: Classical, 3.Nf3 d6 4.Nc3"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 *++[ECO "C30l"]+[Variation "KGD: Classical, Hanham Variation"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 Nd7 *++[ECO "C30m"]+[Variation "KGD: Classical, 3.Nf3 d6 4.Nc3 Nf6 5.Bc4"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 Nf6 5.Bc4 *++[ECO "C30m"]+[Variation "KGD: Classical, Svenonius Variation"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 Nf6 5.Bc4 Nc6 6.d3 Bg4 7.h3 Bxf3 8.Qxf3 exf4 *++[ECO "C30n"]+[Variation "KGD: Classical, 4.c3"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 *++[ECO "C30n"]+[Variation "KGD: Classical, Marshall Attack"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Bg4 5.fxe5 dxe5 6.Qa4+ *++[ECO "C30o"]+[Variation "KGD: Classical, 4.c3 Bb6"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Bb6 *++[ECO "C30p"]+[Variation "KGD: Classical, 4.c3 Nf6"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Nf6 *++[ECO "C30q"]+[Variation "KGD: Classical, 4.c3 Nf6 5.d4"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Nf6 5.d4 *++[ECO "C30q"]+[Variation "KGD: Classical, 4.c3 Nf6 5.d4"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Nf6 5.d4 Bb6 *++[ECO "C30q"]+[Variation "KGD: Classical, 4.c3 Nf6 5.d4"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb6 *++[ECO "C30r"]+[Variation "KGD: Classical Countergambit"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 f5 *++[ECO "C30r"]+[Variation "KGD: Classical, Reti Variation"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 f5 5.fxe5 dxe5 6.d4 exd4 7.Bc4 *++[ECO "C31"]+[Variation "KGD: Falkbeer Countergambit"]+[Result "*"]+1.e4 e5 2.f4 d5 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Tartakower Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.Nf3 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Milner-Barry Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.Nc3 *++[ECO "C31"]+[Variation "KGD: Falkbeer, 3.exd5"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 *++[ECO "C31"]+[Variation "KGD: Falkbeer, 3.exd5 exf4"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 exf4 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Marshall/Nimzowitsch Countergambit"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 c6 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Marshall/Nimzowitsch, 4.dxc6"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 c6 4.dxc6 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Marshall/Nimzowitsch, 4.Qe2"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 c6 4.Qe2 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Marshall/Nimzowitsch, 4.Nc3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 c6 4.Nc3 *++[ECO "C31"]+[Variation "KGD: Falkbeer, 3.exd5 e4"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Rubinstein Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.Nc3 Nf6 5.Qe2 *++[ECO "C31"]+[Variation "KGD: Falkbeer, Nimzowitsch Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.Bb5+ *++[ECO "C31"]+[Variation "KGD: Falkbeer, 4.d3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 4.d3 Nf6"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Keres Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nd2 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Keres, 5...exd3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nd2 exd3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Reti Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Qe2 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 4.d3 Nf6 5.Nc3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nc3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 4.d3 Nf6 5.Nc3 Bb4"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nc3 Bb4 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Morphy Gambit"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nc3 Bb4 6.Bd2 e3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 5.dxe4"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Charousek Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Qe2 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 5.dxe4 Nxe4 6.Be3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Be3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 5.dxe4 Nxe4 6.Nf3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 *++[ECO "C32"]+[Variation "KGD: Falkbeer, 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Alapin Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf2+ 8.Kd1 Qxd5+ 9.Nfd2 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Main Line, 7...Bf5"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf5 *++[ECO "C32"]+[Variation "KGD: Falkbeer, Tarrasch Variation"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf5 8.g4 O-O *++[ECO "C32"]+[Variation "KGD: Falkbeer, Main Line, 7...Bf5 8.Nc3"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf5 8.Nc3 *++[ECO "C33"]+[Variation "King's Gambit Accepted (KGA)"]+[Result "*"]+1.e4 e5 2.f4 exf4 *++[ECO "C33"]+[Variation "KGA: Tumbleweed/Drunken King"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Kf2 *++[ECO "C33"]+[Variation "KGA: Orsini Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.b3 *++[ECO "C33"]+[Variation "KGA: Stamma (Leonardo) Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.h4 *++[ECO "C33"]+[Variation "KGA: Schurig Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bd3 *++[ECO "C33"]+[Variation "KGA: Basman Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Qe2 *++[ECO "C33"]+[Variation "KGA: Carrera Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Qh5 *++[ECO "C33"]+[Variation "KGA: Eisenberg Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nh3 *++[ECO "C33"]+[Variation "KGA: Eisenberg Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Ne2 *++[ECO "C33"]+[Variation "KGA: Villemson Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.d4 *++[ECO "C33"]+[Variation "KGA: Keres Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nc3 *++[ECO "C33"]+[Variation "KGA: Breyer Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Qf3 *++[ECO "C33"]+[Variation "KGA: Lesser Bishop's (Tartakower) Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Be2 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Chigorin Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 d5 5.Bxd5 g5 6.g3 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Greco Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 Bc5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Classical Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Grimm Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 d6 7.e5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Classical Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 Ne7 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, McDonnell Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 Ne7 7.g3 *++[ECO "C33"]+[Variation "KGA: bishop's Gambit, McDonnell Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.g3 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Fraser Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.g3 fxg3 7.Qf3 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Classical Defence, Cozio Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Qf3 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Boden Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 Nc6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bryan Countergambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 b5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bryan Countergambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 b5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Steinitz Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Ne7 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Maurian Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nc6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Ruy Lopez Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 c6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Lopez-Gianutio Countergambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 f5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Lopez-Gianutio Countergambit, Hein Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 f5 4.Qe2 Qh4+ 5.Kd1 fxe4 6.Nc3 Kd8 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bledow Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bledow, 4.exd5"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.exd5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bledow, 4.Bxd5"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Boren-Svenonius Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 Qh4+ 5.Kf1 Bd6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Anderssen Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 c6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Morphy Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 Nf6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Cozio Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Bogoljubow Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Paulsen Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 Bb4 5.e5 *++[ECO "C33"]+[Variation "KGA: Bishop's Gambit, Jaenisch Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 c6 *++[ECO "C34"]+[Variation "KGA: King's Knight Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 *++[ECO "C34"]+[Variation "KGA: Bonsch-Osmolovsky Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Ne7 *++[ECO "C34"]+[Variation "KGA: Gianutio Countergambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 f5 *++[ECO "C34"]+[Variation "KGA: Becker Defence (Anti-Kieseritzky)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 h6 *++[ECO "C34"]+[Variation "KGA: Schallop Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Nf6 *++[ECO "C34"]+[Variation "KGA: Fischer Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d6 *++[ECO "C34"]+[Variation "KGA: Fischer, 4.Bc4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d6 4.Bc4 *++[ECO "C34"]+[Variation "KGA: Fischer, 4.d4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d6 4.d4 *++[ECO "C34"]+[Variation "KGA: Fischer, Main Line"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d6 4.d4 g5 5.h4 g4 6.Ng1 *++[ECO "C35"]+[Variation "KGA: Cunningham Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 *++[ECO "C35"]+[Variation "KGA: Cunningham, Bertin Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Bh4+ 5.g3 *++[ECO "C35"]+[Variation "KGA: Cunningham, Three Pawns Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Bh4+ 5.g3 fxg3 6.O-O gxh2+ 7.Kh1 *++[ECO "C35"]+[Variation "KGA: Cunningham, Euwe Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Nf6 *++[ECO "C36"]+[Variation "KGA: Scandinavian (Abbazia) Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 *++[ECO "C36"]+[Variation "KGA: Scandinavian, 4.exd5"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 *++[ECO "C36"]+[Variation "KGA: Scandinavian, 4.exd5 Bd6"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Bd6 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Bc4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bc4 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Nc3"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Nc3 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Bb5+ "]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Bb5+ c6"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ c6 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Bb5+ c6 6.dxc6 Nxc6"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ c6 6.dxc6 Nxc6 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Modern, 5.Bb5+ c6 6.dxc6 bxc6"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ c6 6.dxc6 bxc6 *++[ECO "C36"]+[Variation "KGA: Scandinavian, Botvinnik Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ c6 6.dxc6 bxc6 7.Bc4 Nd5 *++[ECO "C37"]+[Variation "KGA: 3.Nf3 g5"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 *++[ECO "C37"]+[Variation "KGA: Quaade Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Nc3 *++[ECO "C37"]+[Variation "KGA: Rosentreter Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.d4 *++[ECO "C37"]+[Variation "KGA: Sorensen Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.d4 g4 5.Ne5 *++[ECO "C37"]+[Variation "KGA: 3.Nf3 g5 4.Bc4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 *++[ECO "C37"]+[Variation "KGA: Blachly Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Nc6 *++[ECO "C37"]+[Variation "KGA: 3.Nf3 g5 4.Bc4 g4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 *++[ECO "C37"]+[Variation "KGA: Lolli Gambit (Wild Muzio)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Bxf7+ *++[ECO "C37"]+[Variation "KGA: Lolli Gambit, Young Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Bxf7+ Kxf7 6.O-O gxf3 7.Qxf3 Qf6 8.d4 Qxd4+ 9.Be3 Qf6 10.Nc3 *++[ECO "C37"]+[Variation "KGA: Ghulam-Kassim Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.d4 *++[ECO "C37"]+[Variation "KGA: MacDonnell Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Nc3 *++[ECO "C37"]+[Variation "KGA: Salvio Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 *++[ECO "C37"]+[Variation "KGA: Salvio, Silberschmidt Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nh6 7.d4 f3 *++[ECO "C37"]+[Variation "KGA: Salvio, Anderssen Counterattack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nh6 7.d4 d6 *++[ECO "C37"]+[Variation "KGA: Salvio, Cochrane Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 f3 *++[ECO "C37"]+[Variation "KGA: Salvio, Herzfeld Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nc6 *++[ECO "C37"]+[Variation "KGA: Muzio Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O *++[ECO "C37"]+[Variation "KGA: Muzio Gambit, Paulsen Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qf6 7.e5 Qxe5 8.d3 Bh6 9.Nc3 Ne7 10.Bd2 Nbc6 11.Rae1 *++[ECO "C37"]+[Variation "KGA: Double Muzio Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qf6 7.e5 Qxe5 8.Bxf7+ *++[ECO "C37"]+[Variation "KGA: Muzio Gambit, From Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qe7 *++[ECO "C37"]+[Variation "KGA: Muzio Gambit, Holloway Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Nc6 *++[ECO "C37"]+[Variation "KGA: Muzio Gambit, Kling and Horwitz Counterattack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O Qe7 *++[ECO "C37"]+[Variation "KGA: Muzio Gambit, Brentano Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O d5 *++[ECO "C38"]+[Variation "KGA: 3.Nf3 g5 4.Bc4 Bg7"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 *++[ECO "C38"]+[Variation "KGA: Hanstein Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.d4 *++[ECO "C38"]+[Variation "KGA: Hanstein Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.O-O h6 6.d4 d6 *++[ECO "C38"]+[Variation "KGA: Philidor Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 *++[ECO "C38"]+[Variation "KGA: Greco Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 h6 6.d4 d6 7.Nc3 c6 8.hxg5 hxg5 9.Rxh8 Bxh8 10.Ne5 *++[ECO "C38"]+[Variation "KGA: Philidor Gambit, Schultz Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 h6 6.d4 d6 7.Qd3 *++[ECO "C39"]+[Variation "KGA: 3.Nf3 g5 4.h4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 *++[ECO "C39"]+[Variation "KGA: Allgaier Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 *++[ECO "C39"]+[Variation "KGA: Allgaier, Horny Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Qxg4 Nf6 8.Qxf4 Bd6 *++[ECO "C39"]+[Variation "KGA: Allgaier, Thorold Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.d4 *++[ECO "C39"]+[Variation "KGA: Allgaier, Cook Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.d4 d5 8.Bxf4 dxe4 9.Bc4+ Kg7 10.Be5+ *++[ECO "C39"]+[Variation "KGA: Allgaier, Blackburne Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Nc3 *++[ECO "C39"]+[Variation "KGA: Allgaier, Walker Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Bc4+ *++[ECO "C39"]+[Variation "KGA: Allgaier, Urusov Attack"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Bc4+ d5 8.Bxd5+ Kg7 9.d4 *++[ECO "C39"]+[Variation "KGA: Allgaier, Schlechter Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 Nf6 *++[ECO "C39"]+[Variation "KGA: Kieseritsky"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Green Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d6 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Paulsen Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Bg7 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Long Whip Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 h5 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Long Whip Defence, Jaenisch Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 h5 6.Bc4 Rh7 7.d4 Bh6 8.Nc3 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Brentano (Campbell) Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Brentano Defence, Kaplanek Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.exd5 Qxd5 8.Nc3 Bb4 9.Kf2 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Brentano Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.Bxf4 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Brentano Defence, Caro Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.Bxf4 Nxe4 8.Nd2 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Salvio (Rosenthal) Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Qe7 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Salvio Defence, Cozio Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Qe7 6.d4 f5 7.Bc4 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Polerio Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Be7 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Neumann Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nc6 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Berlin Defence"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Berlin Defence, Riviere Variation"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Nxg4 d5 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Berlin Defence, 6.Bc4"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Bc4 *++[ECO "C39"]+[Variation "KGA: Kieseritsky, Rice Gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Bc4 d5 7.exd5 Bd6 8.O-O *++[ECO "C40a"]+[Variation "Open Game"]+[Result "*"]+1.e4 e5 2.Nf3 *++[ECO "C40a"]+[Variation "Open Game: Damiano Defence"]+[Result "*"]+1.e4 e5 2.Nf3 f6 *++[ECO "C40b"]+[Variation "Open Game: Greco Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Qf6 *++[ECO "C40c"]+[Variation "Open Game: Gunderam Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Qe7 *++[ECO "C40d"]+[Variation "Open Game: Gunderam Defence, 3.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Qe7 3.Nc3 *++[ECO "C40e"]+[Variation "Elephant Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 d5 *++[ECO "C40f"]+[Variation "Elephant Gambit: 3.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.Nxe5 *++[ECO "C40f"]+[Variation "Elephant Gambit: 3.Nxe5 dxe4 4.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.Nxe5 dxe4 4.Bc4 *++[ECO "C40g"]+[Variation "Elephant Gambit: 3.exd5"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.exd5 *++[ECO "C40h"]+[Variation "Elephant Gambit: Maroczy"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.exd5 Bd6 *++[ECO "C40i"]+[Variation "Elephant Gambit: Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.exd5 e4 *++[ECO "C40j"]+[Variation "Latvian Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 f5 *++[ECO "C40k"]+[Variation "Latvian Gambit: 3.d3"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.d3 *++[ECO "C40l"]+[Variation "Latvian Gambit: 3.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nc3 *++[ECO "C40m"]+[Variation "Latvian Gambit: 3.d4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.d4 *++[ECO "C40m"]+[Variation "Latvian Gambit: 3.d4 fxe4 5.Nxe5 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.d4 fxe4 5.Nxe5 Nf6 *	; Move-number error ?++[ECO "C40n"]+[Variation "Latvian Gambit: 3.exf5"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.exf5 *++[ECO "C40n"]+[Variation "Latvian Gambit: 3.exf5 e4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.exf5 e4 *++[ECO "C40o"]+[Variation "Latvian Gambit: 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 *++[ECO "C40o"]+[Variation "Latvian Gambit: Strautins Variation"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 b5 *++[ECO "C40o"]+[Variation "Latvian Gambit: Morgado Variation"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 Nf6 *++[ECO "C40p"]+[Variation "Latvian Gambit: 3.Bc4 fxe4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 *++[ECO "C40p"]+[Variation "Latvian: Blackburne Variation (Corkscrew Countergambit)"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 Nf6 *++[ECO "C40p"]+[Variation "Latvian Gambit: Svedenborg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 d5 *++[ECO "C40p"]+[Variation "Latvian Gambit: Svedenborg, 6.Nxg6 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 d5 5.Qh5+ g6 6.Nxg6 Nf6 *++[ECO "C40p"]+[Variation "Latvian Gambit: Svedenborg, 6.Nxg6 hxg6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 d5 5.Qh5+ g6 6.Nxg6 hxg6 *++[ECO "C40q"]+[Variation "Latvian Gambit: Poisoned Pawn Variation"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 Qg5 *++[ECO "C40q"]+[Variation "Latvian Gambit: Poisoned Pawn, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 Qg5 5.d4 Qxg2 6.Qh5+ g6 7.Bf7+ Kd8 *++[ECO "C40r"]+[Variation "Latvian Gambit: 3.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 *++[ECO "C40s"]+[Variation "Latvian Gambit: 3.Nxe5 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Nc6 *++[ECO "C40t"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 *++[ECO "C40t"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.Nc4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.Nc4 *++[ECO "C40u"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 *++[ECO "C40u"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4 d6"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 *++[ECO "C40u"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4 d6 5.Nc4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 *++[ECO "C40u"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 *++[ECO "C40v"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Be2"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Be2 *++[ECO "C40w"]+[Variation "Latvian Gambit: Nimzowitsch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Ne3 *++[ECO "C40x"]+[Variation "Latvian Gambit: 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Nc3 *++[ECO "C41a"]+[Variation "Philidor Defence"]+[Result "*"]+1.e4 e5 2.Nf3 d6 *++[ECO "C41b"]+[Variation "Philidor: 3.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 *++[ECO "C41b"]+[Variation "Philidor: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 Be7 4.c3 *++[ECO "C41b"]+[Variation "Philidor: Lopez Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 f5 *++[ECO "C41b"]+[Variation "Philidor: Lopez Countergambit, Jaenisch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 f5 4.d4 exd4 5.Ng5 Nh6 6.Nxh7 *++[ECO "C41c"]+[Variation "Philidor: 3.d4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 *++[ECO "C41d"]+[Variation "Philidor: Philidor Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 *++[ECO "C41d"]+[Variation "Philidor: Philidor Countergambit, Zukertort Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.Nc3 *++[ECO "C41e"]+[Variation "Philidor: Philidor Countergambit, 4.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 *++[ECO "C41e"]+[Variation "Philidor: Philidor Countergambit, Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 fxe4 5.Ng5 d5 6.Nc3 *++[ECO "C41e"]+[Variation "Philidor: Philidor Countergambit, del Rio Attack"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 fxe4 5.Ng5 d5 6.e6 *++[ECO "C41e"]+[Variation "Philidor: Philidor Countergambit, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 fxe4 5.Ng5 d5 6.e6 Bc5 7.Nc3 *++[ECO "C41f"]+[Variation "Philidor: Hanham Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 *++[ECO "C41f"]+[Variation "Philidor: Hanham, 4.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 *++[ECO "C41g"]+[Variation "Philidor: Hanham, 4.Bc4 c6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 *++[ECO "C41g"]+[Variation "Philidor: Hanham, Krause Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.O-O *++[ECO "C41g"]+[Variation "Philidor: Hanham, Steiner Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.O-O Be7 6.dxe5 *++[ECO "C41g"]+[Variation "Philidor: Hanham, Kmoch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Ng5 *++[ECO "C41g"]+[Variation "Philidor: Hanham, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Ng5 Nh6 6.f4 Be7 7.O-O O-O 8.c3 d5 *++[ECO "C41g"]+[Variation "Philidor: Hanham, Schlechter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Nc3 *++[ECO "C41g"]+[Variation "Philidor: Hanham, Delmar Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.c3 *++[ECO "C41h"]+[Variation "Philidor: 3...exd4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 *++[ECO "C41h"]+[Variation "Philidor: Bird Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.c3 *++[ECO "C41i"]+[Variation "Philidor: Morphy Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Qxd4 *++[ECO "C41i"]+[Variation "Philidor: Morphy, 4...Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Qxd4 Nc6 *++[ECO "C41i"]+[Variation "Philidor: Morphy, 4...Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Qxd4 Nf6 *++[ECO "C41i"]+[Variation "Philidor: Morphy, 4...Nf6 5.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Qxd4 Nf6 5.Nc3 *++[ECO "C41j"]+[Variation "Philidor: 3...exd4 4.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 *++[ECO "C41j"]+[Variation "Philidor: Paulsen Attack"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 d5 5.exd5 *++[ECO "C41k"]+[Variation "Philidor: 3...exd4 4.Nxd4 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 *++[ECO "C41k"]+[Variation "Philidor: 3...exd4 4.Nxd4 Nf6 5.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 *++[ECO "C41k"]+[Variation "Philidor: 3...exd4 4.Nxd4 Nf6 5.Nc3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 Be7 *++[ECO "C41l"]+[Variation "Philidor: 3...exd4 4.Nxd4 Nf6 5.Nc3 Be7 6.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 Be7 6.Bc4 *++[ECO "C41m"]+[Variation "Philidor: Antoshin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 Be7 6.Be2 *++[ECO "C41m"]+[Variation "Philidor: Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 Be7 6.Be2 O-O 7.O-O c5 8.Nf3 Nc6 9.Bg5 Be6 10.Re1 *++[ECO "C41n"]+[Variation "Philidor: Larsen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 g6 *++[ECO "C41o"]+[Variation "Philidor: Nimzowitsch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 *++[ECO "C41o"]+[Variation "Philidor: Nimzowitsch, Klein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Bc4 *++[ECO "C41o"]+[Variation "Philidor: Nimzowitsch, Locock Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Ng5 *++[ECO "C41p"]+[Variation "Philidor: Exchange Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 *++[ECO "C41p"]+[Variation "Philidor: Exchange, Sokolsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 Nxe4 5.Nbd2 *++[ECO "C41p"]+[Variation "Philidor: Exchange, Rellstab Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 Nxe4 5.Qd5 *++[ECO "C41q"]+[Variation "Philidor: Nimzowitsch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 *++[ECO "C41r"]+[Variation "Philidor: Improved Hanham"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 5.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 5.Bc4 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 6.Bxf7+"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.Bxf7+ *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 6.Ng5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.Ng5 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, Larobok Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.Ng5 O-O 7.Bxf7+ *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 6.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.dxe5 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 6.dxe5 Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.dxe5 Nxe5 *++[ECO "C41s"]+[Variation "Philidor: Improved Hanham, 6.dxe5 dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.dxe5 dxe5 *++[ECO "C41t"]+[Variation "Philidor: Improved Hanham 6.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O *++[ECO "C41u"]+[Variation "Philidor: Improved Hanham, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O *++[ECO "C41v"]+[Variation "Philidor: Improved Hanham, 7.a4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.a4 *++[ECO "C41v"]+[Variation "Philidor: Improved Hanham, 7.a4 c6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.a4 c6 *++[ECO "C41w"]+[Variation "Philidor: Improved Hanham, 7.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Qe2 *++[ECO "C41w"]+[Variation "Philidor: Improved Hanham, 7.Qe2 c6 8.a4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.a4 c6 8.Qe2 *++[ECO "C41w"]+[Variation "Philidor: Improved Hanham, Sozin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Qe2 c6 8.a4 exd4 *++[ECO "C41x"]+[Variation "Philidor: Improved Hanham, 7.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Re1 *++[ECO "C41x"]+[Variation "Philidor: Improved Hanham, 7.Re1 c6 8.a4"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Re1 c6 8.a4 *++[ECO "C41y"]+[Variation "Philidor: Improved Hanham, 7.Re1 c6 8.a4 a5"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Re1 c6 8.a4 a5 *++[ECO "C41z"]+[Variation "Philidor: Improved Hanham, 7.Re1 c6 8.a4 b6"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Re1 c6 8.a4 b6 *++[ECO "C42a"]+[Variation "Russian Game (Petroff Defence)"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 *++[ECO "C42b"]+[Variation "Russian Game: 3.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d3 *++[ECO "C42c"]+[Variation "Russian-Three Knights Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nc3 *++[ECO "C42c"]+[Variation "Russian-Three Knights Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nc3 Bb4 *++[ECO "C42d"]+[Variation "Russian-Three Knights Game, 4.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nc3 Bb4 4.Nxe5 *++[ECO "C42e"]+[Variation "Russian Game: Italian Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 *++[ECO "C42f"]+[Variation "Russian Game: Boden-Kieseritsky Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 Nxe4 4.Nc3 *++[ECO "C42f"]+[Variation "Russian Game: Boden-Kieseritsky Gambit Accepted"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 Nxe4 4.Nc3 Nxc3 *++[ECO "C42g"]+[Variation "Russian Game: 3.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 *++[ECO "C42g"]+[Variation "Russian Game: Damiano Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 Nxe4 *++[ECO "C42g"]+[Variation "Russian Game: 3.Nxe5 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 *++[ECO "C42h"]+[Variation "Russian Game: Cochrane Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nxf7 *++[ECO "C42h"]+[Variation "Russian Game: Cochrane Gambit, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nxf7 Kxf7 5.d4 *++[ECO "C42i"]+[Variation "Russian Game: Paulsen Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nc4 *++[ECO "C42j"]+[Variation "Russian Game: 3.Nxe5 d6 4.Nf3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 *++[ECO "C42k"]+[Variation "Russian Game: French Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d3 *++[ECO "C42l"]+[Variation "Russian Game: Vienna/Kaufmann"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.c4 *++[ECO "C42m"]+[Variation "Russian Game: Nimzowitsch Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Nc3 *++[ECO "C42n"]+[Variation "Russian Game: Cozio/Lasker"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Qe2 *++[ECO "C42n"]+[Variation "Russian Game: Milner-Barry Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Qe2 Qe7 6.d3 Nf6 7.Bg5 Nbd7 *++[ECO "C42o"]+[Variation "Russian Game: 5.Qe2, Queenswap"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Qe2 Qe7 6.d3 Nf6 7.Bg5 Qxe2+ *++[ECO "C42p"]+[Variation "Russian Game: Classical"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 *++[ECO "C42p"]+[Variation "Russian Game: Classical, Close Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 Nf6 *++[ECO "C42p"]+[Variation "Russian Game: Classical, 5...d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 *++[ECO "C42q"]+[Variation "Russian Game: Classical, 6.Bd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 *++[ECO "C42q"]+[Variation "Russian Game: Classical, Marshall Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 *++[ECO "C42q"]+[Variation "Russian Game: Classical, Tarrasch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 7.O-O O-O 8.c4 Bg4 *++[ECO "C42q"]+[Variation "Russian Game: Classical, Marshall Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 7.O-O O-O 8.c4 Bg4 9.cxd5 f5 10.Re1 Bxh2+ *++[ECO "C42r"]+[Variation "Russian Game: Classical, Marshall, 8.c4 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 7.O-O O-O 8.c4 c6 *++[ECO "C42s"]+[Variation "Russian Game: Classical, 6.Bd3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 *++[ECO "C42s"]+[Variation "Russian Game: Classical, Mason Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O O-O *++[ECO "C42s"]+[Variation "Russian Game: Classical, 6.Bd3 Be7 7.O-O Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 *++[ECO "C42t"]+[Variation "Russian Game: Classical, Jaenisch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.c4 *++[ECO "C42u"]+[Variation "Russian Game: Classical, Jaenisch, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.c4 Nb4 9.Be2 O-O *++[ECO "C42v"]+[Variation "Russian Game: Classical, Chigorin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 *++[ECO "C42v"]+[Variation "Russian Game: Classical, Chigorin, 8...Bf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bf5 *++[ECO "C42w"]+[Variation "Russian Game: Classical, Chigorin, 8...Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 *++[ECO "C42w"]+[Variation "Russian Game: Classical, Chigorin, 8...Bg4 9.c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c4 *++[ECO "C42x"]+[Variation "Russian Game: Classical, Chigorin, 8...Bg4 9.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 *++[ECO "C42x"]+[Variation "Russian Game: Classical, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.Nbd2 *++[ECO "C42x"]+[Variation "Russian Game: Classical, Krause Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.c4 *++[ECO "C42x"]+[Variation "Russian Game: Classical, Maroczy Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.c4 Bh4 *++[ECO "C43a"]+[Variation "Russian Game: Modern (Steinitz) Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 *++[ECO "C43b"]+[Variation "Russian Game: Modern Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 *++[ECO "C43c"]+[Variation "Russian Game: Modern Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 *++[ECO "C43c"]+[Variation "Russian Game: Modern Attack, Tal Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Bb5 *++[ECO "C43c"]+[Variation "Russian Game: Modern Attack, Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qe2 *++[ECO "C43c"]+[Variation "Russian Game: Modern Attack, Bardeleben Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qe2 Nc5 6.Nxd4 Nc6 *++[ECO "C43d"]+[Variation "Russian Game: Modern Attack, 3...exd4, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qxd4 *++[ECO "C43e"]+[Variation "Russian Game: Modern Attack, 3...exd4, Main Line, 7.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qxd4 d5 6.exd6 Nxd6 7.Nc3 *++[ECO "C43e"]+[Variation "Russian Game: Modern Attack, Pillsbury Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qxd4 d5 6.exd6 Nxd6 7.Nc3 Nc6 8.Qf4 Bf5 *++[ECO "C43f"]+[Variation "Russian Game: Modern Attack, 3...Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 *++[ECO "C43g"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 *++[ECO "C43g"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 Nc6 *++[ECO "C43g"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 Nc6 5.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 Nc6 5.d5 *++[ECO "C43h"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 Nc6 5.Bxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 Nc6 5.Bxe4 *++[ECO "C43i"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 *++[ECO "C43i"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.dxe5 *++[ECO "C43j"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 *++[ECO "C43k"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nc6 *++[ECO "C43l"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Be7 *++[ECO "C43m"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Bd6 *++[ECO "C43n"]+[Variation "Russian Game: Modern Attack, Trifunovic Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Bd6 6.O-O O-O 7.c4 Bxe5 *++[ECO "C43o"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Nd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 *++[ECO "C43p"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Qe2 *++[ECO "C43q"]+[Variation "Russian Game: Modern Attack, 3...Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 *++[ECO "C43r"]+[Variation "Russian Game: Modern Attack, 3...Nxe4, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.O-O *++[ECO "C43s"]+[Variation "Russian Game: Modern Attack, 3...Nxe4, Main Line, 7...Qh4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.O-O Qh4 *++[ECO "C43t"]+[Variation "Russian Game: Modern Attack, 3...Nxe4, Main Line, 7...Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.O-O Bd6 *++[ECO "C43u"]+[Variation "Russian Game: Modern Attack, 3...Nxe4, Main Line, 7...Bd6 8.c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.O-O Bd6 8.c4 *++[ECO "C44a"]+[Variation "Open Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 *++[ECO "C44a"]+[Variation "Open Game: Irish (Chicago) Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nxe5 *++[ECO "C44a"]+[Variation "Open Game: Paschman Wing Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.b4 *++[ECO "C44a"]+[Variation "Open Game: Dresden Opening"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c4 *++[ECO "C44b"]+[Variation "Open Game: Konstantinopolsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.g3 *++[ECO "C44c"]+[Variation "Open Game: Inverted Hungarian"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 *++[ECO "C44c"]+[Variation "Open Game: Tayler Opening"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 Nf6 4.d4 *++[ECO "C44d"]+[Variation "Open Game: Inverted Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d3 *++[ECO "C44d"]+[Variation "Open Game: Inverted Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d3 d5 *++[ECO "C44e"]+[Variation "Open Game: Inverted Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d3 Nf6 *++[ECO "C44f"]+[Variation "Open Game: Inverted Philidor, 4.g3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d3 Nf6 4.g3 *++[ECO "C44g"]+[Variation "Open Game: Inverted Philidor, 4.Be2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d3 Nf6 4.Be2 *++[ECO "C44h"]+[Variation "Open Game: Inverted Hanham"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 Nf6 4.d3 d5 5.Nbd2 *++[ECO "C44i"]+[Variation "Ponziani Opening"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 *++[ECO "C44i"]+[Variation "Ponziani: Reti Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nge7 *++[ECO "C44i"]+[Variation "Ponziani: Romanishin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Be7 *++[ECO "C44j"]+[Variation "Ponziani Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 *++[ECO "C44j"]+[Variation "Ponziani Countergambit, Schmidt Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 4.d4 d6 5.d5 *++[ECO "C44j"]+[Variation "Ponziani Countergambit, Cordel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 4.d4 d6 5.d5 fxe4 6.Ng5 Nb8 7.Nxe4 Nf6 8.Bd3 Be7 *++[ECO "C44k"]+[Variation "Ponziani: 3...d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 *++[ECO "C44l"]+[Variation "Ponziani: 3...d5 4.Qa4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 *++[ECO "C44l"]+[Variation "Ponziani: Caro Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 Bd7 *++[ECO "C44l"]+[Variation "Ponziani: Leonhardt Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 Nf6 *++[ECO "C44m"]+[Variation "Ponziani: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 f6 *++[ECO "C44n"]+[Variation "Ponziani: 3...Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 *++[ECO "C44n"]+[Variation "Ponziani: 3...Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 *++[ECO "C44o"]+[Variation "Ponziani: 3...Nf6 4.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 exd4 *++[ECO "C44p"]+[Variation "Ponziani: 3...Nf6 4.d4 Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 Nxe4 *++[ECO "C44p"]+[Variation "Ponziani: Fraser Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 Nxe4 5.d5 Bc5 *++[ECO "C44q"]+[Variation "Ponziani: 3...Nf6 4.d4 Nxe4 5.d5 Ne7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 Nxe4 5.d5 Ne7 *++[ECO "C44r"]+[Variation "Scotch Opening"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 *++[ECO "C44r"]+[Variation "Scotch: Lolli Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 Nxd4 *++[ECO "C44r"]+[Variation "Scotch: Cochrane Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 Nxd4 4.Nxe5 Ne6 5.Bc4 c6 6.O-O Nf6 7.Nxf7 *++[ECO "C44s"]+[Variation "Scotch: 3...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 d6 *++[ECO "C44t"]+[Variation "Scotch: 3...exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 *++[ECO "C44t"]+[Variation "Scotch: Relfsson Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bb5 *++[ECO "C44t"]+[Variation "Scotch: Goring Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 *++[ECO "C44u"]+[Variation "Scotch: Goring Gambit, 4...d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 d5 *++[ECO "C44v"]+[Variation "Scotch: Goring Gambit, 4...d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 d3 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Bc4 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Bc4 cxb2 6.Bxb2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Bc4 cxb2 6.Bxb2 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Nxc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Nxc3 Bb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, Bardeleben Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 6.Bc4 Nf6 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Nxc3 Bb4 6.Bc4 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 6.Bc4 d6 *++[ECO "C44w"]+[Variation "Scotch: Goring Gambit, 4...dxc3 5.Nxc3 Bb4 6.Bc4 d6 7.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 6.Bc4 d6 7.O-O *++[ECO "C44x"]+[Variation "Scotch Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 *++[ECO "C44x"]+[Variation "Scotch Gambit: London Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bb4+ *++[ECO "C44y"]+[Variation "Scotch Gambit: 4...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 *++[ECO "C44y"]+[Variation "Scotch Gambit: 5.Ng5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.Ng5 *++[ECO "C44y"]+[Variation "Scotch Gambit: Vitzhum Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.Ng5 Nh6 6.Qh5 *++[ECO "C44y"]+[Variation "Scotch Gambit: 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.O-O *++[ECO "C44y"]+[Variation "Scotch Gambit: Anderssen (Paulsen) Counterattack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.O-O d6 6.c3 Bg4 *++[ECO "C44z"]+[Variation "Scotch Gambit: 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.c3 *++[ECO "C44z"]+[Variation "Scotch Gambit: 5.c3 d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.c3 d3 *++[ECO "C45a"]+[Variation "Scotch: 4.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 *++[ECO "C45b"]+[Variation "Scotch: 4.Nxd4 Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nxd4 *++[ECO "C45b"]+[Variation "Scotch: Ghulam Kassim Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nxd4 5.Qxd4 d6 6.Bd3 *++[ECO "C45c"]+[Variation "Scotch: 4.Nxd4 Bb4+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bb4+ *++[ECO "C45d"]+[Variation "Scotch: 4.Nxd4 Qf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qf6 *++[ECO "C45e"]+[Variation "Scotch: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 *++[ECO "C45e"]+[Variation "Scotch: Steinitz, 5.Qd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Qd3 *++[ECO "C45e"]+[Variation "Scotch: Steinitz, Fraser Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nf3 *++[ECO "C45f"]+[Variation "Scotch: Steinitz, 5.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nc3 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5 Qxe4+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Qxe4+ *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bc5 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5 Bc5 6.Qf3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bc5 6.Qf3 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5 Bb4+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ *++[ECO "C45g"]+[Variation "Scotch: Steinitz, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Nd2 Qxe4+ 7.Be2 Qxg2 8.Bf3 Qh3 9.Nxc7+ Kd8 10.Nxa8 Nf6 11.a3 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, 5.Nb5 Bb4+ 6.Bd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Bd2 *++[ECO "C45g"]+[Variation "Scotch: Steinitz, Rosenthal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Bd2 Qxe4+ 7.Be2 Kd8 8.O-O Bxd2 9.Nxd2 Qg6 *++[ECO "C45h"]+[Variation "Scotch: 4.Nxd4 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 *++[ECO "C45h"]+[Variation "Scotch: 4.Nxd4 Nf6 5.Nxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 *++[ECO "C45h"]+[Variation "Scotch: Tartakower Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.Nd2 *++[ECO "C45i"]+[Variation "Scotch: 4.Nxd4 Nf6 5.Nxc6 bxc6 6.Bd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.Bd3 *++[ECO "C45j"]+[Variation "Scotch: Mieses Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 *++[ECO "C45j"]+[Variation "Scotch: Mieses, 6...Qe7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 Qe7 *++[ECO "C45j"]+[Variation "Scotch: Mieses, 6...Qe7 7.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 Qe7 7.Qe2 *++[ECO "C45k"]+[Variation "Scotch: Mieses, 8.c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 Qe7 7.Qe2 Nd5 8.c4 *++[ECO "C45l"]+[Variation "Scotch: Mieses, 8.c4 Ba6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 Qe7 7.Qe2 Nd5 8.c4 Ba6 *++[ECO "C45m"]+[Variation "Scotch: Mieses, 8.c4 Ba6 9.b3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 Qe7 7.Qe2 Nd5 8.c4 Ba6 9.b3 *++[ECO "C45n"]+[Variation "Scotch: 4.Nxd4 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 *++[ECO "C45o"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 *++[ECO "C45o"]+[Variation "Scotch: Romanishin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb4+ *++[ECO "C45p"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3 Bb6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 *++[ECO "C45p"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 *++[ECO "C45q"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 *++[ECO "C45q"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 7.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 7.Nc3 *++[ECO "C45q"]+[Variation "Scotch: Geller Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 7.Nc3 Nf6 *++[ECO "C45q"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 7.Nc3 Qf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb6 6.a4 a6 7.Nc3 Qf6 *++[ECO "C45r"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nxc6 *++[ECO "C45s"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nxc6 Qf6 6.Qd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nxc6 Qf6 6.Qd2 *++[ECO "C45t"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Nxc6 Qf6 6.Qd2 dxc6 7.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nxc6 Qf6 6.Qd2 dxc6 7.Nc3 *++[ECO "C45u"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 *++[ECO "C45v"]+[Variation "Scotch: Blumenfeld Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.Nb5 *++[ECO "C45v"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Be3 Qf6 6.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 *++[ECO "C45w"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 *++[ECO "C45w"]+[Variation "Scotch: Blackburne Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Qd2 *++[ECO "C45w"]+[Variation "Scotch: Meitner Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Nc2 *++[ECO "C45w"]+[Variation "Scotch: Paulsen Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bb5 *++[ECO "C45w"]+[Variation "Scotch: Paulsen, Gunsberg Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bb5 Nd8 *++[ECO "C45x"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bc4 *++[ECO "C45y"]+[Variation "Scotch: 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bc4 Ne5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bc4 Ne5 *++[ECO "C46a"]+[Variation "Three Knights Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 *++[ECO "C46b"]+[Variation "Three Knights: Winawer Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 f5 *++[ECO "C46c"]+[Variation "Three Knights: 3...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 d6 *++[ECO "C46d"]+[Variation "Three Knights: 3...d6 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 d6 4.d4 *++[ECO "C46e"]+[Variation "Three Knights: 3...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bc5 *++[ECO "C46e"]+[Variation "Three Knights: 3...Bc5 4.Bb5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bc5 4.Bb5 *++[ECO "C46f"]+[Variation "Three Knights: 3...Bc5 4.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bc5 4.Nxe5 *++[ECO "C46g"]+[Variation "Three Knights: 3...Bb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bb4 *++[ECO "C46h"]+[Variation "Three Knights: 3...Bb4 4.Nd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bb4 4.Nd5 *++[ECO "C46h"]+[Variation "Three Knights: Schlechter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bb4 4.Nd5 Nf6 *++[ECO "C46i"]+[Variation "Three Knights: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 *++[ECO "C46j"]+[Variation "Three Knights: Steinitz, 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 *++[ECO "C46k"]+[Variation "Three Knights: Steinitz, Rosenthal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nd5 *++[ECO "C46l"]+[Variation "Three Knights: Steinitz, 4.d4 exd4 5.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nxd4 *++[ECO "C46l"]+[Variation "Three Knights: Steinitz, 4.d4 exd4 5.Nxd4 Bg7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nxd4 Bg7 *++[ECO "C46l"]+[Variation "Three Knights: Steinitz, 4.d4 exd4 5.Nxd4 Bg7 6.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nxd4 Bg7 6.Be3 *++[ECO "C46m"]+[Variation "Three Knights: Steinitz, 4.d4 exd4 5.Nxd4 Bg7 6.Be3 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nxd4 Bg7 6.Be3 Nf6 *++[ECO "C47a"]+[Variation "Four Knights Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 *++[ECO "C47a"]+[Variation "Four Knights: Halloween Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Nxe5 *++[ECO "C47b"]+[Variation "Four Knights: Gunsberg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.a3 *++[ECO "C47c"]+[Variation "Four Knights: Van der Wiel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Be2 *++[ECO "C47d"]+[Variation "Four Knights: Italian Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bc4 *++[ECO "C47e"]+[Variation "Four Knights: Glek Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 *++[ECO "C47f"]+[Variation "Four Knights: Glek, 4...d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 d5 *++[ECO "C47g"]+[Variation "Four Knights: Glek, 4...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 Bc5 *++[ECO "C47g"]+[Variation "Four Knights: Glek, 4...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 Bc5 5.Bg2 *++[ECO "C47h"]+[Variation "Four Knights: Glek, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 Bc5 5.Bg2 d6 6.d3 a6 *++[ECO "C47i"]+[Variation "Four Knights: Scotch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 *++[ECO "C47i"]+[Variation "Four Knights: Scotch, 4...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 d6 *++[ECO "C47j"]+[Variation "Four Knights: Scotch, Bogoljubow"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 Bb4 *++[ECO "C47j"]+[Variation "Four Knights: Scotch, Bogoljubow, 5.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 Bb4 5.d5 *++[ECO "C47k"]+[Variation "Four Knights: Scotch, Krause Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 Bb4 5.Nxe5 *++[ECO "C47l"]+[Variation "Four Knights: Scotch, 4...exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 *++[ECO "C47l"]+[Variation "Four Knights: Belgrade Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 *++[ECO "C47l"]+[Variation "Four Knights: Belgrade Gambit, 5...Nb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Nb4 *++[ECO "C47l"]+[Variation "Four Knights: Belgrade Gambit, 5...Nxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Nxd5 *++[ECO "C47m"]+[Variation "Four Knights: Belgrade Gambit, 5...Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Nxe4 *++[ECO "C47m"]+[Variation "Four Knights: Belgrade Gambit, 5...Nxe4 6.Qe2 (Old Line)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Nxe4 6.Qe2 *++[ECO "C47m"]+[Variation "Four Knights: Belgrade Gambit, 5...Nxe4 6.Bc4 (Modern Line)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Nxe4 6.Bc4 *++[ECO "C47n"]+[Variation "Four Knights: Belgrade Gambit, 5...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 Be7 *++[ECO "C47o"]+[Variation "Four Knights: Scotch, 4...exd4 5.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 *++[ECO "C47p"]+[Variation "Four Knights: Scotch, 4...exd4 5.Nxd4 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 d6 *++[ECO "C47q"]+[Variation "Four Knights: Scotch, 4...exd4 5.Nxd4 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bc5 *++[ECO "C47r"]+[Variation "Four Knights: Scotch, 4...exd4 5.Nxd4 Bb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 *++[ECO "C47s"]+[Variation "Four Knights: Scotch, 4...exd4 5.Nxd4 Bb4 6.Nxc6 bxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 *++[ECO "C47s"]+[Variation "Four Knights: Scotch, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 *++[ECO "C47t"]+[Variation "Four Knights: Scotch, Main Line, 7...d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 *++[ECO "C47t"]+[Variation "Four Knights: Scotch, Main Line, 7...d5 8.exd5 cxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 *++[ECO "C47u"]+[Variation "Four Knights: Scotch, Main Line, 8.exd5 cxd5 9.O-O O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 9.O-O O-O *++[ECO "C47v"]+[Variation "Four Knights: Scotch, Main Line, 9.O-O O-O 10.Bg5 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 9.O-O O-O 10.Bg5 c6 *++[ECO "C47w"]+[Variation "Four Knights: Scotch, Main Line, 10.Bg5 c6 11.Na4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 9.O-O O-O 10.Bg5 c6 11.Na4 *++[ECO "C47x"]+[Variation "Four Knights: Scotch, Main Line, 10.Bg5 c6 11.Qf3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 9.O-O O-O 10.Bg5 c6 11.Qf3 *++[ECO "C47y"]+[Variation "Four Knights: Scotch, Main Line, 10.Bg5 c6 11.Qf3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Nxc6 bxc6 7.Bd3 d5 8.exd5 cxd5 9.O-O O-O 10.Bg5 c6 11.Qf3 Be7 *++[ECO "C48a"]+[Variation "Four Knights: Spanish Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 *++[ECO "C48a"]+[Variation "Four Knights: Spanish, Ranken Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 a6 5.Bxc6 *++[ECO "C48a"]+[Variation "Four Knights: Spanish, Spielmann Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 a6 5.Bxc6 dxc6 6.Nxe5 Nxe4 7.Nxe4 Qd4 8.O-O Qxe5 9.Re1 Be6 10.d4 Qd5 *++[ECO "C48b"]+[Variation "Four Knights: Spanish, 4...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 d6 *++[ECO "C48c"]+[Variation "Four Knights: Spanish, 4...d6 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 d6 5.d4 *++[ECO "C48d"]+[Variation "Four Knights: Spanish, Classical Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 *++[ECO "C48e"]+[Variation "Four Knights: Spanish, Classical Defence, 5.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.Nxe5 *++[ECO "C48f"]+[Variation "Four Knights: Spanish, Classical Defence, 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.O-O *++[ECO "C48f"]+[Variation "Four Knights: Spanish, Classical, Bardeleben Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.O-O O-O 6.Nxe5 Nxe5 7.d4 Bd6 8.f4 Nc6 9.e5 Bb4 *++[ECO "C48f"]+[Variation "Four Knights: Spanish, Classical, Marshall Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.O-O O-O 6.Nxe5 Nd4 *++[ECO "C48g"]+[Variation "Four Knights: Rubinstein Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 *++[ECO "C48g"]+[Variation "Four Knights: Rubinstein, 5.Be2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Be2 *++[ECO "C48h"]+[Variation "Four Knights: Rubinstein, 5.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxe5 *++[ECO "C48h"]+[Variation "Four Knights: Rubinstein, Bogoljubow Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxe5 Qe7 6.f4 *++[ECO "C48i"]+[Variation "Four Knights: Rubinstein, Henneberger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.O-O *++[ECO "C48j"]+[Variation "Four Knights: Rubinstein, 5.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Bc4 *++[ECO "C48k"]+[Variation "Four Knights: Rubinstein, Exchange Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxd4 *++[ECO "C48k"]+[Variation "Four Knights: Rubinstein, Exchange Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxd4 exd4 6.e5 dxc3 7.exf6 *++[ECO "C48l"]+[Variation "Four Knights: Rubinstein, Exchange Variation, 8...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxd4 exd4 6.e5 dxc3 7.exf6 Qxf6 8.dxc3 Bc5 *++[ECO "C48m"]+[Variation "Four Knights: Rubinstein, Exchange Variation, 8...Qe5+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxd4 exd4 6.e5 dxc3 7.exf6 Qxf6 8.dxc3 Qe5+ *++[ECO "C48n"]+[Variation "Four Knights: Rubinstein, 5.Ba4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 *++[ECO "C48n"]+[Variation "Four Knights: Rubinstein, 5.Ba4 Nxf3+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 Nxf3+ *++[ECO "C48o"]+[Variation "Four Knights: Rubinstein, 5.Ba4 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 c6 *++[ECO "C48p"]+[Variation "Four Knights: Rubinstein, 5.Ba4 c6 6.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 c6 6.Nxe5 *++[ECO "C48q"]+[Variation "Four Knights: Rubinstein, 5.Ba4 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 Bc5 *++[ECO "C48r"]+[Variation "Four Knights: Rubinstein, 5.Ba4 Bc5 6.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Ba4 Bc5 6.Nxe5 *++[ECO "C49a"]+[Variation "Four Knights: 4.Bb5 Bb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 *++[ECO "C49b"]+[Variation "Four Knights: 4.Bb5 Bb4 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O *++[ECO "C49c"]+[Variation "Four Knights: 4.Bb5 Bb4 5.O-O O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O *++[ECO "C49c"]+[Variation "Four Knights: Gunsberg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.Nd5 Nxd5 7.exd5 e4 *++[ECO "C49d"]+[Variation "Four Knights: Nimzowitsch (Paulsen) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.Bxc6 *++[ECO "C49e"]+[Variation "Four Knights: Double Bishops, 6.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 *++[ECO "C49f"]+[Variation "Four Knights: Double Bishops, 6.d3 Bxc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 *++[ECO "C49f"]+[Variation "Four Knights: Janowski Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 7.bxc3 d6 8.Re1 *++[ECO "C49f"]+[Variation "Four Knights: Svenonius Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 7.bxc3 d5 *++[ECO "C49g"]+[Variation "Four Knights: Symmetrical Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 *++[ECO "C49h"]+[Variation "Four Knights: Symmetrical, Maroczy System"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Ne2 *++[ECO "C49i"]+[Variation "Four Knights: Symmetrical, 7.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 *++[ECO "C49j"]+[Variation "Four Knights: Symmetrical, Tarrasch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Be6 *++[ECO "C49k"]+[Variation "Four Knights: Symmetrical, Pillsbury Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Ne7 *++[ECO "C49k"]+[Variation "Four Knights: Symmetrical, Blake Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Ne7 8.Nh4 c6 9.Bc4 d5 10.Bb3 Qd6 *++[ECO "C49l"]+[Variation "Four Knights: Symmetrical, 7.Bg5 Bxc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 *++[ECO "C49l"]+[Variation "Four Knights: Symmetrical, 7.Bg5 Bxc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 *++[ECO "C49m"]+[Variation "Four Knights: Symmetrical, 7.Bg5 Bxc3 8.bxc3 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 h6 *++[ECO "C49n"]+[Variation "Four Knights: Symmetrical, Metger unpin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 *++[ECO "C49n"]+[Variation "Four Knights: Symmetrical, Metger, 10.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 *++[ECO "C49o"]+[Variation "Four Knights: Symmetrical, Metger, Capablanca Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 Bg4 *++[ECO "C49p"]+[Variation "Four Knights: Symmetrical, Metger, 10.d4 Ne6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 Ne6 *++[ECO "C49q"]+[Variation "Four Knights: Symmetrical, Metger, 10.d4 Ne6 11.Bc1 Rd8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 Ne6 11.Bc1 Rd8 *++[ECO "C49r"]+[Variation "Four Knights: Symmetrical, Metger, 10.d4 Ne6 11.Bc1 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 Ne6 11.Bc1 c5 *++[ECO "C50a"]+[Variation "Italian Game"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 *++[ECO "C50b"]+[Variation "Italian: Rousseau Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 f5 *++[ECO "C50c"]+[Variation "Italian: Blackburne-Shilling Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nd4 *++[ECO "C50d"]+[Variation "Italian: 3...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 d6 *++[ECO "C50e"]+[Variation "Italian: Hungarian Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 *++[ECO "C50f"]+[Variation "Italian: Hungarian Defence, 4.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 4.d4 exd4 *++[ECO "C50f"]+[Variation "Italian: Hungarian Defence, Tartakower Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 4.d4 exd4 5.c3 Nf6 6.e5 Ne4 *++[ECO "C50g"]+[Variation "Italian: Hungarian Defence, 4.d4 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 4.d4 d6 *++[ECO "C50h"]+[Variation "Giuoco Piano"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 *++[ECO "C50h"]+[Variation "Giuoco Piano: Jerome Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.Bxf7+ *++[ECO "C50h"]+[Variation "Giuoco Piano: Rosentreter Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d4 *++[ECO "C50i"]+[Variation "Giuoco Piano: Three Knights Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.Nc3 *++[ECO "C50j"]+[Variation "Giuoco Piano: Four Knights Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.Nc3 Nf6 *++[ECO "C50k"]+[Variation "Giuoco Piano: 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.O-O *++[ECO "C50l"]+[Variation "Giuoco Piano: 4.O-O Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.O-O Nf6 *++[ECO "C50m"]+[Variation "Giuoco Piano: 4.O-O Nf6 5.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.O-O Nf6 5.Nc3 *++[ECO "C50n"]+[Variation "Giuoco Pianissimo: 4.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 *++[ECO "C50n"]+[Variation "Giuoco Pianissimo: Lucchini Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 f5 *++[ECO "C50n"]+[Variation "Giuoco Pianissimo: Dubois Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 f5 5.Ng5 f4 *++[ECO "C50o"]+[Variation "Giuoco Pianissimo: 4.d3 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 *++[ECO "C50p"]+[Variation "Giuoco Pianissimo: 4.d3 Nf6 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.O-O *++[ECO "C50q"]+[Variation "Giuoco Pianissimo: 4.d3 Nf6 5.O-O d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.O-O d6 *++[ECO "C50r"]+[Variation "Giuoco Pianissimo: Italian Four Knights"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 *++[ECO "C50s"]+[Variation "Giuoco Pianissimo: Italian Four Knights, 5...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 d6 *++[ECO "C50t"]+[Variation "Giuoco Pianissimo: Italian Four Knights, 5...d6 6.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 d6 6.Be3 *++[ECO "C50u"]+[Variation "Giuoco Pianissimo: Canal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 d6 6.Bg5 *++[ECO "C50v"]+[Variation "Giuoco Pianissimo: Canal, 6...h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 d6 6.Bg5 h6 *++[ECO "C51"]+[Variation "Evans Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 *++[ECO "C51"]+[Variation "Evans Gambit Declined: 4...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Be7 *++[ECO "C51"]+[Variation "Evans Gambit: Hein Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 d5 *++[ECO "C51"]+[Variation "Evans Gambit Declined"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Cordel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.Bb2 *++[ECO "C51"]+[Variation "Evans Gambit Declined, 5.b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Lange Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Nh6 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Pavlov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Nh6 7.d4 d6 8.Bxh6 dxe5 9.Bxg7 Rg8 10.Bxf7+ Kxf7 11.Bxe5 Qg5 12.Nd2 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Hirschbach Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Vasquez Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 7.Bxf7+ Ke7 8.Qh5 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Hicken Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 7.Qf3 Qxe5 8.Qxf7+ Kd8 9.Bb2 *++[ECO "C51"]+[Variation "Evans Gambit Declined, 5.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.a4 *++[ECO "C51"]+[Variation "Evans Gambit Declined, Showalter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.a4 a6 6.Nc3 *++[ECO "C51"]+[Variation "Evans Gambit Accepted"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 *++[ECO "C51"]+[Variation "Evans Gambit Accepted, 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 *++[ECO "C51"]+[Variation "Evans Gambit: Mayet Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bf8 *++[ECO "C51"]+[Variation "Evans Gambit: Stone-Ware Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bd6 *++[ECO "C51"]+[Variation "Evans Gambit: Anderssen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 *++[ECO "C51"]+[Variation "Evans Gambit: Anderssen, 6.Qb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 6.Qb3 *++[ECO "C51"]+[Variation "Evans Gambit: Anderssen, 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 6.d4 *++[ECO "C51"]+[Variation "Evans Gambit: Cordel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 6.d4 Na5 *++[ECO "C51"]+[Variation "Evans Gambit: Normal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 *++[ECO "C51"]+[Variation "Evans Gambit: Anderssen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.d5 *++[ECO "C51"]+[Variation "Evans Gambit: Ulvestad Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.d5 Na5 10.Bb2 *++[ECO "C51"]+[Variation "Evans Gambit: Paulsen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.d5 Na5 10.Bb2 Ne7 *++[ECO "C51"]+[Variation "Evans Gambit: Morphy Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 *++[ECO "C51"]+[Variation "Evans Gambit: Goering Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Na5 10.Bg5 *++[ECO "C51"]+[Variation "Evans Gambit: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Na5 10.Bg5 f6 11.Be3 *++[ECO "C51"]+[Variation "Evans Gambit: Normal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 *++[ECO "C51"]+[Variation "Evans Gambit: Fraser Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 10.Qa4 *++[ECO "C51"]+[Variation "Evans Gambit: Fraser-Mortimer Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 10.Qa4 Bd7 11.Qb3 Na5 12.Bxf7+ Kf8 13.Qc2 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.Qb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.Qb3 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.O-O Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O Nf6 *++[ECO "C52"]+[Variation "Evans Gambit: Richardson Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O Nf6 7.d4 O-O 8.Nxe5 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.O-O d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.O-O d6 7.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 *++[ECO "C52"]+[Variation "Evans Gambit: Waller Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 exd4 8.Qb3 *++[ECO "C52"]+[Variation "Evans Gambit: Sanders-Alapin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bd7 *++[ECO "C52"]+[Variation "Evans Gambit: Alapin-Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bg4 *++[ECO "C52"]+[Variation "Evans Gambit: Lasker's Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bb6 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 *++[ECO "C52"]+[Variation "Evans Gambit: Leonhardt Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 b5 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 *++[ECO "C52"]+[Variation "Evans Gambit: Compromised Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 *++[ECO "C52"]+[Variation "Evans Gambit: Compromised Defence, Paulsen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 8.Qb3 Qf6 9.e5 Qg6 10.Nxc3 Nge7 11.Ba3 *++[ECO "C52"]+[Variation "Evans Gambit: Compromised Defence, Potter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 8.Qb3 Qf6 9.e5 Qg6 10.Nxc3 Nge7 11.Rd1 *++[ECO "C52"]+[Variation "Evans Gambit: 5...Ba5 6.d4 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 *++[ECO "C52"]+[Variation "Evans Gambit: Sokolsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Bg5 *++[ECO "C52"]+[Variation "Evans Gambit: Tartakower Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 *++[ECO "C52"]+[Variation "Evans Gambit: Tartakower Attack, 7...Qd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 Qd7 *++[ECO "C52"]+[Variation "Evans Gambit: Tartakower Attack, 8.dxe5 Bb6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 Qd7 8.dxe5 Bb6 *++[ECO "C52"]+[Variation "Evans Gambit: Tartakower Attack, 8.dxe5 dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 Qd7 8.dxe5 dxe5 *++[ECO "C52"]+[Variation "Evans Gambit: Tartakower, Levenfish Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 Qd7 8.dxe5 dxe5 9.O-O Bb6 10.Ba3 Na5 11.Nxe5 *++[ECO "C53"]+[Variation "Giuoco Piano: 4.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 *++[ECO "C53"]+[Variation "Giuoco Piano: LaBourdonnais Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 d6 5.d4 exd4 6.cxd4 Bb6 *++[ECO "C53"]+[Variation "Giuoco Piano: Close Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 *++[ECO "C53"]+[Variation "Giuoco Piano: Centre-Holding Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 *++[ECO "C53"]+[Variation "Giuoco Piano: Tarrasch Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.O-O Nf6 7.a4 a6 8.Re1 d6 9.h3 *++[ECO "C53"]+[Variation "Giuoco Piano: Mestel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.Bg5 *++[ECO "C53"]+[Variation "Giuoco Piano: Eisinger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.d5 Nb8 7.d6 *++[ECO "C54a"]+[Variation "Giuoco Piano: 4.c3 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 *++[ECO "C54b"]+[Variation "Giuoco Piano: Albin Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.O-O *++[ECO "C54c"]+[Variation "Giuoco Piano: Bird's Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.b4 *++[ECO "C54c"]+[Variation "Giuoco Piano: Bird's Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.b4 Bb6 6.a4 *++[ECO "C54d"]+[Variation "Giuoco Pianissimo: 5.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 *++[ECO "C54e"]+[Variation "Giuoco Pianissimo: 5.d3 a6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 a6 *++[ECO "C54f"]+[Variation "Giuoco Pianissimo: 5.d3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 *++[ECO "C54g"]+[Variation "Giuoco Pianissimo: 5.d3 d6 6.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 6.Nbd2 *++[ECO "C54h"]+[Variation "Giuoco Pianissimo: 5.d3 d6 6.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 6.O-O *++[ECO "C54i"]+[Variation "Giuoco Pianissimo: 5.d3 d6 6.O-O O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 6.O-O O-O *++[ECO "C54j"]+[Variation "Giuoco Piano: 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 *++[ECO "C54k"]+[Variation "Giuoco Piano: 6.e5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 *++[ECO "C54k"]+[Variation "Giuoco Piano: Ghulam Kassim Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 Ne4 7.Bd5 Nxf2 8.Kxf2 dxc3+ 9.Kg3 *++[ECO "C54k"]+[Variation "Giuoco Piano: 6.e5 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 d5 *++[ECO "C54k"]+[Variation "Giuoco Piano: Anderssen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 d5 7.Bb5 Ne4 8.cxd4 Bb4+ *++[ECO "C54l"]+[Variation "Giuoco Piano: 6.cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 *++[ECO "C54l"]+[Variation "Giuoco Piano: 6.cxd4 Bb4+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ *++[ECO "C54l"]+[Variation "Giuoco Piano: Krakow Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Kf1 *++[ECO "C54m"]+[Variation "Giuoco Piano: 6.cxd4 Bb4+ 7.Bd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Bd2 *++[ECO "C54m"]+[Variation "Giuoco Piano: Krause Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Bd2 Nxe4 8.Bxb4 Nxb4 9.Bxf7+ Kxf7 10.Qb3+ d5 11.Ne5+ Kf6 12.f3 *++[ECO "C54n"]+[Variation "Giuoco Piano: Greco Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 *++[ECO "C54n"]+[Variation "Giuoco Piano: Greco Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 *++[ECO "C54n"]+[Variation "Giuoco Piano: Bernstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 9.bxc3 Bxc3 10.Qb3 d5 *++[ECO "C54n"]+[Variation "Giuoco Piano: Aitken Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 9.bxc3 Bxc3 10.Ba3 *++[ECO "C54o"]+[Variation "Giuoco Piano: Greco Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 *++[ECO "C54o"]+[Variation "Giuoco Piano: Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.bxc3 d5 10.Ba3 *++[ECO "C54o"]+[Variation "Giuoco Piano: Moeller (Therkatz) Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 *++[ECO "C54o"]+[Variation "Giuoco Piano: Moeller-Herzog Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 Bf6 10.Re1 Ne7 11.Rxe4 d6 12.Bg5 Bxg5 13.Nxg5 O-O 14.Nxh7 *++[ECO "C54o"]+[Variation "Giuoco Piano: Moeller, Bayonet Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 Bf6 10.Re1 Ne7 11.Rxe4 d6 12.g4 *++[ECO "C55a"]+[Variation "Two Knights Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 *++[ECO "C55b"]+[Variation "Two Knights: Deutz Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 *++[ECO "C55b"]+[Variation "Two Knights: 4.O-O Gambit, Rosentreter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 Bxd4 6.Nxd4 Nxd4 7.Bg5 h6 8.Bh4 g5 9.f4 *++[ECO "C55b"]+[Variation "Two Knights: 4.O-O Gambit, Holzhausen Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 Bxd4 6.Nxd4 Nxd4 7.Bg5 d6 8.f4 Qe7 9.fxe5 dxe5 10.Nc3 *++[ECO "C55c"]+[Variation "Two Knights: 4.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 *++[ECO "C55d"]+[Variation "Two Knights: 4.d3 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 h6 *++[ECO "C55e"]+[Variation "Two Knights: 4.d3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 *++[ECO "C55e"]+[Variation "Two Knights: 4.d3 Be7 5.Bb3 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.Bb3 O-O *++[ECO "C55f"]+[Variation "Two Knights: 4.d3 Be7 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.c3 *++[ECO "C55g"]+[Variation "Two Knights: 4.d3 Be7 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.O-O *++[ECO "C55h"]+[Variation "Two Knights: 4.d3 Be7 5.O-O O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.O-O O-O *++[ECO "C55i"]+[Variation "Two Knights: 4.d3 Be7 5.O-O O-O 6.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.O-O O-O 6.Bb3 *++[ECO "C55j"]+[Variation "Two Knights: 4.d3 Be7 5.O-O O-O 6.Bb3 d6 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.O-O O-O 6.Bb3 d6 7.c3 *++[ECO "C55k"]+[Variation "Two Knights: 4.d3 Be7 5.O-O O-O 6.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 Be7 5.O-O O-O 6.Re1 *++[ECO "C55l"]+[Variation "Two Knights: 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 *++[ECO "C55l"]+[Variation "Two Knights: 4.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 *++[ECO "C55m"]+[Variation "Two Knights: 4.d4 exd4 5.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.Nxd4 *++[ECO "C55n"]+[Variation "Two Knights: Perreux Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.Ng5 *++[ECO "C55o"]+[Variation "Two Knights: Modern Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.e5 *++[ECO "C55p"]+[Variation "Two Knights: Modern, 5.e5 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.e5 d5 *++[ECO "C55q"]+[Variation "Two Knights: Modern, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.e5 d5 6.Bb5 Ne4 7.Nxd4 Bd7 *++[ECO "C55r"]+[Variation "Two Knights: Modern, Main Line, 8.Bxc6 bxc6 9.O-O Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.e5 d5 6.Bb5 Ne4 7.Nxd4 Bd7 8.Bxc6 bxc6 9.O-O Bc5 *++[ECO "C55s"]+[Variation "Two Knights: 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O *++[ECO "C55s"]+[Variation "Two Knights: 5.O-O Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Be7 *++[ECO "C55t"]+[Variation "Two Knights: 5.O-O d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O d6 *++[ECO "C55u"]+[Variation "Two Knights: Max Lange Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 *++[ECO "C55v"]+[Variation "Two Knights: Max Lange, Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 Ng4 *++[ECO "C55v"]+[Variation "Two Knights: Max Lange, Krause Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 Ng4 7.c3 *++[ECO "C55w"]+[Variation "Two Knights: Max Lange, 6.e5 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 *++[ECO "C55w"]+[Variation "Two Knights: Max Lange, Schlechter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.fxg7 *++[ECO "C55x"]+[Variation "Two Knights: Max Lange, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.g4 Qg6 12.Nce4 Bb6 13.f4 O-O-O *++[ECO "C55x"]+[Variation "Two Knights: Max Lange, Marshall Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.Nce4 *++[ECO "C55x"]+[Variation "Two Knights: Max Lange, Rubinstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.Nce4 Bf8 *++[ECO "C55x"]+[Variation "Two Knights: Max Lange, Loman Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 g6 *++[ECO "C56a"]+[Variation "Two Knights: Classical"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 *++[ECO "C56a"]+[Variation "Two Knights: Classical, Nakhmanson Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Nc3 *++[ECO "C56b"]+[Variation "Two Knights: Classical, 6.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 *++[ECO "C56b"]+[Variation "Two Knights: Classical, 6.Re1 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 *++[ECO "C56c"]+[Variation "Two Knights: Classical, Canal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Nc3 *++[ECO "C56d"]+[Variation "Two Knights: Classical, 7.Bxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 *++[ECO "C56d"]+[Variation "Two Knights: Classical, 7.Bxd5 Qxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 *++[ECO "C56d"]+[Variation "Two Knights: Classical, 8.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 *++[ECO "C56e"]+[Variation "Two Knights: Classical, 8.Nc3 Qd8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qd8 *++[ECO "C56f"]+[Variation "Two Knights: Classical, 8.Nc3 Qh5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qh5 *++[ECO "C56g"]+[Variation "Two Knights: Classical, 8.Nc3 Qh5 9.Nxe4 Be6 10.Bg5 Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qh5 9.Nxe4 Be6 10.Bg5 Bd6 *++[ECO "C56h"]+[Variation "Two Knights: Classical, Moller Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 *++[ECO "C56h"]+[Variation "Two Knights: Classical, Moller, 9.Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 *++[ECO "C56h"]+[Variation "Two Knights: Classical, Moller, 9.Nxe4 Be6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 *++[ECO "C56i"]+[Variation "Two Knights: Classical, Moller, 10.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bg5 *++[ECO "C56i"]+[Variation "Two Knights: Classical, Yurdansky Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bg5 h6 11.Bh4 g5 12.Nf6+ Ke7 13.b4 *++[ECO "C56j"]+[Variation "Two Knights: Classical, Moller, 10.Neg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Neg5 *++[ECO "C56k"]+[Variation "Two Knights: Classical, Moller, 10.Neg5 O-O-O 11.Nxe6 fxe6 12.Rxe6 Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Neg5 O-O-O 11.Nxe6 fxe6 12.Rxe6 Bd6 *++[ECO "C56l"]+[Variation "Two Knights: Classical, Moller, 10.Bd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bd2 *++[ECO "C56m"]+[Variation "Two Knights: Classical, Moller, 10.Bd2 Qf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bd2 Qf5 *++[ECO "C56n"]+[Variation "Two Knights: Classical, Moller, 10.Bd2 Qd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bd2 Qd5 *++[ECO "C56o"]+[Variation "Two Knights: Classical, Moller, 10.Bd2 Bb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bd2 Bb4 *++[ECO "C57a"]+[Variation "Two Knights: 4.Ng5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 *++[ECO "C57a"]+[Variation "Two Knights: Traxler (Wilkes-Barre) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 *++[ECO "C57a"]+[Variation "Two Knights: Traxler, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.d4 *++[ECO "C57b"]+[Variation "Two Knights: Traxler, 5.Nxf7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 *++[ECO "C57b"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kxf2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kxf2 *++[ECO "C57c"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kf1 *++[ECO "C57c"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kf1, Beyer's 8...Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kf1 Qe7 7.Nxh8 d5 8.exd5 Bg4 *++[ECO "C57c"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kf1, 8...Nd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kf1 Qe7 7.Nxh8 d5 8.exd5 Nd4 *++[ECO "C57c"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kf1, Palkin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kf1 Qe7 7.Nxh8 d5 8.exd5 Nd4 9.h3 *++[ECO "C57c"]+[Variation "Two Knights: Traxler, 5.Nxf7 & 6.Kf1, Menovsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Nxf7 Bxf2+ 6.Kf1 Qe7 7.Nxh8 d5 8.exd5 Nd4 9.d6 *++[ECO "C57d"]+[Variation "Two Knights: Traxler, 5.Bxf7+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Bxf7+ *++[ECO "C57d"]+[Variation "Two Knights: Traxler, 5.Bxf7+ Ke7 6.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Bxf7+ Ke7 6.Bb3 *++[ECO "C57d"]+[Variation "Two Knights: Traxler, Chigorin/Pithart Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 5.Bxf7+ Ke7 6.Bd5 *++[ECO "C57e"]+[Variation "Two Knights: 4.Ng5 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 *++[ECO "C57e"]+[Variation "Two Knights: Kloss Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nb4 *++[ECO "C57e"]+[Variation "Two Knights: 4.Ng5 d5 5.exd5 Nxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 *++[ECO "C57f"]+[Variation "Two Knights: Lolli Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.d4 *++[ECO "C57f"]+[Variation "Two Knights: Lolli Attack, Pinkus Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.d4 Bb4+ *++[ECO "C57g"]+[Variation "Two Knights: Fegatello (Fried Liver) Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 *++[ECO "C57g"]+[Variation "Two Knights: Fegatello, Leonhardt Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 Kxf7 7.Qf3+ Ke6 8.Nc3 Nb4 9.Qe4 c6 10.a3 Na6 11.d4 Nc7 *++[ECO "C57g"]+[Variation "Two Knights: Fegatello, Polerio Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 Kxf7 7.Qf3+ Ke6 8.Nc3 Ne7 *++[ECO "C57h"]+[Variation "Two Knights: Ulvestad Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 b5 *++[ECO "C57i"]+[Variation "Two Knights: Fritz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 *++[ECO "C57i"]+[Variation "Two Knights: Fritz Variation, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 *++[ECO "C57j"]+[Variation "Two Knights: Fritz, 8.Nxf7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.Nxf7 *++[ECO "C57j"]+[Variation "Two Knights: Fritz, 8.cxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.cxd4 *++[ECO "C57j"]+[Variation "Two Knights: Fritz, Paoli's 8.h4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.h4 *++[ECO "C57k"]+[Variation "Two Knights: Fritz, Gruber Variation (8.Ne4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.Ne4 *++[ECO "C57l"]+[Variation "Two Knights: Fritz, Radchenko Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.Ne4 Qh4 9.Ng3 Bb7 *++[ECO "C57m"]+[Variation "Two Knights: Fritz, Berliner Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.Ne4 Qh4 9.Ng3 Bg4 10.f3 e4 *++[ECO "C58a"]+[Variation "Two Knights: Morphy Variation (5...Na5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 *++[ECO "C58b"]+[Variation "Two Knights: Morphy, Kieseritsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 *++[ECO "C58c"]+[Variation "Two Knights: Morphy, Kieseritsky Variation, 6...h6 7.Nf3 e4 8.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 h6 7.Nf3 e4 8.Qe2 *++[ECO "C58c"]+[Variation "Two Knights: Morphy, Yankovich Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 h6 7.Nf3 e4 8.Qe2 Nxc4 9.dxc4 Bc5 10.Nfd2 *++[ECO "C58c"]+[Variation "Two Knights: Morphy, Maroczy Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 h6 7.Nf3 e4 8.Qe2 Nxc4 9.dxc4 Be7 *++[ECO "C58d"]+[Variation "Two Knights: Morphy, Polerio (6.Bb5+)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ *++[ECO "C58d"]+[Variation "Two Knights: Morphy, Polerio, 6...Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ Bd7 *++[ECO "C58e"]+[Variation "Two Knights: Morphy, Polerio, 6...c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 *++[ECO "C58f"]+[Variation "Two Knights: Morphy, Bogoljubow Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 *++[ECO "C58f"]+[Variation "Two Knights: Morphy, Blackburne Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 cxb5 *++[ECO "C58f"]+[Variation "Two Knights: Morphy, Paoli Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 Qc7 9.Bd3 *++[ECO "C58g"]+[Variation "Two Knights: Morphy, Colman Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 Rb8 *++[ECO "C58h"]+[Variation "Two Knights: Morphy, 8.Be2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 *++[ECO "C59a"]+[Variation "Two Knights: Morphy, 8.Be2 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 *++[ECO "C59b"]+[Variation "Two Knights: Morphy, Steinitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nh3 *++[ECO "C59c"]+[Variation "Two Knights: Morphy, Main Line 9.Nf3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 *++[ECO "C59c"]+[Variation "Two Knights: Morphy, Main Line 9.Nf3 e4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 *++[ECO "C59c"]+[Variation "Two Knights: Morphy, Main Line 9.Nf3 e4 10.Ne5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 *++[ECO "C59d"]+[Variation "Two Knights: Morphy, Steiner Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bc5 *++[ECO "C59e"]+[Variation "Two Knights: Morphy, Goering Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Qc7 *++[ECO "C59f"]+[Variation "Two Knights: Morphy, Geller Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Qd4 *++[ECO "C59g"]+[Variation "Two Knights: Main Line 10...Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 *++[ECO "C59h"]+[Variation "Two Knights: Main Line, 11.f4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.f4 *++[ECO "C59i"]+[Variation "Two Knights: Main Line, 11.f4 exf3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.f4 exf3 *++[ECO "C59j"]+[Variation "Two Knights: Main Line, 11.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 *++[ECO "C59j"]+[Variation "Two Knights: Main Line, 11.d4 Qc7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 Qc7 *++[ECO "C59j"]+[Variation "Two Knights: Main Line, Knorre Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 Qc7 12.Bd2 *++[ECO "C59k"]+[Variation "Two Knights: Main Line, 11.d4 exd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 exd3 *++[ECO "C59k"]+[Variation "Two Knights: Main Line, 11.d4 exd3 12.Nxd3 Qc7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 exd3 12.Nxd3 Qc7 *++[ECO "C59l"]+[Variation "Two Knights: Main Line, 11.d4, Honfi Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 exd3 12.Nxd3 Qc7 13.b3 *++[ECO "C60a"]+[Variation "Spanish (Ruy Lopez)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 *++[ECO "C60a"]+[Variation "Spanish: Spanish Countergambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d5 *++[ECO "C60b"]+[Variation "Spanish: 3...a5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a5 *++[ECO "C60c"]+[Variation "Spanish: Nuernberg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f6 *++[ECO "C60d"]+[Variation "Spanish: Pollock Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Na5 *++[ECO "C60e"]+[Variation "Spanish: Lucena Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Be7 *++[ECO "C60f"]+[Variation "Spanish: Vinogradov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Qe7 *++[ECO "C60g"]+[Variation "Spanish: Brentano Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g5 *++[ECO "C60h"]+[Variation "Spanish: Alapin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bb4 *++[ECO "C60i"]+[Variation "Spanish: Alapin, 4.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bb4 4.c3 *++[ECO "C60j"]+[Variation "Spanish: Fianchetto (Smyslov) Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 *++[ECO "C60k"]+[Variation "Spanish: Fianchetto, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 4.O-O *++[ECO "C60l"]+[Variation "Spanish: Fianchetto, 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 4.d4 *++[ECO "C60m"]+[Variation "Spanish: Fianchetto, 4.d4 exd4 5.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 4.d4 exd4 5.Bg5 *++[ECO "C60n"]+[Variation "Spanish: Fianchetto, 4.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 4.c3 *++[ECO "C60o"]+[Variation "Spanish: Cozio Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 *++[ECO "C60p"]+[Variation "Spanish: Cozio, 4.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.Nc3 *++[ECO "C60q"]+[Variation "Spanish: Cozio, Paulsen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.Nc3 g6 *++[ECO "C60r"]+[Variation "Spanish: Cozio, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.c3 *++[ECO "C60s"]+[Variation "Spanish: Cozio, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.O-O *++[ECO "C60t"]+[Variation "Spanish: Cozio, 4.O-O g6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.O-O g6 *++[ECO "C60u"]+[Variation "Spanish: Cozio, 4.O-O g6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.O-O g6 5.c3 *++[ECO "C61a"]+[Variation "Spanish: Bird's Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 *++[ECO "C61b"]+[Variation "Spanish: Bird's, 4.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Bc4 *++[ECO "C61c"]+[Variation "Spanish: Bird's, 4.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 *++[ECO "C61c"]+[Variation "Spanish: Bird's, 4.Nxd4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 *++[ECO "C61d"]+[Variation "Spanish: Bird's, 5.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.d3 *++[ECO "C61e"]+[Variation "Spanish: Bird's, 5.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.Bc4 *++[ECO "C61f"]+[Variation "Spanish: Bird's, 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O *++[ECO "C61f"]+[Variation "Spanish: Bird's, Paulsen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Ne7 *++[ECO "C61g"]+[Variation "Spanish: Bird's, 5.O-O c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O c6 *++[ECO "C61h"]+[Variation "Spanish: Bird's, 5.O-O c6 6.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O c6 6.Bc4 *++[ECO "C61i"]+[Variation "Spanish: Bird's, 5.O-O Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Bc5 *++[ECO "C61j"]+[Variation "Spanish: Bird's, 5.O-O Bc5 6.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Bc5 6.d3 *++[ECO "C61k"]+[Variation "Spanish: Bird's, 5.O-O Bc5 6.d3 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Bc5 6.d3 c6 *++[ECO "C61l"]+[Variation "Spanish: Bird's, 5.O-O Bc5 6.d3 c6 7.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Bc5 6.d3 c6 7.Bc4 *++[ECO "C61m"]+[Variation "Spanish: Bird's, 5.O-O Bc5 6.d3 c6 7.Bc4 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Bc5 6.d3 c6 7.Bc4 d5 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.Bxc6+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.Bxc6+ *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.O-O *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.c3 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 exd4 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4 exd4 5.Qxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 exd4 5.Qxd4 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4 exd4 5.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 exd4 5.Nxd4 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, 4.d4 Bd7 5.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 5.Nc3 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, Nimzowitsch Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 5.Nc3 Nf6 6.Bxc6 *++[ECO "C62"]+[Variation "Spanish: Old Steinitz, Semi-Duras Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 5.c4 *++[ECO "C63a"]+[Variation "Spanish: Schliemann (Jaenisch)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 *++[ECO "C63a"]+[Variation "Spanish: Schliemann, 4.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Qe2 *++[ECO "C63b"]+[Variation "Spanish: Schliemann, 4.exf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.exf5 *++[ECO "C63c"]+[Variation "Spanish: Schliemann, 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.d4 *++[ECO "C63d"]+[Variation "Spanish: Schliemann, 4.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.d3 *++[ECO "C63e"]+[Variation "Spanish: Schliemann, 4.d3 fxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.d3 fxe4 *++[ECO "C63f"]+[Variation "Spanish: Schliemann, 4.d3 fxe4 5.dxe4 Nf6 6.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.d3 fxe4 5.dxe4 Nf6 6.O-O *++[ECO "C63g"]+[Variation "Spanish: Schliemann, 4.Bxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Bxc6 *++[ECO "C63h"]+[Variation "Spanish: Schliemann, 4.Bxc6 dxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Bxc6 dxc6 *++[ECO "C63i"]+[Variation "Spanish: Schliemann, 4.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 *++[ECO "C63j"]+[Variation "Spanish: Schliemann, 4.Nc3 Nd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 Nd4 *++[ECO "C63k"]+[Variation "Spanish: Schliemann, 4.Nc3 Nd4 5.Ba4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 Nd4 5.Ba4 *++[ECO "C63l"]+[Variation "Spanish: Schliemann, 4.Nc3 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 Nf6 *++[ECO "C63m"]+[Variation "Spanish: Schliemann, 4.Nc3 Nf6 5.exf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 Nf6 5.exf5 *++[ECO "C63n"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 *++[ECO "C63o"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 Nf6 *++[ECO "C63p"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 Nf6 6.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 Nf6 6.Qe2 *++[ECO "C63q"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 Nf6 6.Nxf6+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 Nf6 6.Nxf6+ *++[ECO "C63r"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 d5 *++[ECO "C63s"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5 *++[ECO "C63t"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5 dxe4 7.Nxc6 Qd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5 dxe4 7.Nxc6 Qd5 *++[ECO "C63u"]+[Variation "Spanish: Schliemann, 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5 dxe4 7.Nxc6 Qg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 fxe4 5.Nxe4 d5 6.Nxe5 dxe4 7.Nxc6 Qg5 *++[ECO "C64a"]+[Variation "Spanish: Classical Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 *++[ECO "C64a"]+[Variation "Spanish: Classical, Exchange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.Bxc6 *++[ECO "C64b"]+[Variation "Spanish: Classical, 4.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 *++[ECO "C64b"]+[Variation "Spanish: Classical, Boden Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Qe7 *++[ECO "C64c"]+[Variation "Spanish: Classical, Charousek Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Bb6 *++[ECO "C64d"]+[Variation "Spanish: Classical, 4.c3 Nge7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Nge7 *++[ECO "C64e"]+[Variation "Spanish: Classical, 4.c3 Qf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Qf6 *++[ECO "C64f"]+[Variation "Spanish: Classical, Cordel Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 f5 *++[ECO "C64g"]+[Variation "Spanish: Classical, Cordel Gambit, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 f5 5.d4 *++[ECO "C64h"]+[Variation "Spanish: Classical, 4.c3 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Nf6 *++[ECO "C64i"]+[Variation "Spanish: Classical, 4.c3 Nf6 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Nf6 5.d4 *++[ECO "C64j"]+[Variation "Spanish: Classical, 4.c3 Nf6 5.d4 Bb6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Nf6 5.d4 Bb6 *++[ECO "C64k"]+[Variation "Spanish: Classical, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O *++[ECO "C64l"]+[Variation "Spanish: Classical, 4.O-O Nge7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nge7 *++[ECO "C64m"]+[Variation "Spanish: Classical, 4.O-O Qf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Qf6 *++[ECO "C64n"]+[Variation "Spanish: Classical, 4.O-O d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O d6 *++[ECO "C64o"]+[Variation "Spanish: Classical, 4.O-O d6 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O d6 5.c3 *++[ECO "C64p"]+[Variation "Spanish: Classical, 4.O-O Nd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 *++[ECO "C64q"]+[Variation "Spanish: Classical, Zaitsev Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.b4 *++[ECO "C64r"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Bc4 *++[ECO "C64s"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 *++[ECO "C64s"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Nxd4 Bxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 *++[ECO "C64s"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Nxd4 Bxd4 6.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 *++[ECO "C64s"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6 *++[ECO "C64t"]+[Variation "Spanish: Classical, 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6 7.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6 7.d4 *++[ECO "C64u"]+[Variation "Spanish: Classical, 6.c3 Bb6 7.d4 c6 8.Ba4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6 7.d4 c6 8.Ba4 *++[ECO "C64v"]+[Variation "Spanish: Classical, 6.c3 Bb6 7.d4 c6 8.Ba4 d6 9.Na3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.Nxd4 Bxd4 6.c3 Bb6 7.d4 c6 8.Ba4 d6 9.Na3 *++[ECO "C65a"]+[Variation "Spanish: Berlin Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 *++[ECO "C65b"]+[Variation "Spanish: Berlin, 4.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.Qe2 *++[ECO "C65c"]+[Variation "Spanish: Berlin, 4.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d4 *++[ECO "C65d"]+[Variation "Spanish: Berlin, 4.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d4 exd4 *++[ECO "C65e"]+[Variation "Spanish: Berlin, Nyholm Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d4 exd4 5.O-O *++[ECO "C65f"]+[Variation "Spanish: Berlin, 4.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 *++[ECO "C65g"]+[Variation "Spanish: Berlin, Mortimer Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Ne7 *++[ECO "C65g"]+[Variation "Spanish: Berlin, Mortimer Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Ne7 5.Nxe5 c6 *++[ECO "C65h"]+[Variation "Spanish: Berlin, 4.d3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 *++[ECO "C65h"]+[Variation "Spanish: Berlin, Anderssen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 5.Bxc6+ *++[ECO "C65h"]+[Variation "Spanish: Berlin, Duras Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 5.c4 *++[ECO "C65i"]+[Variation "Spanish: Berlin, 4.d3 d6 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 5.c3 *++[ECO "C65j"]+[Variation "Spanish: Berlin, 4.d3 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Bc5 *++[ECO "C65j"]+[Variation "Spanish: Berlin, Kaufmann Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Bc5 5.Be3 *++[ECO "C65k"]+[Variation "Spanish: Berlin, 4.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O *++[ECO "C65l"]+[Variation "Spanish: Berlin, 4.O-O Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Be7 *++[ECO "C65m"]+[Variation "Spanish: Berlin, Beverwijk Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 *++[ECO "C65n"]+[Variation "Spanish: Berlin, Beverwijk, 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 5.c3 *++[ECO "C65o"]+[Variation "Spanish: Berlin, Benelux Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 5.c3 O-O 6.d4 Bb6 *++[ECO "C65p"]+[Variation "Spanish: Berlin, Benelux Variation, 7.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 5.c3 O-O 6.d4 Bb6 7.Bg5 *++[ECO "C65q"]+[Variation "Spanish: Berlin, Beverwijk, 5.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 5.Nxe5 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, 5.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.Re1 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Chigorin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Nd7 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, 5.d4 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Wolf Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 exd4 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Hedgehog Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Tarrasch Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Re1 O-O *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Bernstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Bg5 *++[ECO "C66"]+[Variation "Spanish: Closed Berlin, Showalter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Bxc6 *++[ECO "C67a"]+[Variation "Spanish: Open Berlin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 *++[ECO "C67b"]+[Variation "Spanish: Open Berlin, 5.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.Qe2 *++[ECO "C67c"]+[Variation "Spanish: Open Berlin, 5.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.Re1 *++[ECO "C67d"]+[Variation "Spanish: Open Berlin, 5.Re1 Nd6 6.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.Re1 Nd6 6.Nxe5 *++[ECO "C67e"]+[Variation "Spanish: Open Berlin, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 *++[ECO "C67e"]+[Variation "Spanish: Open Berlin, Rosenthal Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 a6 *++[ECO "C67f"]+[Variation "Spanish: Open Berlin, 5...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 *++[ECO "C67g"]+[Variation "Spanish: Berlin, Minckwitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.dxe5 *++[ECO "C67h"]+[Variation "Spanish: Open Berlin, 5...Be7 6.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 *++[ECO "C67h"]+[Variation "Spanish: Open Berlin, Trifunovic Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 d5 *++[ECO "C67i"]+[Variation "Spanish: Open Berlin, 5...Be7 6.Qd2 Nd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 *++[ECO "C67i"]+[Variation "Spanish: Open Berlin, Cordel Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nf5 *++[ECO "C67j"]+[Variation "Spanish: Open Berlin, 5...Be7 6.Qd2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 *++[ECO "C67j"]+[Variation "Spanish: Open Berlin, Pillsbury Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.b3 *++[ECO "C67j"]+[Variation "Spanish: Open Berlin, Zukertort Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.c4 *++[ECO "C67k"]+[Variation "Spanish: Open Berlin, Winawer Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.Nd4 *++[ECO "C67l"]+[Variation "Spanish: Open Berlin, Main Line 9.Nc3 (Rio de Janerio)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.Nc3 *++[ECO "C67m"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 *++[ECO "C67m"]+[Variation "Spanish: Open Berlin, Showalter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Ba4 *++[ECO "C67n"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 6.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.dxe5 *++[ECO "C67o"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 6.Bxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 *++[ECO "C67p"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 6.Bxc6 dxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 *++[ECO "C67q"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 *++[ECO "C67r"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ *++[ECO "C67s"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 *++[ECO "C67t"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 h6 *++[ECO "C67u"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3 Ke8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 Ke8 *++[ECO "C67v"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3 Ke8 10.Rd1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 Ke8 10.Rd1 *++[ECO "C67w"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3 Ke8 10.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 Ke8 10.h3 *++[ECO "C67x"]+[Variation "Spanish: Open Berlin, 5.d4 Nd6 Queenswap, 9.Nc3 Ke8 10.h3 a5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Bxc6 dxc6 7.dxe5 Nf5 8.Qxd8+ Kxd8 9.Nc3 Ke8 10.h3 a5 *++[ECO "C68a"]+[Variation "Spanish: 3...a6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 *++[ECO "C68b"]+[Variation "Spanish: 3...a6 4.Bc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bc4 *++[ECO "C68c"]+[Variation "Spanish: Exchange Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 *++[ECO "C68c"]+[Variation "Spanish: Exchange, 4...bxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 bxc6 *++[ECO "C68d"]+[Variation "Spanish: Exchange, 4...dxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 *++[ECO "C68e"]+[Variation "Spanish: Exchange, Lasker Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.d4 *++[ECO "C68f"]+[Variation "Spanish: Exchange, Alekhine Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.d4 exd4 6.Qxd4 Qxd4 7.Nxd4 Bd7 *++[ECO "C68g"]+[Variation "Spanish: Exchange, Keres Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 *++[ECO "C68h"]+[Variation "Spanish: Exchange, Keres, 5...f6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 f6 *++[ECO "C68h"]+[Variation "Spanish: Exchange, Romanovsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 f6 6.d3 *++[ECO "C68i"]+[Variation "Spanish: Exchange, 5.Nc3 f6 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 f6 6.d4 *++[ECO "C68j"]+[Variation "Spanish: Exchange, 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O *++[ECO "C68k"]+[Variation "Spanish: Exchange, 5.O-O Ne7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Ne7 *++[ECO "C68l"]+[Variation "Spanish: Exchange, 5.O-O Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bd6 *++[ECO "C68m"]+[Variation "Spanish: Exchange, 5.O-O Bd6 6.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bd6 6.d4 exd4 *++[ECO "C68n"]+[Variation "Spanish: Exchange, 5.O-O Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bg4 *++[ECO "C68n"]+[Variation "Spanish: Exchange, 5.O-O Bg4 6.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bg4 6.h3 *++[ECO "C68o"]+[Variation "Spanish: Exchange, Alapin Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bg4 6.h3 h5 *++[ECO "C68p"]+[Variation "Spanish: Exchange, Alapin Gambit, 7.d3 Qf6 8.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bg4 6.h3 h5 7.d3 Qf6 8.Nbd2 *++[ECO "C68q"]+[Variation "Spanish: Exchange, Bronstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 *++[ECO "C68r"]+[Variation "Spanish: Exchange, Bronstein, 6.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 6.d3 *++[ECO "C68s"]+[Variation "Spanish: Exchange, Bronstein, 6.Na3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 6.Na3 *++[ECO "C68t"]+[Variation "Spanish: Exchange, Bronstein, 6.Na3 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 6.Na3 b5 *++[ECO "C68u"]+[Variation "Spanish: Exchange, Bronstein, 6.Na3 Be6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 6.Na3 Be6 *++[ECO "C69a"]+[Variation "Spanish: Exchange, Gligoric Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 *++[ECO "C69b"]+[Variation "Spanish: Exchange, Gligoric, 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 *++[ECO "C69b"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 *++[ECO "C69c"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 7.c3 *++[ECO "C69d"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4 7.c3 Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 7.c3 Bd6 *++[ECO "C69e"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4 7.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 7.dxe5 *++[ECO "C69f"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4 Queenswap, 9.Rd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 7.dxe5 Qxd1 8.Rxd1 fxe5 9.Rd3 *++[ECO "C69g"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 Bg4 Queenswap, 9.Rd3 Bd6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 Bg4 7.dxe5 Qxd1 8.Rxd1 fxe5 9.Rd3 Bd6 *++[ECO "C69h"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 *++[ECO "C69h"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 exd4 7.Qxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 *++[ECO "C69i"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 exd4 7.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Qxd4 *++[ECO "C69i"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 exd4 7.Nxd4 Ne7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 Ne7 *++[ECO "C69j"]+[Variation "Spanish: Exchange, Gligoric, 6.d4 exd4 7.Nxd4 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 *++[ECO "C69j"]+[Variation "Spanish: Exchange, Gligoric, 8.Ne2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Ne2 *++[ECO "C69k"]+[Variation "Spanish: Exchange, Gligoric, 8.Nb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Nb3 *++[ECO "C69k"]+[Variation "Spanish: Exchange, Gligoric, 8.Nb3 Queenswap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Nb3 Qxd1 9.Rxd1 *++[ECO "C69l"]+[Variation "Spanish: Exchange, Gligoric, 8.Nb3 Queenswap, 9...Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Nb3 Qxd1 9.Rxd1 Bd7 *++[ECO "C69m"]+[Variation "Spanish: Exchange, Gligoric, 8.Nb3 Queenswap, 9...Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Nb3 Qxd1 9.Rxd1 Bg4 *++[ECO "C69n"]+[Variation "Spanish: Exchange, Gligoric, 8.Nb3 Queenswap, 9...Bg4 10.f3 Be6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 6.d4 exd4 7.Nxd4 c5 8.Nb3 Qxd1 9.Rxd1 Bg4 10.f3 Be6 *++[ECO "C70"]+[Variation "Spanish: 4.Ba4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 *++[ECO "C70"]+[Variation "Spanish: Brentano Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 g5 *++[ECO "C70"]+[Variation "Spanish: 4.Ba4 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Be7 *++[ECO "C70"]+[Variation "Spanish: Fianchetto Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 g6 *++[ECO "C70"]+[Variation "Spanish: Alapin Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Bb4 *++[ECO "C70"]+[Variation "Spanish: Cozio Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nge7 *++[ECO "C70"]+[Variation "Spanish: Bird's Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nd4 *++[ECO "C70"]+[Variation "Spanish: Classical Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Bc5 *++[ECO "C70"]+[Variation "Spanish: Caro Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 *++[ECO "C70"]+[Variation "Spanish: Graz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 5.Bb3 Bc5 *++[ECO "C70"]+[Variation "Spanish: Taimanov (Wing) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 5.Bb3 Na5 *++[ECO "C70"]+[Variation "Spanish: Schliemann Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 f5 *++[ECO "C70"]+[Variation "Spanish: Schliemann Deferred, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 f5 5.d4 *++[ECO "C70"]+[Variation "Spanish: Schliemann Deferred, 5.d4 exd4 6.e5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 f5 5.d4 exd4 6.e5 *++[ECO "C71"]+[Variation "Spanish: Modern Steinitz Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 *++[ECO "C71"]+[Variation "Spanish: Modern Steinitz, Three Knights Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Nc3 *++[ECO "C71"]+[Variation "Spanish: Modern Steinitz, 5.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.d4 *++[ECO "C71"]+[Variation "Spanish: Modern Steinitz, Noah's Ark Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.d4 b5 6.Bb3 Nxd4 7.Nxd4 exd4 8.Qxd4 c5 *++[ECO "C71"]+[Variation "Spanish: Modern Steinitz, Keres Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c4 *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O Ne7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O Ne7 *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O Bg4 *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O Bg4 6.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O Bg4 6.h3 *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O Bd7 *++[ECO "C72"]+[Variation "Spanish: Modern Steinitz, 5.O-O Bd7 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O Bd7 6.d4 *++[ECO "C73"]+[Variation "Spanish: Modern Steinitz, Richter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ *++[ECO "C73"]+[Variation "Spanish: Modern Steinitz, Richter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ bxc6 *++[ECO "C73"]+[Variation "Spanish: Modern Steinitz, Richter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ bxc6 6.d4 *++[ECO "C73"]+[Variation "Spanish: Modern Steinitz, Alapin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ bxc6 6.d4 f6 *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, 5.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, 5.c3 g6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 g6 *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, Siesta Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, Siesta, 6.exf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 6.exf5 *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, Siesta, Kopayev Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 6.exf5 Bxf5 7.O-O *++[ECO "C74"]+[Variation "Spanish: Modern Steinitz, Siesta, Kopayev, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 6.exf5 Bxf5 7.O-O Bd3 8.Re1 Be7 9.Bc2 Bxc2 10.Qxc2 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, 5.c3 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, 5.c3 Bd7 6.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.O-O *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, 5.c3 Bd7 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, 5.c3 Bd7 6.d4 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nf6 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, Rubinstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nge7 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, Rubinstein, 7.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nge7 7.Bb3 *++[ECO "C75"]+[Variation "Spanish: Modern Steinitz, Rubinstein, 7.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nge7 7.Be3 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O Bg7 8.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 8.Re1 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O Bg7 8.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 8.dxe5 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O Bg7 8.dxe5 dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 8.dxe5 dxe5 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O Bg7 8.dxe5 Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 8.dxe5 Nxe5 *++[ECO "C76"]+[Variation "Spanish: Modern Steinitz, Bronstein, 7.O-O Bg7 8.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 8.d5 *++[ECO "C77a"]+[Variation "Spanish: Morphy Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 *++[ECO "C77b"]+[Variation "Spanish: Anderssen Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 *++[ECO "C77c"]+[Variation "Spanish: Anderssen, 5...b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 b5 *++[ECO "C77d"]+[Variation "Spanish: Anderssen, 5...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 d6 *++[ECO "C77e"]+[Variation "Spanish: Duras Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 d6 6.c4 *++[ECO "C77f"]+[Variation "Spanish: Anderssen, 5...d6 6.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 d6 6.c3 *++[ECO "C77g"]+[Variation "Spanish: Anderssen, 5...d6 6.c3 g6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 d6 6.c3 g6 *++[ECO "C77h"]+[Variation "Spanish: Four Knights (Tarrasch) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Nc3 *++[ECO "C77i"]+[Variation "Spanish: Exchange Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Bxc6 *++[ECO "C77j"]+[Variation "Spanish: Centre Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 *++[ECO "C77k"]+[Variation "Spanish: Centre Attack, 5...b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 b5 *++[ECO "C77l"]+[Variation "Spanish: Centre Attack, 5...Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 Nxd4 *++[ECO "C77m"]+[Variation "Spanish: Centre Attack, 5...Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 Nxe4 *++[ECO "C77n"]+[Variation "Spanish: Centre Attack, 5...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 Be7 *++[ECO "C77o"]+[Variation "Spanish: Centre Attack, 5...exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d4 exd4 *++[ECO "C77p"]+[Variation "Spanish: Wormald Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 *++[ECO "C77q"]+[Variation "Spanish: Wormald Attack, 5...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 Be7 *++[ECO "C77r"]+[Variation "Spanish: Wormald Attack, 5...b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 *++[ECO "C77s"]+[Variation "Spanish: Wormald Attack, 5...b5 6.Bb3 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 6.Bb3 Bc5 *++[ECO "C77t"]+[Variation "Spanish: Wormald Attack, 5...b5 6.Bb3 Bc5 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 6.Bb3 Bc5 7.c3 *++[ECO "C77u"]+[Variation "Spanish: Wormald Attack, 5...b5 6.Bb3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 6.Bb3 Be7 *++[ECO "C77u"]+[Variation "Spanish: Wormald Attack, Gruenfeld Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 6.Bb3 Be7 7.d4 d6 8.c3 Bg4 *++[ECO "C78a"]+[Variation "Spanish: 5.O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O *++[ECO "C78b"]+[Variation "Spanish: Moeller Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Bc5 *++[ECO "C78c"]+[Variation "Spanish: Moeller Defence, 6.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Bc5 6.Nxe5 *++[ECO "C78d"]+[Variation "Spanish: Moeller Defence, 6.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Bc5 6.c3 *++[ECO "C78e"]+[Variation "Spanish: 5.O-O b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 *++[ECO "C78e"]+[Variation "Spanish: 5.O-O b5 6.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 *++[ECO "C78f"]+[Variation "Spanish: 5.O-O b5 6.Bb3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 d6 *++[ECO "C78f"]+[Variation "Spanish: Rabinovich Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 d6 7.Ng5 d5 8.exd5 Nd4 9.Re1 Bc5 10.Rxe5+ Kf8 *++[ECO "C78g"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Be7 *++[ECO "C78g"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Be7 7.d4 *++[ECO "C78h"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 *++[ECO "C78i"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.Nxe5 *++[ECO "C78i"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.Nxe5 Nxe5 8.d4 *++[ECO "C78j"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.c3 *++[ECO "C78j"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.c3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.c3 d6 *++[ECO "C78k"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.c3 d6 8.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.c3 d6 8.d4 *++[ECO "C78l"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.a4 *++[ECO "C78m"]+[Variation "Spanish: 5.O-O b5 6.Bb3 Bc5 7.a4 Rb8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 7.a4 Rb8 *++[ECO "C78n"]+[Variation "Spanish: Archangelsk Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 *++[ECO "C78o"]+[Variation "Spanish: Archangelsk, 7.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.d4 *++[ECO "C78p"]+[Variation "Spanish: Archangelsk, 7.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.d3 *++[ECO "C78q"]+[Variation "Spanish: Archangelsk, 7.d3 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.d3 Be7 *++[ECO "C78r"]+[Variation "Spanish: Archangelsk, 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.c3 *++[ECO "C78s"]+[Variation "Spanish: Archangelsk, 7.c3 Nxe4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.c3 Nxe4 *++[ECO "C78t"]+[Variation "Spanish: Archangelsk, 7.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 *++[ECO "C78t"]+[Variation "Spanish: Archangelsk, 7.Re1 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 *++[ECO "C78u"]+[Variation "Spanish: Archangelsk, 7.Re1 Bc5 8.c3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 8.c3 d6 *++[ECO "C78u"]+[Variation "Spanish: Archangelsk, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 8.c3 d6 9.d4 Bb6 *++[ECO "C78v"]+[Variation "Spanish: Archangelsk, Main Line, 10.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 8.c3 d6 9.d4 Bb6 10.a4 *++[ECO "C78w"]+[Variation "Spanish: Archangelsk, Main Line, 10.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 8.c3 d6 9.d4 Bb6 10.Bg5 *++[ECO "C78x"]+[Variation "Spanish: Archangelsk, Main Line, 10.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 7.Re1 Bc5 8.c3 d6 9.d4 Bb6 10.Be3 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, 6.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.c3 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, 6.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Re1 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, Exchange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, Lipnitsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Bg4 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, Rubinstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Nxe4 *++[ECO "C79"]+[Variation "Spanish: Steinitz Deferred, Boleslavsky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Nxe4 8.Re1 f5 9.dxe5 d5 10.Nc3 *++[ECO "C80a"]+[Variation "Spanish: Open"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 *++[ECO "C80b"]+[Variation "Spanish: Open, Knorre Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Nc3 *++[ECO "C80c"]+[Variation "Spanish: Open, Tartakower Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Qe2 *++[ECO "C80d"]+[Variation "Spanish: Open, 6.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Re1 *++[ECO "C80e"]+[Variation "Spanish: Open, 6.Re1 Nc5 7.Bxc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Re1 Nc5 7.Bxc6 *++[ECO "C80f"]+[Variation "Spanish: Open, 6.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 *++[ECO "C80g"]+[Variation "Spanish: Open, Riga Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 exd4 *++[ECO "C80h"]+[Variation "Spanish: Open, 6.d4 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 Be7 *++[ECO "C80i"]+[Variation "Spanish: Open, 6.d4 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 *++[ECO "C80i"]+[Variation "Spanish: Open, Friess Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Nxe5 *++[ECO "C80i"]+[Variation "Spanish: Open, Richter Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.d5 *++[ECO "C80j"]+[Variation "Spanish: Open, 7.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 *++[ECO "C80k"]+[Variation "Spanish: Open, 7.Bb3 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 *++[ECO "C80k"]+[Variation "Spanish: Open, 7.Bb3 d5 8.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.a4 *++[ECO "C80k"]+[Variation "Spanish: Open, Schlechter Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.a4 Nxd4 *++[ECO "C80k"]+[Variation "Spanish: Open, Schlecter, Berger Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.a4 Nxd4 9.Nxd4 exd4 10.Nc3 *++[ECO "C80k"]+[Variation "Spanish: Open, Harksen Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.c4 *++[ECO "C80l"]+[Variation "Spanish: Open, 8.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.Nxe5 *++[ECO "C80m"]+[Variation "Spanish: Open, 8.dxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 *++[ECO "C80m"]+[Variation "Spanish: Open, Zukertort Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Ne7 *++[ECO "C80n"]+[Variation "Spanish: Open, 8...Be6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 *++[ECO "C80n"]+[Variation "Spanish: Open, 8...Be6 9.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.a4 *++[ECO "C80o"]+[Variation "Spanish: Open, 8...Be6 9.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Be3 *++[ECO "C80p"]+[Variation "Spanish: Open, Bernstein Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 *++[ECO "C80q"]+[Variation "Spanish: Open, Bernstein, 9...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Bc5 *++[ECO "C80r"]+[Variation "Spanish: Open, Bernstein, 9...Nc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 *++[ECO "C80s"]+[Variation "Spanish: Open, Bernstein, 9...Nc5 10.c3 d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 10.c3 d4 *++[ECO "C80s"]+[Variation "Spanish: Open, Bernstein, 11.cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 10.c3 d4 11.cxd4 *++[ECO "C80t"]+[Variation "Spanish: Open, Bernstein, Karpov Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 10.c3 d4 11.Ng5 *++[ECO "C80u"]+[Variation "Spanish: Open, Bernstein, 11.Bxe6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 10.c3 d4 11.Bxe6 *++[ECO "C81"]+[Variation "Spanish: Open, Keres Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 *++[ECO "C81"]+[Variation "Spanish: Open, Keres Attack, 9...Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Bc5 *++[ECO "C81"]+[Variation "Spanish: Open, Keres Attack, 9...Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, Adam Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.c4 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, 10.Rd1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, 10.Rd1 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O *++[ECO "C81"]+[Variation "Spanish: Open, Keres, 10.Rd1 O-O 11.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O 11.c3 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, 10.Rd1 O-O 11.c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O 11.c4 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, 10.Rd1 O-O 11.c4 bxc4 12.Bxc4 Bc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O 11.c4 bxc4 12.Bxc4 Bc5 *++[ECO "C81"]+[Variation "Spanish: Open, Keres, Ekstrom Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O 11.c4 bxc4 12.Bxc4 Qd7 *++[ECO "C82a"]+[Variation "Spanish: Open, 9.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 *++[ECO "C82b"]+[Variation "Spanish: Open, Berlin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 *++[ECO "C82b"]+[Variation "Spanish: Open, Berlin, 10.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 *++[ECO "C82c"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 *++[ECO "C82d"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Re1 *++[ECO "C82e"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Nbd2 *++[ECO "C82e"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Nbd2 Be7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Nbd2 Be7 *++[ECO "C82f"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1 *++[ECO "C82g"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1 Qd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1 Qd7 *++[ECO "C82h"]+[Variation "Spanish: Open, Berlin, 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 10.Bc2 Bg4 11.Nbd2 Be7 12.Re1 O-O *++[ECO "C82i"]+[Variation "Spanish: Open, Italian Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 *++[ECO "C82j"]+[Variation "Spanish: Open, Motzko Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Qd3 *++[ECO "C82j"]+[Variation "Spanish: Open, Motzko Attack, Nenarokov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Qd3 Ne7 *++[ECO "C82k"]+[Variation "Spanish: Open, St. Petersburg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 *++[ECO "C82k"]+[Variation "Spanish: Open, St. Petersburg Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O *++[ECO "C82l"]+[Variation "Spanish: Open, St. Petersburg, 11.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 *++[ECO "C82m"]+[Variation "Spanish: Open, St. Petersburg, 11.Bc2 f5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 f5 *++[ECO "C82n"]+[Variation "Spanish: Open, Baguio Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Bf5 *++[ECO "C82n"]+[Variation "Spanish: Open, Baguio, 12.Nb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Bf5 12.Nb3 *++[ECO "C82o"]+[Variation "Spanish: Open, Dilworth Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 *++[ECO "C82o"]+[Variation "Spanish: Open, Dilworth, 12.Rxf2 f6 13.exf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 12.Rxf2 f6 13.exf6 *++[ECO "C82p"]+[Variation "Spanish: Open, Dilworth, 14.Kxf2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 12.Rxf2 f6 13.exf6 Bxf2+ 14.Kxf2 *++[ECO "C82q"]+[Variation "Spanish: Open, Dilworth, 14.Kxf2 Qxf6 15.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 12.Rxf2 f6 13.exf6 Bxf2+ 14.Kxf2 Qxf6 15.Nf1 *++[ECO "C82r"]+[Variation "Spanish: Open, Dilworth, 14.Kxf2 Qxf6 15.Kg1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 12.Rxf2 f6 13.exf6 Bxf2+ 14.Kxf2 Qxf6 15.Kg1 *++[ECO "C82s"]+[Variation "Spanish: Open, Dilworth, 14.Kxf2 Qxf6 15.Kg1 g5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 12.Rxf2 f6 13.exf6 Bxf2+ 14.Kxf2 Qxf6 15.Kg1 g5 *++[ECO "C83"]+[Variation "Spanish: Open, Classical Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, Tarrasch Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 O-O 11.Nd4 Qd7 12.Nxe6 fxe6 13.Rxe4 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, Breslau Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 O-O 11.Nd4 Nxe5 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Be3 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2 Nc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 Nc5 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O *++[ECO "C83"]+[Variation "Spanish: Open, Classical, Malkin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O 11.Qe2 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2 O-O 11.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O 11.Bc2 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2 O-O 11.Bc2 f5 12.exf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O 11.Bc2 f5 12.exf6 *++[ECO "C83"]+[Variation "Spanish: Open, Classical, 10.Nbd2 O-O 11.Bc2 f5 12.Nb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O 11.Bc2 f5 12.Nb3 *++[ECO "C84a"]+[Variation "Spanish: Closed System"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 *++[ECO "C84b"]+[Variation "Spanish: Closed, 6.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Nc3 *++[ECO "C84c"]+[Variation "Spanish: Closed, 6.Nc3 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Nc3 b5 *++[ECO "C84c"]+[Variation "Spanish: Closed, 6.Nc3 b5 7.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Nc3 b5 7.Bb3 *++[ECO "C84c"]+[Variation "Spanish: Closed, 6.Nc3 b5 7.Bb3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Nc3 b5 7.Bb3 d6 *++[ECO "C84d"]+[Variation "Spanish: Closed, 6.Nc3 b5 7.Bb3 d6 8.Nd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Nc3 b5 7.Bb3 d6 8.Nd5 *++[ECO "C84e"]+[Variation "Spanish: Closed, 6.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 *++[ECO "C84f"]+[Variation "Spanish: Closed, 6.d3 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 b5 *++[ECO "C84f"]+[Variation "Spanish: Closed, 6.d3 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 b5 7.Bb3 *++[ECO "C84g"]+[Variation "Spanish: Closed, Centre Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 *++[ECO "C84g"]+[Variation "Spanish: Closed, Centre Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 *++[ECO "C84h"]+[Variation "Spanish: Closed, Centre Attack, 7.e5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 *++[ECO "C84h"]+[Variation "Spanish: Closed, Centre Attack, 7.e5 Ne4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 *++[ECO "C84h"]+[Variation "Spanish: Closed, Centre Attack, Basque Gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.c3 *++[ECO "C84h"]+[Variation "Spanish: Closed, Centre Attack, Basque Gambit Accepted"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.c3 dxc3 *++[ECO "C84h"]+[Variation "Spanish: Closed, Centre Attack, 7.e5 Ne4 8.b4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.b4 *++[ECO "C84i"]+[Variation "Spanish: Closed, Centre Attack, 7.e5 Ne4 8.Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.Nxd4 *++[ECO "C84j"]+[Variation "Spanish: Closed, Centre Attack, 7.e5 Ne4 8.Nxd4 Nxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.Nxd4 Nxd4 *++[ECO "C84k"]+[Variation "Spanish: Closed, Centre Attack, 7.e5 Ne4 8.Nxd4 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.Nxd4 O-O *++[ECO "C84l"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 *++[ECO "C84m"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 b5 *++[ECO "C84n"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 b5 8.e5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 b5 8.e5 *++[ECO "C84n"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 b5 8.e5 Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 b5 8.e5 Nxe5 *++[ECO "C84n"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 b5 8.e5 Nxe5 9.Rxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 b5 8.e5 Nxe5 9.Rxe5 *++[ECO "C84o"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 O-O *++[ECO "C84p"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 O-O 8.e5 Ne8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 O-O 8.e5 Ne8 *++[ECO "C84p"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 O-O 8.e5 Ne8 9.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 O-O 8.e5 Ne8 9.c3 *++[ECO "C84q"]+[Variation "Spanish: Closed, Centre Attack, 7.Re1 O-O 8.e5 Ne8 9.Bf4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.Re1 O-O 8.e5 Ne8 9.Bf4 *++[ECO "C85a"]+[Variation "Spanish: Closed, Exchange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 *++[ECO "C85b"]+[Variation "Spanish: Closed, Exchange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 *++[ECO "C85c"]+[Variation "Spanish: Closed, Exchange, 7.Qe2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Qe2 *++[ECO "C85d"]+[Variation "Spanish: Closed, Exchange, 7.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Nc3 *++[ECO "C85e"]+[Variation "Spanish: Closed, Exchange, 7.Nc3 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Nc3 Bg4 *++[ECO "C85f"]+[Variation "Spanish: Closed, Exchange, 7.Qe1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Qe1 *++[ECO "C85g"]+[Variation "Spanish: Closed, Exchange, 7.Qe1 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Qe1 c5 *++[ECO "C85h"]+[Variation "Spanish: Closed, Exchange, 7.Qe1 Nd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Qe1 Nd7 *++[ECO "C85i"]+[Variation "Spanish: Closed, Exchange, 7.Qe1 Nd7 8.b3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.Qe1 Nd7 8.b3 *++[ECO "C85j"]+[Variation "Spanish: Closed, Exchange, 7.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 *++[ECO "C85k"]+[Variation "Spanish: Closed, Exchange, 7.d3 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Bg4 *++[ECO "C85l"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 *++[ECO "C85m"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 *++[ECO "C85n"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2 O-O 9.Nc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 *++[ECO "C85o"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 *++[ECO "C85p"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4 *++[ECO "C85q"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4 Nc5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4 Nc5 *++[ECO "C85r"]+[Variation "Spanish: Closed, Exchange, 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4 Nc5 11.Nf5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 dxc6 7.d3 Nd7 8.Nbd2 O-O 9.Nc4 f6 10.Nh4 Nc5 11.Nf5 *++[ECO "C86a"]+[Variation "Spanish: Worrall Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 *++[ECO "C86a"]+[Variation "Spanish: Worrall Attack, 6...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 d6 *++[ECO "C86b"]+[Variation "Spanish: Worrall Attack, 6...b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 *++[ECO "C86b"]+[Variation "Spanish: Worrall Attack, 6...b5 7.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 *++[ECO "C86c"]+[Variation "Spanish: Worrall Attack, 7...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 d6 *++[ECO "C86d"]+[Variation "Spanish: Worrall Attack, 7...d6 8.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 d6 8.c3 *++[ECO "C86e"]+[Variation "Spanish: Worrall Attack, 7...O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O *++[ECO "C86e"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.a4 *++[ECO "C86f"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 *++[ECO "C86g"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d6 *++[ECO "C86h"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d6 9.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d6 9.d4 *++[ECO "C86i"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d6 9.Rd1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d6 9.Rd1 *++[ECO "C86j"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d5 *++[ECO "C86j"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d5 9.exd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d5 9.exd5 *++[ECO "C86k"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d5 9.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d5 9.d3 *++[ECO "C86l"]+[Variation "Spanish: Worrall Attack, 7...O-O 8.c3 d5 9.d3 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 d5 9.d3 Bb7 *++[ECO "C87a"]+[Variation "Spanish: Closed, 6.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 *++[ECO "C87b"]+[Variation "Spanish: Closed, Averbakh (Russian) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 *++[ECO "C87c"]+[Variation "Spanish: Closed, Averbakh, 7.Bxc6+"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.Bxc6+ *++[ECO "C87c"]+[Variation "Spanish: Closed, Averbakh, 7.Bxc6+ bxc6 8.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.Bxc6+ bxc6 8.d4 *++[ECO "C87d"]+[Variation "Spanish: Closed, Averbakh, 7.Bxc6+ bxc6 8.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.Bxc6+ bxc6 8.d4 exd4 *++[ECO "C87d"]+[Variation "Spanish: Closed, Averbakh, 7.Bxc6+ bxc6 8.d4 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.Bxc6+ bxc6 8.d4 exd4 9.Nxd4 *++[ECO "C87e"]+[Variation "Spanish: Closed, Averbakh, 7.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 *++[ECO "C87f"]+[Variation "Spanish: Closed, Averbakh, 7.c3 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 Bg4 *++[ECO "C87g"]+[Variation "Spanish: Closed, Averbakh, 7.c3 Bg4 8.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 Bg4 8.h3 *++[ECO "C87h"]+[Variation "Spanish: Closed, Averbakh, 7.c3 Bg4 8.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 Bg4 8.d3 *++[ECO "C87i"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O *++[ECO "C87j"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.d4 *++[ECO "C87k"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.d4 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.d4 Bd7 *++[ECO "C87l"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.d4 Bd7 9.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.d4 Bd7 9.Nbd2 *++[ECO "C87m"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.d4 Bd7 9.Nbd2 Re8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.d4 Bd7 9.Nbd2 Re8 *++[ECO "C87n"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.h3 *++[ECO "C87o"]+[Variation "Spanish: Closed, Averbakh, 7.c3 O-O 8.h3 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 7.c3 O-O 8.h3 Bd7 *++[ECO "C88a"]+[Variation "Spanish: Closed, 6...b5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 *++[ECO "C88a"]+[Variation "Spanish: Closed, 6...b5 7.Bb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 *++[ECO "C88b"]+[Variation "Spanish: Closed, Trajkovic Counterattack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 Bb7 *++[ECO "C88c"]+[Variation "Spanish: Closed 7...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 *++[ECO "C88c"]+[Variation "Spanish: Closed, 7...d6 8.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.d4 *++[ECO "C88c"]+[Variation "Spanish: Closed, Noah's Ark Trap"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.d4 Nxd4 9.Nxd4 exd4 10.Qxd4 c5 *++[ECO "C88d"]+[Variation "Spanish: Closed 7...d6 8.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 *++[ECO "C88d"]+[Variation "Spanish: Closed 7...d6 8.c3 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Bg4 *++[ECO "C88e"]+[Variation "Spanish: Closed 7...d6 8.c3 Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Na5 *++[ECO "C88e"]+[Variation "Spanish: Closed, Leonhardt Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Na5 9.Bc2 c5 10.d4 Qc7 11.h3 Nc6 12.d5 Nb8 13.Nbd2 g5 *++[ECO "C88e"]+[Variation "Spanish: Closed, Balla Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Na5 9.Bc2 c5 10.d4 Qc7 11.a4 *++[ECO "C88f"]+[Variation "Spanish: Closed, 7...O-O"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O *++[ECO "C88g"]+[Variation "Spanish: Closed, 8.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.d3 *++[ECO "C88g"]+[Variation "Spanish: Closed, 8.d3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.d3 d6 *++[ECO "C88h"]+[Variation "Spanish: Closed, 8.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.h3 *++[ECO "C88i"]+[Variation "Spanish: Closed, 8.h3 Bb7 9.d3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.h3 Bb7 9.d3 d6 *++[ECO "C88j"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 *++[ECO "C88k"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 b4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 b4 *++[ECO "C88l"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 Bb7 *++[ECO "C88m"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 Bb7 9.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 Bb7 9.d3 *++[ECO "C88n"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 Bb7 9.d3 d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 Bb7 9.d3 d6 *++[ECO "C88o"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 Bb7 9.d3 d6 10.Nc3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 Bb7 9.d3 d6 10.Nc3 *++[ECO "C88p"]+[Variation "Spanish: Closed, Anti-Marshall 8.a4 Bb7 9.d3 d6 10.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 Bb7 9.d3 d6 10.c3 *++[ECO "C88q"]+[Variation "Spanish: Closed, 8.c3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 *++[ECO "C89a"]+[Variation "Spanish: Marshall Counterattack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 *++[ECO "C89b"]+[Variation "Spanish: Marshall, 9.exd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 *++[ECO "C89b"]+[Variation "Spanish: Marshall, Herman Steiner Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 e4 *++[ECO "C89c"]+[Variation "Spanish: Marshall, 9.exd5 Nxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 *++[ECO "C89d"]+[Variation "Spanish: Marshall, 9.exd5 Nxd5 10.Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 *++[ECO "C89d"]+[Variation "Spanish: Marshall, 9.exd5 Nxd5 10.Nxe5 Nxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 *++[ECO "C89d"]+[Variation "Spanish: Marshall, 11.Rxe5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 *++[ECO "C89e"]+[Variation "Spanish: Marshall, 11.Rxe5 Nf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 Nf6 *++[ECO "C89f"]+[Variation "Spanish: Marshall, 11.Rxe5 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 *++[ECO "C89g"]+[Variation "Spanish: Marshall, 12.Bxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.Bxd5 *++[ECO "C89h"]+[Variation "Spanish: Marshall, Kevitz Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.Bxd5 cxd5 13.d4 Bd6 14.Re3 *++[ECO "C89i"]+[Variation "Spanish: Marshall, 12.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d3 *++[ECO "C89i"]+[Variation "Spanish: Marshall, 12.d3 Bd6 13.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d3 Bd6 13.Re1 *++[ECO "C89j"]+[Variation "Spanish: Marshall, 12.d3 Bd6 13.Re1 Qh4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d3 Bd6 13.Re1 Qh4 *++[ECO "C89k"]+[Variation "Spanish: Marshall, Main Line (12.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 *++[ECO "C89k"]+[Variation "Spanish: Marshall, Main Line (12.d4 Bd6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 *++[ECO "C89l"]+[Variation "Spanish: Marshall, Main Line, 13.Re2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re2 *++[ECO "C89m"]+[Variation "Spanish: Marshall, Main Line, 13.Re1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 *++[ECO "C89m"]+[Variation "Spanish: Marshall, Main Line, 13.Re1 Qh4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 *++[ECO "C89m"]+[Variation "Spanish: Marshall, Main Line, 13.Re1 Qh4 14.g3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 *++[ECO "C89n"]+[Variation "Spanish: Marshall, Main Line, 14.g3 Qh3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 *++[ECO "C89o"]+[Variation "Spanish: Marshall, Main Line, 15.Re4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Re4 *++[ECO "C89p"]+[Variation "Spanish: Marshall, Main Line, 15.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 *++[ECO "C89p"]+[Variation "Spanish: Marshall, Main Line, 15.Be3 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 *++[ECO "C89p"]+[Variation "Spanish: Marshall, Main Line, 15.Be3 Bg4 16.Qd3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 *++[ECO "C89q"]+[Variation "Spanish: Marshall, Main Line, 15.Be3 Bg4 16.Qd3 Rae8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 *++[ECO "C89q"]+[Variation "Spanish: Marshall, Main Line, 16.Qd3 Rae8 17.Nd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 *++[ECO "C89r"]+[Variation "Spanish: Marshall, Main Line, Pawn Push Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 f5 *++[ECO "C89s"]+[Variation "Spanish: Marshall, Main Line, Classical Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 *++[ECO "C89t"]+[Variation "Spanish: Marshall, Main Line, Classical, 18.c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.c4 *++[ECO "C89u"]+[Variation "Spanish: Marshall, Main Line, Classical, 18.Bxd5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.Bxd5 *++[ECO "C89v"]+[Variation "Spanish: Marshall, Main Line, Classical, 18.Qf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.Qf1 *++[ECO "C89w"]+[Variation "Spanish: Marshall, Main Line, Classical, 18.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.a4 *++[ECO "C89x"]+[Variation "Spanish: Marshall, Main Line, Classical, Spassky Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.a4 Qh5 *++[ECO "C89y"]+[Variation "Spanish: Marshall, Main Line, Classical, 18.a4 f5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.a4 f5 *++[ECO "C90a"]+[Variation "Spanish: Closed, 8...d6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 *++[ECO "C90b"]+[Variation "Spanish: Closed, Lutikov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.Bc2 *++[ECO "C90c"]+[Variation "Spanish: Closed, Suetin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.a3 *++[ECO "C90d"]+[Variation "Spanish: Closed, 8...d6 9.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.a4 *++[ECO "C90d"]+[Variation "Spanish: Closed, 8...d6 9.a4 Bg4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.a4 Bg4 *++[ECO "C90e"]+[Variation "Spanish: Closed, Pilnik Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 *++[ECO "C90f"]+[Variation "Spanish: Closed, Pilnik, 9...h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 h6 *++[ECO "C90g"]+[Variation "Spanish: Closed, Pilnik, 9...Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 *++[ECO "C90g"]+[Variation "Spanish: Closed, Pilnik, 9...Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 *++[ECO "C90g"]+[Variation "Spanish: Closed, Pilnik, 9...Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 *++[ECO "C90h"]+[Variation "Spanish: Closed, Pilnik, 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 *++[ECO "C90i"]+[Variation "Spanish: Closed, Pilnik, 11.Nbd2 Qc7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Qc7 *++[ECO "C90j"]+[Variation "Spanish: Closed, Pilnik, 11.Nbd2 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Nc6 *++[ECO "C90k"]+[Variation "Spanish: Closed, Pilnik, 11.Nbd2 Re8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Re8 *++[ECO "C90k"]+[Variation "Spanish: Closed, Pilnik, 12.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Re8 12.Nf1 *++[ECO "C90l"]+[Variation "Spanish: Closed, Pilnik, 12.Nf1 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Re8 12.Nf1 Nc6 *++[ECO "C90m"]+[Variation "Spanish: Closed, Pilnik, 12.Nf1 Bf8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Re8 12.Nf1 Bf8 *++[ECO "C90n"]+[Variation "Spanish: Closed, Pilnik, 12.Nf1 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 Na5 10.Bc2 c5 11.Nbd2 Re8 12.Nf1 h6 *++[ECO "C91a"]+[Variation "Spanish: Closed, 9.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 *++[ECO "C91b"]+[Variation "Spanish: Closed, Bogoljubow Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 *++[ECO "C91c"]+[Variation "Spanish: Closed, Bogoljubow, 10.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.Be3 *++[ECO "C91d"]+[Variation "Spanish: Closed, Bogoljubow, 10.Be3 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.Be3 exd4 *++[ECO "C91e"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 *++[ECO "C91f"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5 Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 Na5 *++[ECO "C91f"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5 Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 Na5 11.Bc2 *++[ECO "C91g"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5 Na5 11.Bc2 Qc8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 Na5 11.Bc2 Qc8 *++[ECO "C91h"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5 Na5 11.Bc2 c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 Na5 11.Bc2 c6 *++[ECO "C91i"]+[Variation "Spanish: Closed, Bogoljubow, 10.d5 Na5 11.Bc2 c6 12.h3 Bc8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 10.d5 Na5 11.Bc2 c6 12.h3 Bc8 *++[ECO "C92a"]+[Variation "Spanish: Closed, 9.h3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 *++[ECO "C92b"]+[Variation "Spanish: Closed, Keres Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 a5 *++[ECO "C92c"]+[Variation "Spanish: Closed, Kholmov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Be6 *++[ECO "C92d"]+[Variation "Spanish: Closed, Kholmov, 11.Qxb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Be6 10.d4 Bxb3 11.Qxb3 *++[ECO "C92e"]+[Variation "Spanish: Closed, Karpov Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nd7 *++[ECO "C92f"]+[Variation "Spanish: Closed, Karpov Variation, 10.d4 Bf6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nd7 10.d4 Bf6 *++[ECO "C92g"]+[Variation "Spanish: Closed, Karpov Variation, 10.d4 Bf6 11.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nd7 10.d4 Bf6 11.a4 *++[ECO "C92h"]+[Variation "Spanish: Closed, Karpov Variation, 10.d4 Bf6 11.a4 Bb7 12.Na3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nd7 10.d4 Bf6 11.a4 Bb7 12.Na3 *++[ECO "C92i"]+[Variation "Spanish: Closed, Zaitsev (Flohr) Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 *++[ECO "C92j"]+[Variation "Spanish: Closed, Zaitsev, 10.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 *++[ECO "C92k"]+[Variation "Spanish: Closed, Zaitsev, 10.d4 Re8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 *++[ECO "C92l"]+[Variation "Spanish: Closed, Zaitsev, 11.Ng5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Ng5 *++[ECO "C92m"]+[Variation "Spanish: Closed, Zaitsev, 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 *++[ECO "C92n"]+[Variation "Spanish: Closed, Zaitsev, 11.Nbd2 Bf8 12.d5 Nb8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.d5 Nb8 *++[ECO "C92o"]+[Variation "Spanish: Closed, Zaitsev, 12.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.Bc2 *++[ECO "C92p"]+[Variation "Spanish: Closed, Zaitsev, 12.a3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a3 *++[ECO "C92q"]+[Variation "Spanish: Closed, Zaitsev, 12.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a4 *++[ECO "C92r"]+[Variation "Spanish: Closed, Zaitsev, 12.a4 h6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a4 h6 *++[ECO "C92s"]+[Variation "Spanish: Closed, Zaitsev, 12.a4 h6 13.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a4 h6 13.Bc2 *++[ECO "C92t"]+[Variation "Spanish: Closed, Zaitsev, 12.a4 h6 13.Bc2 exd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a4 h6 13.Bc2 exd4 *++[ECO "C92u"]+[Variation "Spanish: Closed, Zaitsev, 12.a4 h6 13.Bc2 exd4 14.cxd4 Nb4 15.Bb1 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 10.d4 Re8 11.Nbd2 Bf8 12.a4 h6 13.Bc2 exd4 14.cxd4 Nb4 15.Bb1 c5 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d3 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4 Re8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4 Re8 11.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.a4 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4 Re8 11.Be3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Be3 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4 Re8 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 10.d4 Re8 11.Nbd2 Bf8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.a3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.a3 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Bc2 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Nf1 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Nf1 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Nf1 Bb7 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Nf1 Bb7 13.Ng3 Na5 14.Bc2 Nc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Nf1 Bb7 13.Ng3 Na5 14.Bc2 Nc4 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Nf1 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Nf1 Bd7 *++[ECO "C93"]+[Variation "Spanish: Closed, Smyslov, 12.Nf1 Bd7 13.Ng3 Na5 14.Bc2 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 10.d4 Re8 11.Nbd2 Bf8 12.Nf1 Bd7 13.Ng3 Na5 14.Bc2 c5 *++[ECO "C94a"]+[Variation "Spanish: Closed, Breyer Defence"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 *++[ECO "C94b"]+[Variation "Spanish: Closed, Breyer, Matulovic Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.a4 *++[ECO "C94c"]+[Variation "Spanish: Closed, Breyer, 10.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d3 *++[ECO "C94d"]+[Variation "Spanish: Closed, Breyer, 10.d3 Nbd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d3 Nbd7 *++[ECO "C94e"]+[Variation "Spanish: Closed, Breyer, 10.d3 Nbd7 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d3 Nbd7 11.Nbd2 *++[ECO "C94f"]+[Variation "Spanish: Closed, Breyer, 10.d3 Nbd7 11.Nbd2 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d3 Nbd7 11.Nbd2 Bb7 *++[ECO "C95a"]+[Variation "Spanish: Closed, Breyer, 10.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 *++[ECO "C95a"]+[Variation "Spanish: Closed, Breyer, 10.d4 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Bb7 *++[ECO "C95b"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 *++[ECO "C95c"]+[Variation "Spanish: Closed, Breyer, Simagin Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nh4 *++[ECO "C95d"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7 11.Bg5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Bg5 *++[ECO "C95e"]+[Variation "Spanish: Closed, Breyer, Arseniev Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.c4 *++[ECO "C95e"]+[Variation "Spanish: Closed, Breyer, Arseniev, 11...c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.c4 c6 *++[ECO "C95f"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7 11.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 *++[ECO "C95f"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7 11.Nbd2 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 *++[ECO "C95f"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7 11.Nbd2 Bb7 12.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.a4 *++[ECO "C95g"]+[Variation "Spanish: Closed, Breyer, 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 *++[ECO "C95g"]+[Variation "Spanish: Closed, Breyer, Gligoric Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 c5 *++[ECO "C95h"]+[Variation "Spanish: Closed, Breyer, Main Line"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 *++[ECO "C95i"]+[Variation "Spanish: Closed, Breyer, Main Line, 13.b4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.b4 *++[ECO "C95j"]+[Variation "Spanish: Closed, Breyer, Main Line, 13.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.a4 *++[ECO "C95k"]+[Variation "Spanish: Closed, Breyer, Main Line, 13.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 *++[ECO "C95k"]+[Variation "Spanish: Closed, Breyer, Main Line, 13.Nf1 Bf8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 *++[ECO "C95k"]+[Variation "Spanish: Closed, Breyer, Main Line, 13.Nf1 Bf8 14.Ng3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 *++[ECO "C95k"]+[Variation "Spanish: Closed, Breyer, Main Line, 14.Ng3 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 c5 *++[ECO "C95l"]+[Variation "Spanish: Closed, Breyer, Main Line, 14.Ng3 g6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 g6 *++[ECO "C95l"]+[Variation "Spanish: Closed, Breyer, Main Line, 14.Ng3 g6 15.b3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 g6 15.b3 *++[ECO "C95m"]+[Variation "Spanish: Closed, Breyer, Main Line, 14.Ng3 g6 15.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 g6 15.a4 *++[ECO "C95n"]+[Variation "Spanish: Closed, Breyer, Main Line, 15.a4 c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 g6 15.a4 c5 *++[ECO "C95o"]+[Variation "Spanish: Closed, Breyer, Main Line, 15.a4 c5 16.d5 c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 Re8 13.Nf1 Bf8 14.Ng3 g6 15.a4 c5 16.d5 c4 *++[ECO "C96a"]+[Variation "Spanish: Closed, Chigorin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 *++[ECO "C96b"]+[Variation "Spanish: Closed, Chigorin, 10.Bc2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 *++[ECO "C96c"]+[Variation "Spanish: Closed, Chigorin, 10...c6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c6 *++[ECO "C96d"]+[Variation "Spanish: Closed, Chigorin, Rossolimo Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c6 11.d4 Qc7 *++[ECO "C96e"]+[Variation "Spanish: Closed, Chigorin, 10...Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 Bb7 *++[ECO "C96f"]+[Variation "Spanish: Closed, Chigorin, 10...c5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 *++[ECO "C96g"]+[Variation "Spanish: Closed, Chigorin, 11.d3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d3 *++[ECO "C96h"]+[Variation "Spanish: Closed, Chigorin, 11.d3 Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d3 Nc6 *++[ECO "C96i"]+[Variation "Spanish: Closed, Chigorin, 11.d4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 *++[ECO "C96j"]+[Variation "Spanish: Closed, Chigorin, 11.d4 cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 cxd4 *++[ECO "C96k"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Bb7 *++[ECO "C96l"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Bb7 12.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Bb7 12.Nbd2 *++[ECO "C96m"]+[Variation "Spanish: Closed, Chigorin, Borisenko Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Nc6 *++[ECO "C96n"]+[Variation "Spanish: Closed, Chigorin, Keres Variation"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Nd7 *++[ECO "C96o"]+[Variation "Spanish: Closed, Chigorin, Keres, 11.Nbd2 cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Nd7 12.Nbd2 cxd4 *++[ECO "C97a"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Qc7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 *++[ECO "C97b"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Qc7 12.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.d5 *++[ECO "C97c"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Qc7 12.d5 c4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.d5 c4 *++[ECO "C97d"]+[Variation "Spanish: Closed, Chigorin, 11.d4 Qc7 12.Nbd2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 *++[ECO "C97e"]+[Variation "Spanish: Closed, Chigorin, 12...Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bb7 *++[ECO "C97f"]+[Variation "Spanish: Closed, Chigorin, 12...Re8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Re8 *++[ECO "C97g"]+[Variation "Spanish: Closed, Chigorin, 12...Rd8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Rd8 *++[ECO "C97h"]+[Variation "Spanish: Closed, Chigorin, 12...Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 *++[ECO "C97i"]+[Variation "Spanish: Closed, Chigorin, 12...Bd7 13.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 13.Nf1 *++[ECO "C97j"]+[Variation "Spanish: Closed, Chigorin, 12...Bd7 13.Nf1 Nc4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 13.Nf1 Nc4 *++[ECO "C97k"]+[Variation "Spanish: Closed, Chigorin, 12...Bd7 13.Nf1 Rfe8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 13.Nf1 Rfe8 *++[ECO "C97l"]+[Variation "Spanish: Closed, Chigorin, Yugoslav System"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 13.Nf1 Rfe8 14.Ne3 g6 *++[ECO "C98a"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 *++[ECO "C98b"]+[Variation "Spanish: Closed, Chigorin, Rauzer Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.dxc5 *++[ECO "C98b"]+[Variation "Spanish: Closed, Chigorin, Rauzer Attack"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.dxc5 dxc5 *++[ECO "C98c"]+[Variation "Spanish: Closed, Chigorin, Rauzer, 14.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.dxc5 dxc5 14.Nf1 *++[ECO "C98d"]+[Variation "Spanish: Closed, Chigorin, Rauzer, 14.Nf1 Be6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.dxc5 dxc5 14.Nf1 Be6 *++[ECO "C98e"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6 13.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.d5 *++[ECO "C98f"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6 13.d5 Na5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.d5 Na5 *++[ECO "C98g"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6 13.d5 Nd8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.d5 Nd8 *++[ECO "C98h"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6 13.d5 Nd8 14.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.d5 Nd8 14.Nf1 *++[ECO "C98i"]+[Variation "Spanish: Closed, Chigorin, 12...Nc6 13.d5 Nd8 14.a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.d5 Nd8 14.a4 *++[ECO "C99a"]+[Variation "Spanish: Closed, Chigorin, 12...cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 *++[ECO "C99a"]+[Variation "Spanish: Closed, Chigorin, 12...cxd4 13.cxd4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 *++[ECO "C99b"]+[Variation "Spanish: Closed, Chigorin, 13...Rd8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Rd8 *++[ECO "C99c"]+[Variation "Spanish: Closed, Chigorin, 13...Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bd7 *++[ECO "C99c"]+[Variation "Spanish: Closed, Chigorin, 13...Bd7 14.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bd7 14.Nf1 *++[ECO "C99d"]+[Variation "Spanish: Closed, Chigorin, 13...Bd7 14.Nf1 Rac8 15.Ne3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bd7 14.Nf1 Rac8 15.Ne3 *++[ECO "C99e"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 *++[ECO "C99e"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7 14.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.Nf1 *++[ECO "C99e"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7 14.Nf1 Rac8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.Nf1 Rac8 *++[ECO "C99f"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7 14.Nf1 Rac8 15.Re2"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.Nf1 Rac8 15.Re2 *++[ECO "C99g"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7 14.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.d5 *++[ECO "C99h"]+[Variation "Spanish: Closed, Chigorin, 13...Bb7 14.d5 Rac8"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.d5 Rac8 *++[ECO "C99i"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 *++[ECO "C99i"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.a3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.a3 *++[ECO "C99j"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nf1"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nf1 *++[ECO "C99k"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.d5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.d5 *++[ECO "C99l"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nb3"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nb3 *++[ECO "C99l"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nb3 a5"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nb3 a5 *++[ECO "C99m"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nb3 a5 15.Be3 a4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nb3 a5 15.Be3 a4 *++[ECO "C99n"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nb3 a5 15.Be3 a4 16.Nbd2 Nb4"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nb3 a5 15.Be3 a4 16.Nbd2 Nb4 *++[ECO "C99o"]+[Variation "Spanish: Closed, Chigorin, 13...Nc6 14.Nb3 a5 15.Be3 a4 16.Nbd2 Bd7"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Nc6 14.Nb3 a5 15.Be3 a4 16.Nbd2 Bd7 *++[ECO "D00a"]+[Variation "Queen's Pawn Game"]+[Result "*"]+1.d4 d5 *++[ECO "D00a"]+[Variation "Queen's Pawn: 2.f4"]+[Result "*"]+1.d4 d5 2.f4 *++[ECO "D00a"]+[Variation "Queen's Pawn: 2.g3"]+[Result "*"]+1.d4 d5 2.g3 *++[ECO "D00b"]+[Variation "Queen's Pawn: 2.c3"]+[Result "*"]+1.d4 d5 2.c3 *++[ECO "D00b"]+[Variation "Queen's Pawn: 2.c3 Nf6"]+[Result "*"]+1.d4 d5 2.c3 Nf6 *++[ECO "D00b"]+[Variation "Queen's Pawn: 2.c3 Nf6 3.Bf4"]+[Result "*"]+1.d4 d5 2.c3 Nf6 3.Bf4 *++[ECO "D00b"]+[Variation "Queen's Pawn: 2.c3 Nf6 3.Bg5"]+[Result "*"]+1.d4 d5 2.c3 Nf6 3.Bg5 *++[ECO "D00c"]+[Variation "Queen's Pawn: Mason Variation"]+[Result "*"]+1.d4 d5 2.Bf4 *++[ECO "D00c"]+[Variation "Queen's Pawn, Mason, Steinitz Countergambit"]+[Result "*"]+1.d4 d5 2.Bf4 c5 *++[ECO "D00d"]+[Variation "Queen's Pawn: 2.e3"]+[Result "*"]+1.d4 d5 2.e3 *++[ECO "D00d"]+[Variation "Queen's Pawn: 2.e3 Nf6"]+[Result "*"]+1.d4 d5 2.e3 Nf6 *++[ECO "D00e"]+[Variation "Queen's Pawn: Stonewall Attack"]+[Result "*"]+1.d4 d5 2.e3 Nf6 3.Bd3 *++[ECO "D00f"]+[Variation "Hodgson Attack (Trompowsky vs. 1...d5)"]+[Result "*"]+1.d4 d5 2.Bg5 *++[ECO "D00f"]+[Variation "Hodgson Attack: Welling Variation"]+[Result "*"]+1.d4 d5 2.Bg5 Bg4 *++[ECO "D00f"]+[Variation "Hodgson Attack: 2...f6"]+[Result "*"]+1.d4 d5 2.Bg5 f6 *++[ECO "D00f"]+[Variation "Hodgson Attack: 2...g6"]+[Result "*"]+1.d4 d5 2.Bg5 g6 *++[ECO "D00g"]+[Variation "Hodgson Attack: 2...c6"]+[Result "*"]+1.d4 d5 2.Bg5 c6 *++[ECO "D00h"]+[Variation "Hodgson Attack, 2...h6"]+[Result "*"]+1.d4 d5 2.Bg5 h6 *++[ECO "D00h"]+[Variation "Hodgson Attack: 2...h6 3.Bh4 c6"]+[Result "*"]+1.d4 d5 2.Bg5 h6 3.Bh4 c6 *++[ECO "D00h"]+[Variation "Hodgson Attack: 2...h6 3.Bh4 c6 4.e3"]+[Result "*"]+1.d4 d5 2.Bg5 h6 3.Bh4 c6 4.e3 *++[ECO "D00h"]+[Variation "Hodgson Attack: 2...h6 3.Bh4 c6 4.e3 Qb6"]+[Result "*"]+1.d4 d5 2.Bg5 h6 3.Bh4 c6 4.e3 Qb6 *++[ECO "D00i"]+[Variation "Trompowsky: 2...d5"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 *++[ECO "D00i"]+[Variation "Trompowsky: 2...d5 3.Nd2"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Nd2 *++[ECO "D00i"]+[Variation "Trompowsky: 2...d5 3.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.e3 *++[ECO "D00i"]+[Variation "Trompowsky: 2...d5 3.e3 e6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.e3 e6 *++[ECO "D00j"]+[Variation "Trompowsky: 2...d5 3.Bxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 *++[ECO "D00j"]+[Variation "Trompowsky: 2...d5 3.Bxf6 gxf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 gxf6 *++[ECO "D00j"]+[Variation "Trompowsky: 2...d5 3.Bxf6 gxf6 4.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 gxf6 4.e3 *++[ECO "D00j"]+[Variation "Trompowsky: 2...d5 3.Bxf6 gxf6 4.e3 c5"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 gxf6 4.e3 c5 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6 4.e3"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6 4.e3 Bf5"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 Bf5 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6 4.e3 c6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 c6 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6 4.e3 Be6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 Be6 *++[ECO "D00k"]+[Variation "Trompowsky: 2...d5 3.Bxf6 exf6 4.e3 Bd6"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 Bd6 *++[ECO "D00l"]+[Variation "Blackmar-Diemer Gambit (BDG): 2.e4"]+[Result "*"]+1.d4 d5 2.e4 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Beyer Countergambit"]+[Result "*"]+1.d4 d5 2.e4 e5 *++[ECO "D00l"]+[Variation "Blackmar-Diemer Gambit (BDG): 2.e4 dxe4"]+[Result "*"]+1.d4 d5 2.e4 dxe4 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Gedult Gambit"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.f3 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Fritz Attack"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Bc4 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: 2.e4 dxe4 3.Nc3"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Grosshans Defence"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 Bd7 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Zeller Defence"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 Bf5 *++[ECO "D00l"]+[Variation "Blackmar-Diemer: Pohmlann Defence"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 f5 *++[ECO "D00m"]+[Variation "Blackmar-Diemer: Lemberger Countergambit"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 e5 *++[ECO "D00m"]+[Variation "Blackmar-Diemer: Lemberger Countergambit, Rassmussen Attack"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 e5 4.Nge2 *++[ECO "D00m"]+[Variation "Blackmar-Diemer: Lemberger Countergambit, Sneider Attack"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 e5 4.Qh5 *++[ECO "D00n"]+[Variation "Queen's Pawn: Veresov Attack"]+[Result "*"]+1.d4 d5 2.Nc3 *++[ECO "D00n"]+[Variation "Queen's Pawn: Veresov Attack"]+[Result "*"]+1.d4 d5 2.Nc3 Bf5 *++[ECO "D00n"]+[Variation "Queen's Pawn: Veresov Attack"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 *++[ECO "D00o"]+[Variation "Queen's Pawn: Veresov, 3.Bf4"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bf4 *++[ECO "D00p"]+[Variation "Queen's Pawn: Veresov, 3.Nf3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Nf3 *++[ECO "D00p"]+[Variation "Queen's Pawn: Veresov, 3.Nf3 g6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Nf3 g6 *++[ECO "D00q"]+[Variation "Queen's Pawn: Anti-King's Indian"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Nf3 g6 4.Bf4 *++[ECO "D00r"]+[Variation "Queen's Pawn: Anti-King's Indian, Main Line"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Nf3 g6 4.Bf4 Bg7 5.e3 O-O 6.Be2 *++[ECO "D00s"]+[Variation "Blackmar-Diemer Gambit (BDG)"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 *++[ECO "D00s"]+[Variation "Blackmar-Diemer: Hubsch Gambit"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 Nxe4 *++[ECO "D00t"]+[Variation "Blackmar-Diemer: 3...dxe4"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 *++[ECO "D00t"]+[Variation "Blackmar-Diemer: von Popiel Attack"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.Bg5 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: 4.f3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: O'Kelly Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 c6 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: Langeheinecke Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 e3 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: Elbert Countergambit"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 e5 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: Weinspach Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 e6 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: Lamb Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 Nc6 *++[ECO "D00u"]+[Variation "Blackmar-Diemer: Vienna Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 Bf5 *++[ECO "D00v"]+[Variation "Blackmar-Diemer: Accepted"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 *++[ECO "D00v"]+[Variation "Blackmar-Diemer: Ryder Gambit"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Qxf3 *++[ECO "D00w"]+[Variation "Blackmar-Diemer: 4.f3 exf3 5.Nxf3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 *++[ECO "D00w"]+[Variation "Blackmar-Diemer: Gunderam Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 Bf5 *++[ECO "D00w"]+[Variation "Blackmar-Diemer: Tartakower Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 Bg4 *++[ECO "D00w"]+[Variation "Blackmar-Diemer: Ziegler Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 c6 *++[ECO "D00x"]+[Variation "Blackmar-Diemer: Euwe Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 e6 *++[ECO "D00y"]+[Variation "Blackmar-Diemer: Bogoljubow Defence"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 g6 *++[ECO "D01a"]+[Variation "Richter-Veresov Attack"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 *++[ECO "D01b"]+[Variation "Richter-Veresov: 3...Ne4"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Ne4 *++[ECO "D01c"]+[Variation "Richter-Veresov: 3...e6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 e6 *++[ECO "D01d"]+[Variation "Richter-Veresov: 3...h6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 h6 *++[ECO "D01e"]+[Variation "Richter-Veresov: 3...g6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 g6 *++[ECO "D01f"]+[Variation "Richter-Veresov: 3...c6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 c6 *++[ECO "D01g"]+[Variation "Richter-Veresov: 3...c5"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 c5 *++[ECO "D01h"]+[Variation "Richter-Veresov: 3...Bf5"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 *++[ECO "D01i"]+[Variation "Richter-Veresov: 3...Bf5 4.f3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 4.f3 *++[ECO "D01j"]+[Variation "Richter-Veresov: 3...Bf5 4.Nf3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 4.Nf3 *++[ECO "D01k"]+[Variation "Richter-Veresov: 3...Bf5 4.Bxf6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 4.Bxf6 *++[ECO "D01l"]+[Variation "Richter-Veresov: 3...Nbd7"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Nbd7 *++[ECO "D01m"]+[Variation "Richter-Veresov: 3...Nbd7 4.f3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Nbd7 4.f3 *++[ECO "D01n"]+[Variation "Richter-Veresov: 3...Nbd7 4.Nf3"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Nbd7 4.Nf3 *++[ECO "D01o"]+[Variation "Richter-Veresov: 3...Nbd7 4.Nf3 h6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Nbd7 4.Nf3 h6 *++[ECO "D01p"]+[Variation "Richter-Veresov: 3...Nbd7 4.Nf3 g6"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Nbd7 4.Nf3 g6 *++[ECO "D02a"]+[Variation "Queen's Pawn: 2.Nf3"]+[Result "*"]+1.d4 d5 2.Nf3 *++[ECO "D02a"]+[Variation "Queen's Pawn: 2.Nf3 g6"]+[Result "*"]+1.d4 d5 2.Nf3 g6 *++[ECO "D02a"]+[Variation "Queen's Pawn: 2.Nf3 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Bg4 *++[ECO "D02b"]+[Variation "Queen's Pawn: 2.Nf3 c6"]+[Result "*"]+1.d4 d5 2.Nf3 c6 *++[ECO "D02c"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 c6 3.Bf4 *++[ECO "D02c"]+[Variation "Queen's Pawn: London, Alapin Variation"]+[Result "*"]+1.d4 d5 2.Nf3 c6 3.Bf4 Qb6 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5 3.e3"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.e3 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5 3.e3 c6"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.e3 c6 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5 3.Bf4"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.Bf4 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5 3.Bf4 c6"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.Bf4 c6 *++[ECO "D02d"]+[Variation "Queen's Pawn: 2.Nf3 Bf5 3.Bf4 e6"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.Bf4 e6 *++[ECO "D02e"]+[Variation "Queen's Pawn: 2.Nf3 Nc6"]+[Result "*"]+1.d4 d5 2.Nf3 Nc6 *++[ECO "D02f"]+[Variation "Queen's Pawn: 2.Nf3 Nc6 3.Bf4"]+[Result "*"]+1.d4 d5 2.Nf3 Nc6 3.Bf4 *++[ECO "D02g"]+[Variation "Queen's Pawn: 2.Nf3 Nc6 3.g3"]+[Result "*"]+1.d4 d5 2.Nf3 Nc6 3.g3 *++[ECO "D02g"]+[Variation "Queen's Pawn: 2.Nf3 Nc6 3.g3 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nc6 3.g3 Bg4 *++[ECO "D02h"]+[Variation "Queen's Pawn: 2.Nf3 e6"]+[Result "*"]+1.d4 d5 2.Nf3 e6 *++[ECO "D02i"]+[Variation "Queen's Pawn: 2.Nf3 e6 3.g3"]+[Result "*"]+1.d4 d5 2.Nf3 e6 3.g3 *++[ECO "D02i"]+[Variation "Queen's Pawn: 2.Nf3 e6 3.g3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 e6 3.g3 c5 *++[ECO "D02i"]+[Variation "Queen's Pawn: 2.Nf3 e6 3.g3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 e6 3.g3 c5 4.Bg2 *++[ECO "D02i"]+[Variation "Queen's Pawn: 2.Nf3 e6 3.g3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 e6 3.g3 c5 4.Bg2 cxd4 5.Nxd4 *++[ECO "D02i"]+[Variation "Queen's Pawn: 2.Nf3 e6 3.g3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 e6 3.g3 c5 4.Bg2 cxd4 5.Nxd4 e5 *++[ECO "D02j"]+[Variation "Queen's Pawn: Krause Variation"]+[Result "*"]+1.d4 d5 2.Nf3 c5 *++[ECO "D02j"]+[Variation "Queen's Pawn: Krause, 3.c4"]+[Result "*"]+1.d4 d5 2.Nf3 c5 3.c4 *++[ECO "D02j"]+[Variation "Queen's Pawn: Krause, Reversed Slav"]+[Result "*"]+1.d4 d5 2.Nf3 c5 3.c3 *++[ECO "D02j"]+[Variation "Queen's Pawn: Krause, Reversed QGD"]+[Result "*"]+1.d4 d5 2.Nf3 c5 3.e3 *++[ECO "D02j"]+[Variation "Queen's Pawn: Krause, Reversed QGA"]+[Result "*"]+1.d4 d5 2.Nf3 c5 3.dxc5 *++[ECO "D02k"]+[Variation "Queen's Pawn: 2.Nf3 Nf6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 *++[ECO "D02k"]+[Variation "Queen's Pawn: 3.c3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.c3 *++[ECO "D02l"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 *++[ECO "D02m"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 Bf5 *++[ECO "D02n"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 e6 *++[ECO "D02o"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 c5 *++[ECO "D02p"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 c5 4.e3 e6 *++[ECO "D02p"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 c5 4.e3 e6 5.c3 Nc6 *++[ECO "D02q"]+[Variation "Queen's Pawn: London"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 e6 4.e3 c5 5.c3 Nc6 6.Bd3 Bd6 *++[ECO "D02r"]+[Variation "Queen's Pawn: 3.g3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 *++[ECO "D02s"]+[Variation "Queen's Pawn: 3.g3 c6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 *++[ECO "D02s"]+[Variation "Queen's Pawn: 3.g3 c6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 4.Bg2 *++[ECO "D02t"]+[Variation "Queen's Pawn: 3.g3 c6 4.Bg2 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 4.Bg2 Bg4 *++[ECO "D02t"]+[Variation "Queen's Pawn: 3.g3 c6 4.Bg2 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 4.Bg2 Bg4 5.O-O *++[ECO "D02t"]+[Variation "Queen's Pawn: 3.g3 c6 4.Bg2 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 4.Bg2 Bg4 5.O-O Nbd7 *++[ECO "D02t"]+[Variation "Queen's Pawn: 3.g3 c6 4.Bg2 Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 c6 4.Bg2 Bg4 5.O-O Nbd7 6.Nbd2 e6 *++[ECO "D02u"]+[Variation "Queen's Pawn: 3.g3 g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 g6 *++[ECO "D02u"]+[Variation "Queen's Pawn: 3.g3 g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 *++[ECO "D02u"]+[Variation "Queen's Pawn: 3.g3 g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.g3 g6 4.Bg2 Bg7 5.O-O O-O *++[ECO "D03a"]+[Variation "Torre Attack (Tartakower)"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 *++[ECO "D03b"]+[Variation "Torre Attack: 3...Ne4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 Ne4 *++[ECO "D03c"]+[Variation "Torre Attack: 3...Ne4 4.Bf4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 Ne4 4.Bf4 *++[ECO "D03d"]+[Variation "Torre Attack: 3...e6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 *++[ECO "D03e"]+[Variation "Torre Attack: 3...e6 4.e3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 *++[ECO "D03f"]+[Variation "Torre Attack: 3...e6 4.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 Nbd7 *++[ECO "D03f"]+[Variation "Torre Attack: 3...e6 4.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 Nbd7 5.Nbd2 Be7 *++[ECO "D03g"]+[Variation "Torre Attack: 3...e6 4.e3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 c5 *++[ECO "D03h"]+[Variation "Torre Attack: 3...e6 4.e3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 c5 5.Nbd2 Nbd7 *++[ECO "D03i"]+[Variation "Torre Attack: 3...e6 4.e3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 c5 5.Nbd2 Be7 *++[ECO "D03j"]+[Variation "Torre Attack: 3...e6 4.e3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 e6 4.e3 c5 5.Nbd2 Be7 6.c3 Nbd7 *++[ECO "D03k"]+[Variation "Torre Attack: 3...g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 *++[ECO "D03k"]+[Variation "Torre Attack: 3...g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.c3 Bg7 *++[ECO "D03l"]+[Variation "Torre Attack: 3...g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 *++[ECO "D03l"]+[Variation "Torre Attack: 3...g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 *++[ECO "D03m"]+[Variation "Torre Attack: 3...g6 4.e3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.e3 *++[ECO "D03m"]+[Variation "Torre Attack: 3...g6 4.e3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.e3 Bg7 *++[ECO "D03n"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.e3 Bg7 5.Nbd2 *++[ECO "D03o"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.e3 Bg7 5.Nbd2 O-O *++[ECO "D03p"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.c3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.c3 *++[ECO "D03q"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.c3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.c3 Nbd7 *++[ECO "D03r"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.c3 Nbd7 7.Be2"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.c3 Nbd7 7.Be2 *++[ECO "D03s"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.Bd3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.e3 Bg7 5.Nbd2 O-O 6.Bd3 *++[ECO "D03t"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.Bd3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.Bd3 c5 *++[ECO "D03t"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.Bd3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.Bd3 c5 7.c3 *++[ECO "D03u"]+[Variation "Torre Attack: 3...g6 4.e3 Bg7 5.Nbd2 O-O 6.Bd3 c5 7.c3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.Bd3 c5 7.c3 Nbd7 *++[ECO "D04a"]+[Variation "Queen's Pawn: Colle"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 *++[ECO "D04b"]+[Variation "Colle: 3...Bg4"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 Bg4 *++[ECO "D04c"]+[Variation "Colle: 3...Bf5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 Bf5 *++[ECO "D04d"]+[Variation "Colle: 3...Bf5, Alekhine Variation"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 Bf5 4.Bd3 e6 *++[ECO "D04e"]+[Variation "Colle: 3...g6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 g6 *++[ECO "D04f"]+[Variation "Colle: 3...c6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 c6 *++[ECO "D04g"]+[Variation "Colle: 3...c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 c5 *++[ECO "D04h"]+[Variation "Colle: 3...c5 4.c3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 c5 4.c3 *++[ECO "D04i"]+[Variation "Colle: 3...c5 4.c3 Nc6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 c5 4.c3 Nc6 *++[ECO "D04j"]+[Variation "Colle: 3...c5 4.c3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 c5 4.c3 Nbd7 *++[ECO "D05a"]+[Variation "Colle: 3...e6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 *++[ECO "D05b"]+[Variation "Colle: 3...e6 4.Nbd2"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Nbd2 *++[ECO "D05c"]+[Variation "Colle: Zukertort Variation"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Nbd2 c5 5.b3 *++[ECO "D05d"]+[Variation "Colle: 3...e6 4.Bd3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 *++[ECO "D05e"]+[Variation "Colle: 3...e6 4.Bd3 c5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 *++[ECO "D05f"]+[Variation "Colle: Rubinstein's Attack"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.b3 *++[ECO "D05g"]+[Variation "Colle: Rubinstein's Attack, 5...Nc6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.b3 Nc6 *++[ECO "D05h"]+[Variation "Colle: 5.c3"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 *++[ECO "D05i"]+[Variation "Colle: 5.c3 Nbd7"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nbd7 *++[ECO "D05j"]+[Variation "Colle: 5.c3 Nc6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nc6 *++[ECO "D05k"]+[Variation "Colle: 5.c3 Nc6 6.Nbd2"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nc6 6.Nbd2 *++[ECO "D05l"]+[Variation "Colle: 5.c3 Nc6 6.Nbd2 Bd6"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nc6 6.Nbd2 Bd6 *++[ECO "D05m"]+[Variation "Colle: 5.c3 Nc6 6.Nbd2 Bd6 7.O-O O-O"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nc6 6.Nbd2 Bd6 7.O-O O-O *++[ECO "D05n"]+[Variation "Colle: 5.c3 Nc6 6.Nbd2 Bd6 7.O-O O-O 8.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 Nc6 6.Nbd2 Bd6 7.O-O O-O 8.dxc5 Bxc5 *++[ECO "D06a"]+[Variation "Queen's Gambit"]+[Result "*"]+1.d4 d5 2.c4 *++[ECO "D06b"]+[Variation "QGD: Austrian Defence"]+[Result "*"]+1.d4 d5 2.c4 c5 *++[ECO "D06b"]+[Variation "QGD: Austrian, Rubinstein Variation"]+[Result "*"]+1.d4 d5 2.c4 c5 3.cxd5 Nf6 *++[ECO "D06b"]+[Variation "QGD: Austrian, Rubinstein, 4.dxc5"]+[Result "*"]+1.d4 d5 2.c4 c5 3.cxd5 Nf6 4.dxc5 *++[ECO "D06c"]+[Variation "QGD: Austrian, Rubinstein, 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 c5 3.cxd5 Nf6 4.Nf3 *++[ECO "D06d"]+[Variation "QGD: Austrian, Rubinstein, 4.Nf3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 c5 3.cxd5 Nf6 4.Nf3 cxd4 *++[ECO "D06e"]+[Variation "QGD: Marshall Defence"]+[Result "*"]+1.d4 d5 2.c4 Nf6 *++[ECO "D06f"]+[Variation "QGD: Marshall Defence, 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.Nc3 *++[ECO "D06g"]+[Variation "QGD: Marshall Defence, 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.Nf3 *++[ECO "D06h"]+[Variation "QGD: Marshall Defence, 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.cxd5 *++[ECO "D06i"]+[Variation "QGD: Marshall Defence, 3.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.cxd5 Nxd5 *++[ECO "D06j"]+[Variation "QGD: Marshall Defence, 3.cxd5 Nxd5 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.cxd5 Nxd5 4.Nf3 *++[ECO "D06k"]+[Variation "QGD: Marshall Defence, 3.cxd5 Nxd5 4.e4"]+[Result "*"]+1.d4 d5 2.c4 Nf6 3.cxd5 Nxd5 4.e4 *++[ECO "D06l"]+[Variation "QGD: 2...Bf5"]+[Result "*"]+1.d4 d5 2.c4 Bf5 *++[ECO "D06l"]+[Variation "QGD: 2...Bf5 3.Qb3"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Qb3 *++[ECO "D06m"]+[Variation "QGD: 2...Bf5 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nc3 *++[ECO "D06m"]+[Variation "QGD: 2...Bf5 3.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nc3 e6 *++[ECO "D06n"]+[Variation "QGD: 2...Bf5 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nf3 *++[ECO "D06n"]+[Variation "QGD: 2...Bf5 3.Nf3 e6"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nf3 e6 *++[ECO "D06o"]+[Variation "QGD: 2...Bf5 3.Nf3 e6 4.Qb3"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nf3 e6 4.Qb3 *++[ECO "D06p"]+[Variation "QGD: 2...Bf5 3.Nf3 e6 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nf3 e6 4.Nc3 *++[ECO "D06q"]+[Variation "QGD: 2...Bf5 3.Nf3 e6 4.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.Nf3 e6 4.Nc3 Nf6 *++[ECO "D06r"]+[Variation "QGD: 2...Bf5 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.cxd5 *++[ECO "D06s"]+[Variation "QGD: 2...Bf5 3.cxd5 Bxb1 4.Rxb1"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.cxd5 Bxb1 4.Rxb1 *++[ECO "D06t"]+[Variation "QGD: 2...Bf5 3.cxd5 Bxb1 4.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.cxd5 Bxb1 4.Qa4+ *++[ECO "D06u"]+[Variation "QGD: 2...Bf5 3.cxd5 Bxb1 4.Qa4+ c6 5.Rxb1"]+[Result "*"]+1.d4 d5 2.c4 Bf5 3.cxd5 Bxb1 4.Qa4+ c6 5.Rxb1 *++[ECO "D07a"]+[Variation "QGD: Chigorin Defence"]+[Result "*"]+1.d4 d5 2.c4 Nc6 *++[ECO "D07b"]+[Variation "QGD: Chigorin, 3.e3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.e3 *++[ECO "D07c"]+[Variation "QGD: Chigorin, 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.cxd5 *++[ECO "D07c"]+[Variation "QGD: Chigorin, 3.cxd5, Main Line"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 *++[ECO "D07d"]+[Variation "QGD: Chigorin, 3.cxd5, Main Line, 7.bxc3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.bxc3 *++[ECO "D07e"]+[Variation "QGD: Chigorin, 3.cxd5 Main Line, 7.Bxc3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.Bxc3 *++[ECO "D07f"]+[Variation "QGD: Chigorin, 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 *++[ECO "D07g"]+[Variation "QGD: Chigorin, Lazard Gambit"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 e5 *++[ECO "D07h"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 *++[ECO "D07i"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4 4.e3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 4.e3 *++[ECO "D07j"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 4.Nc3 *++[ECO "D07k"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4 4.cxd5"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 4.cxd5 *++[ECO "D07l"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4 4.cxd5 Bxf3 5.dxc6"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 4.cxd5 Bxf3 5.dxc6 *++[ECO "D07m"]+[Variation "QGD: Chigorin, 3.Nf3 Bg4 4.cxd5 Bxf3 5.gxf3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nf3 Bg4 4.cxd5 Bxf3 5.gxf3 *++[ECO "D07n"]+[Variation "QGD: Chigorin, 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 *++[ECO "D07o"]+[Variation "QGD: Chigorin, Tartakower Gambit"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 e5 *++[ECO "D07p"]+[Variation "QGD: Chigorin, 3.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 Nf6 *++[ECO "D07q"]+[Variation "QGD: Chigorin, 3.Nc3 Nf6 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 Nf6 4.Nf3 *++[ECO "D07r"]+[Variation "QGD: Chigorin, 3.Nc3 Nf6 4.Nf3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 Nf6 4.Nf3 Bg4 *++[ECO "D07s"]+[Variation "QGD: Chigorin, 3.Nc3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 *++[ECO "D07t"]+[Variation "QGD: Chigorin, 3.Nc3 dxc4 4.d5"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 4.d5 *++[ECO "D07u"]+[Variation "QGD: Chigorin, 3.Nc3 dxc4 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 4.Nf3 *++[ECO "D07v"]+[Variation "QGD: Chigorin, 3.Nc3 dxc4 4.Nf3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 4.Nf3 Nf6 *++[ECO "D07w"]+[Variation "QGD: Chigorin, 3.Nc3 dxc4 4.Nf3 Nf6 5.e4"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 4.Nf3 Nf6 5.e4 *++[ECO "D08"]+[Variation "QGD: Albin Countergambit"]+[Result "*"]+1.d4 d5 2.c4 e5 *++[ECO "D08"]+[Variation "QGD: Albin, 3.e3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.e3 *++[ECO "D08"]+[Variation "QGD: Albin, 3.dxe5"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 *++[ECO "D08"]+[Variation "QGD: Albin, 3.dxe5 d4"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 *++[ECO "D08"]+[Variation "QGD: Albin, Lasker Trap"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.e3 Bb4+ 5.Bd2 dxe3 *++[ECO "D08"]+[Variation "QGD: Albin, 4.e4"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.e4 *++[ECO "D08"]+[Variation "QGD: Albin, 4.a3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.a3 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 *++[ECO "D08"]+[Variation "QGD: Albin, Alapin Variation"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 *++[ECO "D08"]+[Variation "QGD: Albin, Janowski Variation"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 f6 *++[ECO "D08"]+[Variation "QGD: Albin, Balogh Variation"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 Qe7 *++[ECO "D08"]+[Variation "QGD: Albin, Alapin, 5...Bg4"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 Bg4 *++[ECO "D08"]+[Variation "QGD: Albin, Krenosz Variation"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 Bg4 6.h3 Bxf3 7.Nxf3 Bb4+ 8.Bd2 Qe7 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6 5.a3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.a3 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6 5.a3 a5"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.a3 a5 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6 5.a3 Be6"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.a3 Be6 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6 5.a3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.a3 Bg4 *++[ECO "D08"]+[Variation "QGD: Albin, 4.Nf3 Nc6 5.a3 Bg4 6.Nbd2"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.a3 Bg4 6.Nbd2 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Nge7"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Nge7 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Bf5 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Bg4 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Bg4 6.Bg2 Qd7"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Bg4 6.Bg2 Qd7 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Bg4 6.Bg2 Qd7 7.O-O O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Bg4 6.Bg2 Qd7 7.O-O O-O-O *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.b3"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.b3 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Bg2"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Bg2 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Nbd2"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Nbd2 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Nbd2 Qd7"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Nbd2 Qd7 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Nbd2 Qd7 7.Bg2"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Nbd2 Qd7 7.Bg2 *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Nbd2 Qd7 7.Bg2 O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Nbd2 Qd7 7.Bg2 O-O-O *++[ECO "D09"]+[Variation "QGD: Albin, 5.g3 Be6 6.Nbd2 Qd7 7.Bg2 Nge7"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 Be6 6.Nbd2 Qd7 7.Bg2 Nge7 *++[ECO "D10a"]+[Variation "Slav Defence"]+[Result "*"]+1.d4 d5 2.c4 c6 *++[ECO "D10a"]+[Variation "Diemer-Duhm Gambit (DDG) vs. Slav/Caro-Kann"]+[Result "*"]+1.d4 d5 2.c4 c6 3.e4 *++[ECO "D10a"]+[Variation "Slav: 3.g3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.g3 *++[ECO "D10a"]+[Variation "Slav: 3.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Bf4 *++[ECO "D10b"]+[Variation "Slav: Exchange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 *++[ECO "D10b"]+[Variation "Slav: Exchange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 *++[ECO "D10c"]+[Variation "Slav: Exchange, 4.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Bf4 *++[ECO "D10d"]+[Variation "Slav: Exchange, 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nf3 *++[ECO "D10e"]+[Variation "Slav: Exchange, 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 *++[ECO "D10e"]+[Variation "Slav: Exchange, 4.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 Nf6 *++[ECO "D10e"]+[Variation "Slav: Exchange, 4.Nc3 Nf6 5.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 Nf6 5.Bf4 *++[ECO "D10f"]+[Variation "Slav: Exchange, 4.Nc3 Nf6 5.Bf4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 Nf6 5.Bf4 Nc6 *++[ECO "D10f"]+[Variation "Slav: Exchange, 4.Nc3 Nf6 5.Bf4 Nc6 6.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 Nf6 5.Bf4 Nc6 6.e3 *++[ECO "D10g"]+[Variation "Slav: Exchange, 4.Nc3 Nf6 5.Bf4 Nc6 6.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 cxd5 4.Nc3 Nf6 5.Bf4 Nc6 6.e3 a6 *++[ECO "D10h"]+[Variation "Slav: 3.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.e3 *++[ECO "D10h"]+[Variation "Slav: 3.e3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.e3 Bf5 *++[ECO "D10h"]+[Variation "Slav: 3.e3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.e3 Nf6 *++[ECO "D10i"]+[Variation "Slav: 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 *++[ECO "D10j"]+[Variation "Slav: Winawer Countergambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 *++[ECO "D10k"]+[Variation "Slav: Winawer Countergambit, 4.cxd5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.cxd5 *++[ECO "D10k"]+[Variation "Slav: Winawer Countergambit, 4.cxd5 cxd5 5.dxe5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.cxd5 cxd5 5.dxe5 *++[ECO "D10l"]+[Variation "Slav: Winawer Countergambit, 4.cxd5 cxd5 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.cxd5 cxd5 5.Nf3 *++[ECO "D10m"]+[Variation "Slav: Winawer Countergambit Accepted"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.dxe5 *++[ECO "D10m"]+[Variation "Slav: Winawer Countergambit Accepted, 6.Nd2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.dxe5 d4 5.Ne4 Qa5+ 6.Nd2 *++[ECO "D10n"]+[Variation "Slav: Winawer Countergambit Accepted, 6.Bd2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 4.dxe5 d4 5.Ne4 Qa5+ 6.Bd2 *++[ECO "D10o"]+[Variation "Slav: 3.Nc3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 *++[ECO "D10o"]+[Variation "Slav: 3.Nc3 dxc4 4.a4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.a4 *++[ECO "D10o"]+[Variation "Slav: 3.Nc3 dxc4 4.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.e3 *++[ECO "D10p"]+[Variation "Slav: 3.Nc3 dxc4 4.e4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.e4 *++[ECO "D10q"]+[Variation "Slav: 3.Nc3 dxc4 4.e4 b5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.e4 b5 *++[ECO "D10r"]+[Variation "Slav: 3.Nc3 dxc4 4.e4 b5 5.a4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.e4 b5 5.a4 *++[ECO "D10r"]+[Variation "Slav: 3.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 *++[ECO "D10s"]+[Variation "Slav: 3.Nc3 Nf6 4.Bg5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.Bg5 *++[ECO "D10t"]+[Variation "Slav: 3.Nc3 Nf6 4.Bg5 dxc4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.Bg5 dxc4 *++[ECO "D10u"]+[Variation "Slav: 3.Nc3 Nf6 4.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 *++[ECO "D10v"]+[Variation "Slav: 3.Nc3 Nf6 4.e3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 Bf5 *++[ECO "D10w"]+[Variation "Slav: 3.Nc3 Nf6 4.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 a6 *++[ECO "D10w"]+[Variation "Slav: 3.Nc3 Nf6 4.e3 a6 5.Bd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 a6 5.Bd3 *++[ECO "D10x"]+[Variation "Slav: 3.Nc3 Nf6 4.e3 a6 5.Qc2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 a6 5.Qc2 *++[ECO "D10y"]+[Variation "Slav: 3.Nc3 Nf6 4.e3 a6 5.Qc2 b5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 a6 5.Qc2 b5 *++[ECO "D11a"]+[Variation "Slav: 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 *++[ECO "D11b"]+[Variation "Slav: 3.Nf3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Bg4 *++[ECO "D11c"]+[Variation "Slav: 3.Nf3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Bf5 *++[ECO "D11c"]+[Variation "Slav: 3.Nf3 Bf5 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Bf5 4.Nc3 *++[ECO "D11c"]+[Variation "Slav: 3.Nf3 Bf5 4.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Bf5 4.Nc3 e6 *++[ECO "D11d"]+[Variation "Slav: 3.Nf3 Bf5 4.Nc3 e6 5.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Bf5 4.Nc3 e6 5.Qb3 *++[ECO "D11e"]+[Variation "Slav: 3.Nf3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 *++[ECO "D11e"]+[Variation "Slav: 3.Nf3 dxc4 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.Nc3 *++[ECO "D11e"]+[Variation "Slav: 3.Nf3 dxc4 4.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.e3 *++[ECO "D11e"]+[Variation "Slav: 3.Nf3 dxc4 4.e3 Be6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.e3 Be6 *++[ECO "D11f"]+[Variation "Slav: 3.Nf3 dxc4 4.e3 b5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.e3 b5 *++[ECO "D11f"]+[Variation "Slav: 3.Nf3 dxc4 4.e3 b5 5.a4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.e3 b5 5.a4 *++[ECO "D11f"]+[Variation "Slav: 3.Nf3 dxc4 4.e3 b5 5.a4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 dxc4 4.e3 b5 5.a4 e6 *++[ECO "D11g"]+[Variation "Slav: 3.Nf3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 *++[ECO "D11h"]+[Variation "Slav: 4.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Qb3 *++[ECO "D11i"]+[Variation "Slav: 4.Qc2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Qc2 *++[ECO "D11j"]+[Variation "Slav: 4.Qc2 g6 5.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Qc2 g6 5.Bf4 *++[ECO "D11k"]+[Variation "Slav: Breyer Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nbd2 *++[ECO "D11l"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.Nbd2 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.Nbd2 Bd6 *++[ECO "D11m"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.Nbd2 Be7 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Bd6 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Bd6 8.Bb2 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Bd6 8.Bb2 O-O 9.Nbd2 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Be7 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Be7 8.Bb2 *++[ECO "D11n"]+[Variation "Slav: Slav-Reti with b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bg4 5.Bg2 e6 6.O-O Nbd7 7.b3 Be7 8.Bb2 O-O 9.Nbd2 *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O Nbd7 *++[ECO "D11o"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O Be7 *++[ECO "D11p"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O h6 *++[ECO "D11p"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O h6 7.Nbd2 *++[ECO "D11p"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O h6 7.Nc3 *++[ECO "D11p"]+[Variation "Slav: Slav-Reti System"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.g3 Bf5 5.Bg2 e6 6.O-O h6 7.b3 *++[ECO "D11q"]+[Variation "Slav: 4.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 *++[ECO "D11r"]+[Variation "Slav: 4.e3 g6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 g6 *++[ECO "D11s"]+[Variation "Slav: 4.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 a6 *++[ECO "D11t"]+[Variation "Slav: 4.e3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bg4 *++[ECO "D11t"]+[Variation "Slav: 4.e3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bg4 5.Nc3 *++[ECO "D12a"]+[Variation "Slav: 4.e3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 *++[ECO "D12b"]+[Variation "Slav: 4.e3 Bf5 5.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Qb3 *++[ECO "D12c"]+[Variation "Slav: 4.e3 Bf5 5.cxd5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 *++[ECO "D12c"]+[Variation "Slav: 4.e3 Bf5 5.cxd5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 *++[ECO "D12d"]+[Variation "Slav: 4.e3 Bf5 5.cxd5 cxd5 6.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Qb3 *++[ECO "D12e"]+[Variation "Slav: 4.e3 Bf5 5.cxd5 cxd5 6.Qb3 Qc7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Qb3 Qc7 *++[ECO "D12f"]+[Variation "Slav: 4.e3 Bf5 5.cxd5 cxd5 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Nc3 *++[ECO "D12f"]+[Variation "Slav: 4.e3 Bf5 5.cxd5 cxd5 6.Nc3, Amsterdam Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Nc3 e6 7.Ne5 Nfd7 *++[ECO "D12g"]+[Variation "Slav: 4.e3 Bf5 5.Bd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Bd3 *++[ECO "D12h"]+[Variation "Slav: 4.e3 Bf5 5.Bd3 Bxd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Bd3 Bxd3 *++[ECO "D12i"]+[Variation "Slav: 4.e3 Bf5 5.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 *++[ECO "D12i"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 *++[ECO "D12j"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Be2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Be2 *++[ECO "D12k"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Bd3 *++[ECO "D12l"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3 *++[ECO "D12l"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3 7.Qxd3 *++[ECO "D12m"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3 7.Qxd3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Bd3 Bxd3 7.Qxd3 Nbd7 *++[ECO "D12n"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Nh4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Nh4 *++[ECO "D12o"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Nh4 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Nh4 Bg4 *++[ECO "D12p"]+[Variation "Slav: 4.e3 Bf5 5.Nc3 e6 6.Nh4 Be4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.Nc3 e6 6.Nh4 Be4 *++[ECO "D13a"]+[Variation "Slav: Exchange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 *++[ECO "D13b"]+[Variation "Slav: Exchange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 *++[ECO "D13c"]+[Variation "Slav: Exchange, 5.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 *++[ECO "D13d"]+[Variation "Slav: Exchange, 5.Nc3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Bf5 *++[ECO "D13e"]+[Variation "Slav: Exchange, 5.Nc3 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 a6 *++[ECO "D13f"]+[Variation "Slav: Exchange, 5.Nc3 a6 6.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 a6 6.Ne5 *++[ECO "D13g"]+[Variation "Slav: Exchange, 5.Nc3 a6 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 a6 6.Bf4 *++[ECO "D13h"]+[Variation "Slav: Exchange, 5.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 e6 *++[ECO "D13i"]+[Variation "Slav: Exchange, 5.Nc3 e6 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 e6 6.Bf4 *++[ECO "D13j"]+[Variation "Slav: Exchange, 5.Nc3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 *++[ECO "D13k"]+[Variation "Slav: Exchange, 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 *++[ECO "D13l"]+[Variation "Slav: Exchange, 6.Bf4 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 a6 *++[ECO "D13m"]+[Variation "Slav: Exchange, 6.Bf4 a6 7.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 a6 7.e3 *++[ECO "D13n"]+[Variation "Slav: Exchange, 6.Bf4 a6 7.e3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 a6 7.e3 Bg4 *++[ECO "D13o"]+[Variation "Slav: Exchange, 6.Bf4 a6 7.e3 Bg4 8.Be2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 a6 7.e3 Bg4 8.Be2 *++[ECO "D13p"]+[Variation "Slav: Exchange, 6.Bf4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 e6 *++[ECO "D13q"]+[Variation "Slav: Exchange, 6.Bf4 e6 7.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 e6 7.e3 *++[ECO "D13r"]+[Variation "Slav: Exchange, 6.Bf4 e6 7.e3 Be7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 e6 7.e3 Be7 *++[ECO "D13s"]+[Variation "Slav: Exchange, 6.Bf4 e6 7.e3 Bd6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 e6 7.e3 Bd6 *++[ECO "D13t"]+[Variation "Slav: Exchange, 6.Bf4 e6 7.e3 Bd6 8.Bxd6 Qxd6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 e6 7.e3 Bd6 8.Bxd6 Qxd6 *++[ECO "D14a"]+[Variation "Slav: Exchange, 6.Bf4 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 *++[ECO "D14b"]+[Variation "Slav: Exchange, 6.Bf4 Bf5 7.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 *++[ECO "D14c"]+[Variation "Slav: Exchange, 6.Bf4 Bf5 7.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 a6 *++[ECO "D14d"]+[Variation "Slav: Exchange, 6.Bf4 Bf5 7.e3 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 *++[ECO "D14e"]+[Variation "Slav: Exchange, 8.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Ne5 *++[ECO "D14f"]+[Variation "Slav: Exchange, 8.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Qb3 *++[ECO "D14g"]+[Variation "Slav: Exchange, Trifunovic Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Qb3 Bb4 *++[ECO "D14h"]+[Variation "Slav: Exchange, 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 *++[ECO "D14i"]+[Variation "Slav: Exchange, 8.Bd3 Bxd3 9.Qxd3 Bd6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 *++[ECO "D14j"]+[Variation "Slav: Exchange, 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6 *++[ECO "D14k"]+[Variation "Slav: Exchange, 8.Bd3 Main Line"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6 11.O-O O-O *++[ECO "D14l"]+[Variation "Slav: Exchange, 8.Bd3 Main Line, 12.Rac1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6 11.O-O O-O 12.Rac1 *++[ECO "D14m"]+[Variation "Slav: Exchange, 8.Bd3 Main Line, 12.Rfc1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6 11.O-O O-O 12.Rfc1 *++[ECO "D14n"]+[Variation "Slav: Exchange, 8.Bd3 Main Line, 12.Rfc1 Rfc8"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 Bxd3 9.Qxd3 Bd6 10.Bxd6 Qxd6 11.O-O O-O 12.Rfc1 Rfc8 *++[ECO "D14o"]+[Variation "Slav: Exchange, 8.Bb5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bb5 *++[ECO "D14p"]+[Variation "Slav: Exchange, 8.Bb5 Nd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bb5 Nd7 *++[ECO "D14q"]+[Variation "Slav: Exchange, 8.Bb5 Nd7 9.Qa4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bb5 Nd7 9.Qa4 *++[ECO "D15a"]+[Variation "Slav: 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 *++[ECO "D15b"]+[Variation "Slav: 4.Nc3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 Bf5 *++[ECO "D15b"]+[Variation "Slav: 4.Nc3 Bf5 5.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 Bf5 5.Qb3 *++[ECO "D15c"]+[Variation "Slav: Suechting Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 Qb6 *++[ECO "D15d"]+[Variation "Slav: Chameleon Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 *++[ECO "D15e"]+[Variation "Slav: Chameleon, 5.Bg5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.Bg5 *++[ECO "D15f"]+[Variation "Slav: Chameleon, 5.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.Ne5 *++[ECO "D15g"]+[Variation "Slav: Chameleon, 5.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.e3 *++[ECO "D15h"]+[Variation "Slav: Chameleon, 5.e3 b5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.e3 b5 *++[ECO "D15i"]+[Variation "Slav: Chameleon, 5.e3 b5 6.b3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.e3 b5 6.b3 *++[ECO "D15j"]+[Variation "Slav: Chameleon, 5.c5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.c5 *++[ECO "D15k"]+[Variation "Slav: Chameleon, 5.c5 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.c5 Nbd7 *++[ECO "D15l"]+[Variation "Slav: Chameleon, 5.a4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.a4 *++[ECO "D15m"]+[Variation "Slav: Chameleon, 5.a4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.a4 e6 *++[ECO "D15n"]+[Variation "Slav: Chameleon, 5.a4 e6 6.Bg5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.a4 e6 6.Bg5 *++[ECO "D15o"]+[Variation "Slav: Accepted"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 *++[ECO "D15p"]+[Variation "Slav: Accepted, 5.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.Ne5 *++[ECO "D15q"]+[Variation "Slav: Accepted, Alekhine"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e3 *++[ECO "D15r"]+[Variation "Slav: Accepted, Alekhine: 5...b5 6.a4 b4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e3 b5 6.a4 b4 *++[ECO "D15s"]+[Variation "Slav: Accepted, Alekhine: 5...b5 6.a4 b4 7.Nb1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e3 b5 6.a4 b4 7.Nb1 *++[ECO "D15t"]+[Variation "Slav: Geller (Tolush) Gambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 *++[ECO "D15t"]+[Variation "Slav: Geller Gambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 *++[ECO "D15u"]+[Variation "Slav: Geller Gambit, Spassky Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.Qc2 *++[ECO "D15v"]+[Variation "Slav: Geller Gambit, 6.e5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.e5 *++[ECO "D15w"]+[Variation "Slav: Geller Gambit, 6.e5 Nd5 7.Ng5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.e5 Nd5 7.Ng5 *++[ECO "D15x"]+[Variation "Slav: Geller Gambit, 6.e5 Nd5 7.a4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.e5 Nd5 7.a4 *++[ECO "D15y"]+[Variation "Slav: Geller Gambit, 6.e5 Nd5 7.a4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.e5 Nd5 7.a4 e6 *++[ECO "D16a"]+[Variation "Slav: Alapin"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 *++[ECO "D16b"]+[Variation "Slav: 5.a4 Nd5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Nd5 *++[ECO "D16c"]+[Variation "Slav: Soultanbeieff Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 e6 *++[ECO "D16d"]+[Variation "Slav: Murey Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 a5 *++[ECO "D16e"]+[Variation "Slav: Smyslov Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 *++[ECO "D16f"]+[Variation "Slav: Smyslov, 6.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.Ne5 *++[ECO "D16g"]+[Variation "Slav: Smyslov, 6.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e3 *++[ECO "D16h"]+[Variation "Slav: Smyslov, 6.e3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e3 Bg4 *++[ECO "D16i"]+[Variation "Slav: Smyslov, 6.e4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e4 *++[ECO "D16j"]+[Variation "Slav: Smyslov, 6.e4 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e4 Bg4 *++[ECO "D16k"]+[Variation "Slav: Smyslov, 6.e4 Bg4 7.Bxc4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e4 Bg4 7.Bxc4 e6 *++[ECO "D16l"]+[Variation "Slav: Bronstein (Steiner) Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 *++[ECO "D16m"]+[Variation "Slav: Bronstein, 6.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 *++[ECO "D16n"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 *++[ECO "D16o"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5 7.h3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 7.h3 *++[ECO "D16p"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5 7.g3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 7.g3 *++[ECO "D16q"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5 7.f3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 7.f3 *++[ECO "D16r"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5 7.f3 Nfd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 7.f3 Nfd7 *++[ECO "D16s"]+[Variation "Slav: Bronstein, 6.Ne5 Bh5 7.f3 Nfd7 8.Nxc4 e5 9.Ne4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 6.Ne5 Bh5 7.f3 Nfd7 8.Nxc4 e5 9.Ne4 *++[ECO "D17a"]+[Variation "Slav: Czech Defence"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 *++[ECO "D17b"]+[Variation "Slav: Czech, 6.Nh4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Nh4 *++[ECO "D17c"]+[Variation "Slav: Czech, 6.Nh4 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Nh4 e6 *++[ECO "D17d"]+[Variation "Slav: Czech, 6.Nh4 e6 7.Nxf5 exf5 8.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Nh4 e6 7.Nxf5 exf5 8.e3 *++[ECO "D17e"]+[Variation "Slav: Czech, 6.Nh4 Bc8"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Nh4 Bc8 *++[ECO "D17e"]+[Variation "Slav: Czech, 6.Nh4 Bc8 7.e3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Nh4 Bc8 7.e3 *++[ECO "D17f"]+[Variation "Slav: Central Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 *++[ECO "D17g"]+[Variation "Slav: Central, 6.Ne5 Na6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Na6 *++[ECO "D17g"]+[Variation "Slav: Central, 6.Ne5 Na6 7.f3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Na6 7.f3 *++[ECO "D17h"]+[Variation "Slav: Central, 6.Ne5 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Nbd7 *++[ECO "D17i"]+[Variation "Slav: Central, Carlsbad Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Nbd7 7.Nxc4 Qc7 8.g3 e5 *++[ECO "D17j"]+[Variation "Slav: Central, Carlsbad, Main Line"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Nbd7 7.Nxc4 Qc7 8.g3 e5 9.dxe5 Nxe5 10.Bf4 Nfd7 11.Bg2 f6 *++[ECO "D17k"]+[Variation "Slav: Central, 6.Ne5 e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 *++[ECO "D17k"]+[Variation "Slav: Central, 6.Ne5 e6 7.f3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 *++[ECO "D17l"]+[Variation "Slav: Central, Huebner (7...c5)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 c5 *++[ECO "D17m"]+[Variation "Slav: Central, 7.f3 Bb4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 *++[ECO "D17m"]+[Variation "Slav: Central, 7.f3 Bb4 8.Bg5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.Bg5 *++[ECO "D17n"]+[Variation "Slav: Central, 7.f3 Bb4 8.Nxc4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.Nxc4 *++[ECO "D17o"]+[Variation "Slav: Central, 7.f3 Bb4 8.e4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 *++[ECO "D17p"]+[Variation "Slav: Central, Piece-Sac Line"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 Bxe4 *++[ECO "D17q"]+[Variation "Slav: Central, Main Line"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 Bxe4 9.fxe4 Nxe4 10.Bd2 Qxd4 11.Nxe4 Qxe4+ 12.Qe2 Bxd2+ 13.Kxd2 *++[ECO "D17r"]+[Variation "Slav: Central, Main Line, 15.Nxc4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 Bxe4 9.fxe4 Nxe4 10.Bd2 Qxd4 11.Nxe4 Qxe4+ 12.Qe2 Bxd2+ 13.Kxd2 Qd5+ 14.Kc2 Na6 15.Nxc4 *++[ECO "D17s"]+[Variation "Slav: Central, Main Line, 15.Nxc4 O-O"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 Bxe4 9.fxe4 Nxe4 10.Bd2 Qxd4 11.Nxe4 Qxe4+ 12.Qe2 Bxd2+ 13.Kxd2 Qd5+ 14.Kc2 Na6 15.Nxc4 O-O *++[ECO "D17t"]+[Variation "Slav: Central, Main Line, 15.Nxc4 O-O-O"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 7.f3 Bb4 8.e4 Bxe4 9.fxe4 Nxe4 10.Bd2 Qxd4 11.Nxe4 Qxe4+ 12.Qe2 Bxd2+ 13.Kxd2 Qd5+ 14.Kc2 Na6 15.Nxc4 O-O-O *++[ECO "D18a"]+[Variation "Slav: Dutch Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 *++[ECO "D18b"]+[Variation "Slav: Dutch, Lasker Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 Na6 *++[ECO "D18c"]+[Variation "Slav: Dutch, 6...e6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 *++[ECO "D18d"]+[Variation "Slav: Dutch, 6...e6 7.Bxc4 Bb4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 *++[ECO "D18e"]+[Variation "Slav: Dutch, 8.O-O"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O *++[ECO "D18f"]+[Variation "Slav: Dutch, 8...Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 *++[ECO "D18g"]+[Variation "Slav: Dutch, 8...Nbd7 9.Nh4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Nh4 *++[ECO "D18h"]+[Variation "Slav: Dutch, 8...Nbd7 9.Nh4 Bg6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Nh4 Bg6 *++[ECO "D18i"]+[Variation "Slav: Dutch, 8...Nbd7 9.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qb3 *++[ECO "D18j"]+[Variation "Slav: Dutch, 8...Nbd7 9.Qb3 a5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qb3 a5 *++[ECO "D18k"]+[Variation "Slav: Dutch, 8...Nbd7 9.Qe2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qe2 *++[ECO "D18l"]+[Variation "Slav: Dutch, 8...Nbd7 9.Qe2 Bg6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qe2 Bg6 *++[ECO "D18m"]+[Variation "Slav: Dutch, 8...Nbd7 9.Qe2 Bg6 10.e4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qe2 Bg6 10.e4 *++[ECO "D18n"]+[Variation "Slav: Dutch, 8...O-O"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O *++[ECO "D18o"]+[Variation "Slav: Dutch, 8...O-O 9.Qb3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qb3 *++[ECO "D18p"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 *++[ECO "D18p"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Bg6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Bg6 *++[ECO "D18q"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Bg4 *++[ECO "D18r"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Nbd7 *++[ECO "D18s"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Nbd7 10.Nxf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Nbd7 10.Nxf5 *++[ECO "D18s"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Nbd7 10.Nxf5 exf5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Nbd7 10.Nxf5 exf5 *++[ECO "D18t"]+[Variation "Slav: Dutch, 8...O-O 9.Nh4 Nbd7 10.Nxf5 exf5 11.Qc2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Nh4 Nbd7 10.Nxf5 exf5 11.Qc2 *++[ECO "D19a"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 *++[ECO "D19b"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg4 *++[ECO "D19c"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 *++[ECO "D19d"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6 10.Rd1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 10.Rd1 *++[ECO "D19d"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6 10.Rd1 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 10.Rd1 Nbd7 *++[ECO "D19e"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6 10.Ne5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 10.Ne5 *++[ECO "D19e"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6 10.Ne5 Nbd7, 12.Rd1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 10.Ne5 Nbd7 *++[ECO "D19f"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Bg6 10.Ne5 Nbd7, 12.Rd1"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Bg6 10.Ne5 Nbd7 11.Nxg6 hxg6 12.Rd1 *++[ECO "D19g"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Ne4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Ne4 *++[ECO "D19g"]+[Variation "Slav: Dutch, Saemisch Variation"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Ne4 10.g4 *++[ECO "D19h"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 *++[ECO "D19i"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 *++[ECO "D19i"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg4"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg4 *++[ECO "D19j"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 *++[ECO "D19k"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 *++[ECO "D19l"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 h6"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 h6 *++[ECO "D19m"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Re8"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Re8 *++[ECO "D19n"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Bh5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Bh5 *++[ECO "D19o"]+[Variation "Slav: Dutch, 8...O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Bh5 12.e5"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Nbd7 10.e4 Bg6 11.Bd3 Bh5 12.e5 *++[ECO "D20a"]+[Variation "Queen's Gambit Accepted (QGA)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 *++[ECO "D20a"]+[Variation "QGA: 3.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Qa4+ *++[ECO "D20b"]+[Variation "QGA: 3.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 *++[ECO "D20c"]+[Variation "QGA: 3.e3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 c5 *++[ECO "D20c"]+[Variation "QGA: 3.e3 c5 4.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 c5 4.Bxc4 *++[ECO "D20c"]+[Variation "QGA: 3.e3 c5 4.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 c5 4.Bxc4 cxd4 5.exd4 *++[ECO "D20d"]+[Variation "QGA: 3.e3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e6 *++[ECO "D20d"]+[Variation "QGA: 3.e3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e6 4.Bxc4 Nf6 *++[ECO "D20e"]+[Variation "QGA: 3.e3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e5 *++[ECO "D20e"]+[Variation "QGA: 3.e3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e5 4.Bxc4 exd4 5.exd4 *++[ECO "D20f"]+[Variation "QGA: 3.e3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e5 4.Bxc4 exd4 5.exd4 Bb4+ *++[ECO "D20f"]+[Variation "QGA: 3.e3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e5 4.Bxc4 exd4 5.exd4 Bb4+ 5.Nc3 Nf6 *	; Move-number error ?++[ECO "D20g"]+[Variation "QGA: 3.e3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 e5 4.Bxc4 exd4 5.exd4 Nf6 *++[ECO "D20h"]+[Variation "QGA: 3.e3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e3 Nf6 *++[ECO "D20i"]+[Variation "QGA: 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 *++[ECO "D20i"]+[Variation "QGA: 3.Nc3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 c5 *++[ECO "D20i"]+[Variation "QGA: 3.Nc3 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 e5 *++[ECO "D20i"]+[Variation "QGA: 3.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 Nf6 *++[ECO "D20j"]+[Variation "QGA: 3.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 e6 *++[ECO "D20j"]+[Variation "QGA: 3.Nc3 e6 4.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 e6 4.e4 *++[ECO "D20k"]+[Variation "QGA: 3.Nc3 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 a6 *++[ECO "D20k"]+[Variation "QGA: 3.Nc3 a6 4.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nc3 a6 4.a4 *++[ECO "D20l"]+[Variation "QGA: 3.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 *++[ECO "D20l"]+[Variation "QGA: 3.e4, Schwartz Defence"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 f5 *++[ECO "D20m"]+[Variation "QGA: 3.e4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nc6 *++[ECO "D20m"]+[Variation "QGA: 3.e4 Nc6 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nc6 4.Nf3 *++[ECO "D20n"]+[Variation "QGA: 3.e4 Nc6 4.Be3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nc6 4.Be3 *++[ECO "D20o"]+[Variation "QGA: 3.e4 Nf6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 *++[ECO "D20o"]+[Variation "QGA: 3.e4 Nf6 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.Nc3 *++[ECO "D20o"]+[Variation "QGA: 3.e4 Nf6 4.e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 *++[ECO "D20o"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 *++[ECO "D20p"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 *++[ECO "D20p"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bd3 *++[ECO "D20p"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bd3 Nc6 *++[ECO "D20q"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3 *++[ECO "D20q"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3 Nc6 *++[ECO "D20r"]+[Variation "QGA: 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3 Nc6 7.Ne2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 Nf6 4.e5 Nd5 5.Bxc4 Nb6 6.Bb3 Nc6 7.Ne2 *++[ECO "D20s"]+[Variation "QGA: 3.e4 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 c5 *++[ECO "D20s"]+[Variation "QGA: 3.e4 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 c5 4.Nf3 *++[ECO "D20t"]+[Variation "QGA: 3.e4 c5 4.d5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 c5 4.d5 *++[ECO "D20u"]+[Variation "QGA: Linares Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 c5 4.d5 Nf6 5.Nc3 b5 *++[ECO "D20v"]+[Variation "QGA: 3.e4 e5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 e5 *++[ECO "D20w"]+[Variation "QGA: 3.e4 e5 4.Nf3 Bb4+"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 e5 4.Nf3 Bb4+ *++[ECO "D20x"]+[Variation "QGA: 3.e4 e5 4.Nf3 exd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 e5 4.Nf3 exd4 *++[ECO "D20y"]+[Variation "QGA: 3.e4 e5 4.Nf3 exd4 5.Bxc4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 e5 4.Nf3 exd4 5.Bxc4 Nc6 *++[ECO "D21a"]+[Variation "QGA: 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 *++[ECO "D21a"]+[Variation "QGA: Ericson Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 b5 *++[ECO "D21b"]+[Variation "QGA: 3.Nf3 Nd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nd7 *++[ECO "D21c"]+[Variation "QGA: 3.Nf3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Bg4 *++[ECO "D21d"]+[Variation "QGA: 3.Nf3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 e6 *++[ECO "D21e"]+[Variation "QGA: 3.Nf3 e6 4.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 e6 4.Qa4+ *++[ECO "D21f"]+[Variation "QGA: 3.Nf3 e6 4.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 e6 4.e4 *++[ECO "D21g"]+[Variation "QGA: 3.Nf3 e6 4.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 e6 4.e3 *++[ECO "D21g"]+[Variation "QGA: 3.Nf3 e6 4.e3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 e6 4.e3 c5 *++[ECO "D21h"]+[Variation "QGA: 3.Nf3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 *++[ECO "D21i"]+[Variation "QGA: 3.Nf3 c5 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.Nc3 *++[ECO "D21j"]+[Variation "QGA: 3.Nf3 c5 4.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.e3 *++[ECO "D21j"]+[Variation "QGA: 3.Nf3 c5 4.e3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.e3 cxd4 *++[ECO "D21k"]+[Variation "QGA: 3.Nf3 c5 4.e3 cxd4 5.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.e3 cxd4 5.Bxc4 *++[ECO "D21l"]+[Variation "QGA: 3.Nf3 c5 4.d5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 *++[ECO "D21m"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 *++[ECO "D21m"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.e4 *++[ECO "D21n"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 *++[ECO "D21o"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.Nc3 exd5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 *++[ECO "D21p"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 *++[ECO "D21q"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 Bd6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 Bd6 *++[ECO "D21r"]+[Variation "QGA: 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 Bd6 8.Nd2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 Bd6 8.Nd2 *++[ECO "D21s"]+[Variation "QGA: Seirawan Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 c5 4.d5 e6 5.Nc3 exd5 6.Qxd5 Qxd5 7.Nxd5 Bd6 8.Nd2 Ne7 *++[ECO "D21t"]+[Variation "QGA: Alekhine Defence"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 *++[ECO "D21u"]+[Variation "QGA: Alekhine, Borisenko-Furman Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e4 *++[ECO "D21v"]+[Variation "QGA: Alekhine, 4.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.a4 *++[ECO "D22a"]+[Variation "QGA: Alekhine, 4.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 *++[ECO "D22b"]+[Variation "QGA: Alekhine, Haberditz Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 b5 *++[ECO "D22c"]+[Variation "QGA: Alekhine, 4.e3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 e6 *++[ECO "D22d"]+[Variation "QGA: Alekhine, 4.e3 e6 5.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 e6 5.Bxc4 *++[ECO "D22e"]+[Variation "QGA: Alekhine, 4.e3 e6 5.Bxc4 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 e6 5.Bxc4 c5 *++[ECO "D22f"]+[Variation "QGA: Alekhine, 4.e3 e6 5.Bxc4 c5 6.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 e6 5.Bxc4 c5 6.Qe2 *++[ECO "D22g"]+[Variation "QGA: Alekhine, 4.e3 Bg4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 *++[ECO "D22h"]+[Variation "QGA: Alekhine, 4.e3 Bg4 5.Bxc4 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 *++[ECO "D22i"]+[Variation "QGA: Alekhine, Alatortsev Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 6.d5 *++[ECO "D22j"]+[Variation "QGA: Alekhine, 4.e3 Bg4 5.Bxc4 e6 6.Qb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 6.Qb3 *++[ECO "D22k"]+[Variation "QGA: Alekhine, 4.e3 Bg4 5.Bxc4 e6 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 6.Nc3 *++[ECO "D22l"]+[Variation "QGA: Alekhine, 4.e3 Bg4 5.Bxc4 e6 6.h3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 6.h3 *++[ECO "D23a"]+[Variation "QGA: 3.Nf3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 *++[ECO "D23b"]+[Variation "QGA: 3.Nf3 Nf6 4.g3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.g3 *++[ECO "D23c"]+[Variation "QGA: Mannheim Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ *++[ECO "D23d"]+[Variation "QGA: Mannheim, 4...Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ Nc6 *++[ECO "D23e"]+[Variation "QGA: Mannheim, 4...Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ Nc6 5.Nc3 *++[ECO "D23f"]+[Variation "QGA: Mannheim, 4...Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ Nbd7 *++[ECO "D23g"]+[Variation "QGA: Mannheim, 4...Nbd7 5.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ Nbd7 5.Nc3 e6 *++[ECO "D23h"]+[Variation "QGA: Mannheim, 4...Nbd7 5.Nc3 e6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ Nbd7 5.Nc3 e6 6.e4 *++[ECO "D23i"]+[Variation "QGA: Mannheim, 4...c6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 *++[ECO "D23i"]+[Variation "QGA: Mannheim, 4...c6 5.Qxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 *++[ECO "D23j"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 *++[ECO "D23k"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.Nc3 *++[ECO "D23l"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5 6.g3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 *++[ECO "D23m"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5 6.g3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 *++[ECO "D23m"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5 6.g3 e6 7.Bg2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 *++[ECO "D23n"]+[Variation "QGA: Mannheim, 4...c6, 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 *++[ECO "D23o"]+[Variation "QGA: Mannheim, Main Line"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 *++[ECO "D23p"]+[Variation "QGA: Mannheim, Main Line, 9...O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 O-O *++[ECO "D23q"]+[Variation "QGA: Mannheim, Main Line, 10.Bg5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 O-O 10.Bg5 *++[ECO "D23r"]+[Variation "QGA: Mannheim, Main Line, 10.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 O-O 10.e3 *++[ECO "D23s"]+[Variation "QGA: Mannheim, Main Line, 10.e3 Ne4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 O-O 10.e3 Ne4 *++[ECO "D23t"]+[Variation "QGA: Mannheim, Main Line, 10.e3 Ne4 11.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ c6 5.Qxc4 Bf5 6.g3 e6 7.Bg2 Nbd7 8.O-O Be7 9.Nc3 O-O 10.e3 Ne4 11.Qe2 *++[ECO "D24a"]+[Variation "QGA: 4.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 *++[ECO "D24a"]+[Variation "QGA: 4.Nc3 Nd5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 Nd5 *++[ECO "D24b"]+[Variation "QGA: 4.Nc3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 e6 *++[ECO "D24b"]+[Variation "QGA: 4.Nc3 e6 5.Bg5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 e6 5.Bg5 *++[ECO "D24b"]+[Variation "QGA: 4.Nc3 e6 5.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 e6 5.e4 *++[ECO "D24c"]+[Variation "QGA: 4.Nc3 e6 5.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 e6 5.e3 *++[ECO "D24d"]+[Variation "QGA: 4.Nc3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 *++[ECO "D24e"]+[Variation "QGA: 4.Nc3 c5 5.d5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 5.d5 *++[ECO "D24f"]+[Variation "QGA: 4.Nc3 c5 5.d5 e6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 5.d5 e6 6.e4 *++[ECO "D24g"]+[Variation "QGA: 4.Nc3 c5 5.d5 e6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 5.d5 e6 6.e4 exd5 7.e5 Nfd7 *++[ECO "D24g"]+[Variation "QGA: 4.Nc3 c5 5.d5 e6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 5.d5 e6 6.e4 exd5 7.e5 Nfd7 8.Bg5 *++[ECO "D24g"]+[Variation "QGA: 4.Nc3 c5 5.d5 e6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 c5 5.d5 e6 6.e4 exd5 7.e5 Nfd7 8.Bg5 Be7 *++[ECO "D24h"]+[Variation "QGA: 4.Nc3 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 *++[ECO "D24i"]+[Variation "QGA: 4.Nc3 a6 5.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.a4 *++[ECO "D24j"]+[Variation "QGA: 4.Nc3 a6 5.a4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.a4 Nc6 *++[ECO "D24j"]+[Variation "QGA: 4.Nc3 a6 5.a4 Nc6 5.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.a4 Nc6 6.e4 *++[ECO "D24k"]+[Variation "QGA: Bogoljubow"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 *++[ECO "D24l"]+[Variation "QGA: Bogoljubow, 7.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 *++[ECO "D24m"]+[Variation "QGA: Bogoljubow, 7.a4 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 e6 *++[ECO "D24n"]+[Variation "QGA: Bogoljubow, 7.a4 c6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 c6 *++[ECO "D24o"]+[Variation "QGA: Bogoljubow, 7.a4 Bb7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Bb7 *++[ECO "D24p"]+[Variation "QGA: Bogoljubow, 7.a4 Nb4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Nb4 *++[ECO "D24q"]+[Variation "QGA: Bogoljubow, 7.a4 Nxc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Nxc3 *++[ECO "D24r"]+[Variation "QGA: Bogoljubow, 7.a4 Nxc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Nxc3 8.bxc3 Bb7 *++[ECO "D24s"]+[Variation "QGA: Bogoljubow, 7.a4 Nxc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Nxc3 8.bxc3 Qd5 *++[ECO "D24t"]+[Variation "QGA: Bogoljubow, 7.a4 Nxc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 b5 6.e5 Nd5 7.a4 Nxc3 8.bxc3 Qd5 9.g3 Bb7 *++[ECO "D25a"]+[Variation "QGA: 4.e3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 *++[ECO "D25b"]+[Variation "QGA: 4.e3 c5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 c5 *++[ECO "D25c"]+[Variation "QGA: 4.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 a6 *++[ECO "D25d"]+[Variation "QGA: Smyslov Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 *++[ECO "D25d"]+[Variation "QGA: Smyslov, 5.Bxc4 Bg7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 5.Bxc4 Bg7 *++[ECO "D25d"]+[Variation "QGA: Smyslov, 5.Bxc4 Bg7 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 5.Bxc4 Bg7 6.Nc3 *++[ECO "D25e"]+[Variation "QGA: Smyslov, 5.Bxc4 Bg7 6.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 5.Bxc4 Bg7 6.O-O *++[ECO "D25e"]+[Variation "QGA: Smyslov, 5.Bxc4 Bg7 6.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 5.Bxc4 Bg7 6.O-O O-O *++[ECO "D25e"]+[Variation "QGA: Smyslov, 5.Bxc4 Bg7 6.O-O O-O 7.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 5.Bxc4 Bg7 6.O-O O-O 7.Nc3 *++[ECO "D25f"]+[Variation "QGA: Flohr Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Be6 *++[ECO "D25f"]+[Variation "QGA: Flohr, 5.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Be6 5.Nc3 *++[ECO "D25f"]+[Variation "QGA: Flohr, 5.Nc3 c6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Be6 5.Nc3 c6 *++[ECO "D25g"]+[Variation "QGA: Janowski-Larsen Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 *++[ECO "D25g"]+[Variation "QGA: Janowski-Larsen, 5.h3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.h3 *++[ECO "D25h"]+[Variation "QGA: Janowski-Larsen, 5.Bxc4 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 *++[ECO "D25i"]+[Variation "QGA: Janowski-Larsen, 6.Qb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.Qb3 *++[ECO "D25j"]+[Variation "QGA: Janowski-Larsen, 6.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.O-O *++[ECO "D25k"]+[Variation "QGA: Janowski-Larsen, 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.Nc3 *++[ECO "D25l"]+[Variation "QGA: Janowski-Larsen, 6.h3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 *++[ECO "D25m"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 *++[ECO "D25n"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 a6 *++[ECO "D25o"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 a6 8.g4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 a6 8.g4 *++[ECO "D25p"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 Nbd7 *++[ECO "D25q"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 Nbd7 8.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 Nbd7 8.O-O *++[ECO "D25r"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6 *++[ECO "D25r"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6 9.Be2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6 9.Be2 *++[ECO "D25s"]+[Variation "QGA: Janowski-Larsen, 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6 9.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 5.Bxc4 e6 6.h3 Bh5 7.Nc3 Nbd7 8.O-O Bd6 9.e4 *++[ECO "D26a"]+[Variation "QGA: 4.e3 e6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 *++[ECO "D26b"]+[Variation "QGA: 4.e3 e6 5.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 *++[ECO "D26c"]+[Variation "QGA: 4.e3 e6 5.Bxc4 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 a6 *++[ECO "D26d"]+[Variation "QGA: 4.e3 e6 5.Bxc4 a6 6.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 a6 6.O-O *++[ECO "D26e"]+[Variation "QGA: 4.e3 e6 5.Bxc4 a6 6.O-O b5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 a6 6.O-O b5 *++[ECO "D26f"]+[Variation "QGA: Classical Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 *++[ECO "D26g"]+[Variation "QGA: Classical, Early Queenswap"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.dxc5 *++[ECO "D26h"]+[Variation "QGA: Classical, 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Nc3 *++[ECO "D26i"]+[Variation "QGA: Classical, 6.Nc3 a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Nc3 a6 *++[ECO "D26j"]+[Variation "QGA: Classical, Furman Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 *++[ECO "D26k"]+[Variation "QGA: Classical, Furman, 6...cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 cxd4 *++[ECO "D26l"]+[Variation "QGA: Classical, Furman, 6...a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 a6 *++[ECO "D26m"]+[Variation "QGA: Classical, Furman, 6...a6 7.dxc5 Bxc5 8.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 a6 7.dxc5 Bxc5 8.O-O *++[ECO "D26n"]+[Variation "QGA: Classical, Furman, 6...a6 7.dxc5 Bxc5 8.O-O Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 a6 7.dxc5 Bxc5 8.O-O Nc6 *++[ECO "D26o"]+[Variation "QGA: Classical, Furman, 6...a6 7.dxc5 Bxc5 8.O-O b5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 a6 7.dxc5 Bxc5 8.O-O b5 *++[ECO "D26p"]+[Variation "QGA: Classical, 6.O-O"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O *++[ECO "D26q"]+[Variation "QGA: Classical, Steinitz Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O cxd4 *++[ECO "D26r"]+[Variation "QGA: Classical, 6.O-O Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O Nc6 *++[ECO "D26s"]+[Variation "QGA: Classical, 6.O-O Nc6 7.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O Nc6 7.Nc3 *++[ECO "D26t"]+[Variation "QGA: Classical, 6.O-O Nc6 7.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O Nc6 7.Qe2 *++[ECO "D27a"]+[Variation "QGA: Classical, 6...a6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 *++[ECO "D27a"]+[Variation "QGA: Classical, 6...a6 7.a3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a3 *++[ECO "D27b"]+[Variation "QGA: Classical, 6...a6 7.b3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.b3 *++[ECO "D27c"]+[Variation "QGA: Classical, 6...a6 7.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Nc3 *++[ECO "D27d"]+[Variation "QGA: Classical, 6...a6 7.Bd3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bd3 *++[ECO "D27e"]+[Variation "QGA: Classical, 6...a6 7.Bd3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bd3 Nbd7 *++[ECO "D27f"]+[Variation "QGA: Classical, 6...a6 7.Bb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bb3 *++[ECO "D27g"]+[Variation "QGA: Classical, 6...a6 7.Bb3 b5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bb3 b5 *++[ECO "D27h"]+[Variation "QGA: Classical, 6...a6 7.Bb3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bb3 cxd4 *++[ECO "D27i"]+[Variation "QGA: Classical, 6...a6 7.Bb3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bb3 Nc6 *++[ECO "D27j"]+[Variation "QGA: Classical, 6...a6 7.Bb3 Nc6 8.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Bb3 Nc6 8.Nc3 *++[ECO "D27k"]+[Variation "QGA: Classical, Geller Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.e4 *++[ECO "D27l"]+[Variation "QGA: Classical, Spassky Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.dxc5 *++[ECO "D27m"]+[Variation "QGA: Classical, Spassky, 7...Qxd1"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.dxc5 Qxd1 *++[ECO "D27n"]+[Variation "QGA: Classical, Spassky, 9.Nbd2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.dxc5 Qxd1 8.Rxd1 Bxc5 9.Nbd2 *++[ECO "D27o"]+[Variation "QGA: Classical, Spassky, 9.b3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.dxc5 Qxd1 8.Rxd1 Bxc5 9.b3 *++[ECO "D27p"]+[Variation "QGA: Classical, Rubinstein Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 *++[ECO "D27p"]+[Variation "QGA: Classical, Rubinstein, 7...Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 *++[ECO "D27q"]+[Variation "QGA: Classical, Rubinstein, 8.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Nc3 *++[ECO "D27r"]+[Variation "QGA: Classical, Rubinstein, 8.Nc3 Be7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Nc3 Be7 *++[ECO "D27s"]+[Variation "QGA: Classical, Rubinstein, 8.Nc3 Be7 9.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Nc3 Be7 9.Qe2 *++[ECO "D27t"]+[Variation "QGA: Classical, Rubinstein, 8.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Qe2 *++[ECO "D27u"]+[Variation "QGA: Classical, Rubinstein, 8.Qe2 Qc7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Qe2 Qc7 *++[ECO "D27v"]+[Variation "QGA: Classical, Rubinstein, 8.Qe2 cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Qe2 cxd4 *++[ECO "D27v"]+[Variation "QGA: Classical, Rubinstein, 8.Qe2 cxd4, 11.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Qe2 cxd4 9.Rd1 Be7 10.exd4 O-O 11.Nc3 *++[ECO "D27w"]+[Variation "QGA: Classical, Rubinstein, 8.Qe2 cxd4, 11.Nc3 Nd5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 Nc6 8.Qe2 cxd4 9.Rd1 Be7 10.exd4 O-O 11.Nc3 Nd5 *++[ECO "D28a"]+[Variation "QGA: Classical, 7.Qe2"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 *++[ECO "D28b"]+[Variation "QGA: Classical, 7.Qe2 cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 cxd4 *++[ECO "D28c"]+[Variation "QGA: Classical, 7.Qe2 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 Nc6 *++[ECO "D28d"]+[Variation "QGA: Classical, 7.Qe2 b5"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 *++[ECO "D28e"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bd3 *++[ECO "D28f"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bd3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bd3 cxd4 *++[ECO "D28g"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bd3 cxd4 9.exd4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bd3 cxd4 9.exd4 *++[ECO "D28h"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 *++[ECO "D28i"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 *++[ECO "D28j"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6 9.Rd1"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Rd1 *++[ECO "D28k"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6 9.Rd1 c4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Rd1 c4 *++[ECO "D28l"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6 9.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Nc3 *++[ECO "D28m"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6 9.Nc3 Bb7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Nc3 Bb7 *++[ECO "D28n"]+[Variation "QGA: Classical, 7.Qe2 b5 8.Bb3 Nc6 9.Nc3 Be7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Nc3 Be7 *++[ECO "D29a"]+[Variation "QGA: Classical, 8...Bb7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 *++[ECO "D29b"]+[Variation "QGA: Classical, 8...Bb7 9.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Nc3 *++[ECO "D29c"]+[Variation "QGA: Classical, 8...Bb7 9.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.a4 *++[ECO "D29d"]+[Variation "QGA: Classical, 8...Bb7 9.a4 b4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.a4 b4 *++[ECO "D29e"]+[Variation "QGA: Classical, 8...Bb7 9.a4 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.a4 Nbd7 *++[ECO "D29f"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 *++[ECO "D29g"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 *++[ECO "D29g"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.e4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.e4 *++[ECO "D29h"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.a4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.a4 *++[ECO "D29i"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.a4 b4"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.a4 b4 *++[ECO "D29j"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.Nc3"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 *++[ECO "D29k"]+[Variation "QGA: Classical, Smyslov Variation"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 Bd6 *++[ECO "D29l"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.Nc3 Qc7"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 Qc7 *++[ECO "D29m"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.Nc3 Qb8"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 Qb8 *++[ECO "D29n"]+[Variation "QGA: Classical, 8...Bb7 9.Rd1 Nbd7 10.Nc3 Qb6"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 Qb6 *++[ECO "D30a"]+[Variation "Queen's Gambit Declined (QGD)"]+[Result "*"]+1.d4 d5 2.c4 e6 *++[ECO "D30a"]+[Variation "QGD: 3.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.e3 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.e4 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG) Accepted"]+[Result "*"]+1.d4 d5 2.c4 e6 3.e4 dxe4 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): 4...f5"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 f5 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): Alapin Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.Be3 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): Duhm Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.a3 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): 5.f3"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.f3 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): Exchange Variation"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.f3 exf3 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): Keres Defence"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.f3 c5 *++[ECO "D30b"]+[Variation "Diemer-Duhm Gambit (DDG): Main Line"]+[Result "*"]+1.e4 e6 2.d4 d5 3.c4 dxe4 4.Nc3 Nf6 5.f3 Bb4 *++[ECO "D30c"]+[Variation "QGD: 3.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.g3 *++[ECO "D30d"]+[Variation "QGD: 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.cxd5 *++[ECO "D30d"]+[Variation "QGD: 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.cxd5 exd5 *++[ECO "D30d"]+[Variation "QGD: 3.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.cxd5 exd5 4.Nc3 *++[ECO "D30e"]+[Variation "QGD: 3.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Bf4 *++[ECO "D30f"]+[Variation "QGD: 3.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 *++[ECO "D30g"]+[Variation "QGD: 3.Nf3 Nbd7 (Westphalia)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nbd7 *++[ECO "D30h"]+[Variation "QGD: Tarrasch without Nc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 *++[ECO "D30h"]+[Variation "QGD: Tarrasch without Nc3: 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.e3 *++[ECO "D30h"]+[Variation "QGD: Tarrasch without Nc3: 4.e3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.e3 Nf6 *++[ECO "D30h"]+[Variation "QGD: Tarrasch without Nc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 *++[ECO "D30h"]+[Variation "QGD: Tarrasch without Nc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nf6 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nf6 6.Bg2 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nc6 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3 Nc6 6.Bg2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nc6 6.Bg2 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3 Nc6 6.Bg2 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nc6 6.Bg2 Nf6 *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: 5.g3 Nc6 6.Bg2 Nf6 7.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nc6 6.Bg2 Nf6 7.O-O *++[ECO "D30i"]+[Variation "QGD: Tarrasch without Nc3: Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c5 4.cxd5 exd5 5.g3 Nc6 6.Bg2 Nf6 7.O-O Be7 *++[ECO "D30j"]+[Variation "QGD: 3.Nf3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 *++[ECO "D30k"]+[Variation "QGD: 3.Nf3 c6 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.e3 *++[ECO "D30l"]+[Variation "QGD: 3.Nf3 c6 4.Nbd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.Nbd2 *++[ECO "D30m"]+[Variation "QGD: 3.Nf3 c6 4.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.Qc2 *++[ECO "D30n"]+[Variation "QGD: 3.Nf3 c6 4.Qc2 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.Qc2 Nf6 *++[ECO "D30o"]+[Variation "QGD: 3.Nf3 c6 4.Qc2 Nf6 5.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.Qc2 Nf6 5.Bg5 *++[ECO "D30p"]+[Variation "QGD: 3.Nf3 c6 4.Qc2 Nf6 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 c6 4.Qc2 Nf6 5.g3 *++[ECO "D30q"]+[Variation "QGD: 3.Nf3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 *++[ECO "D30r"]+[Variation "QGD: 3.Nf3 Nf6 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 *++[ECO "D30s"]+[Variation "QGD: 3.Nf3 Nf6 4.e3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 *++[ECO "D30t"]+[Variation "QGD: 3.Nf3 Nf6 4.e3 c6 5.Nbd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 *++[ECO "D30t"]+[Variation "QGD: Spielmann Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 g6 *++[ECO "D30t"]+[Variation "QGD: Stonewall Formation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Ne4 6.Bd3 f5 *++[ECO "D30t"]+[Variation "QGD: 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 *++[ECO "D30u"]+[Variation "QGD: 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 6.Bd3 *++[ECO "D30u"]+[Variation "QGD: Semmering Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 6.Bd3 c5 *++[ECO "D30v"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 *++[ECO "D30v"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 dxc4 *++[ECO "D30v"]+[Variation "QGD: Vienna Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Bb4+ *++[ECO "D30v"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Nbd7 *++[ECO "D30v"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5, Capablanca Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nbd2 *++[ECO "D30w"]+[Variation "QGD: Capablanca-Duras Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 h6 *++[ECO "D30x"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Be7 *++[ECO "D30x"]+[Variation "QGD: 3.Nf3 Nf6 4.Bg5 Be7 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Be7 5.e3 *++[ECO "D31a"]+[Variation "QGD: 3.Nc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 *++[ECO "D31a"]+[Variation "QGD: 3.Nc3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nc6 *++[ECO "D31a"]+[Variation "QGD: Alapin Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 b6 *++[ECO "D31b"]+[Variation "QGD: Janowski Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 a6 *++[ECO "D31c"]+[Variation "QGD: 3.Nc3 Bb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Bb4 *++[ECO "D31c"]+[Variation "QGD: 3.Nc3 Bb4 4.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Bb4 4.a3 *++[ECO "D31d"]+[Variation "QGD: Alatortsev Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 *++[ECO "D31d"]+[Variation "QGD: Alatortsev, 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.Nf3 *++[ECO "D31d"]+[Variation "QGD: Alatortsev, 4.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.Bf4 *++[ECO "D31e"]+[Variation "QGD: Alatortsev, Exchange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 *++[ECO "D31e"]+[Variation "QGD: Alatortsev, Exchange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 *++[ECO "D31e"]+[Variation "QGD: Alatortsev, 5.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 5.Bf4 *++[ECO "D31f"]+[Variation "QGD: Alatortsev, 5.Bf4 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 5.Bf4 c6 *++[ECO "D31g"]+[Variation "QGD: Alatortsev, 5.Bf4 c6 6.e3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 5.Bf4 c6 6.e3 Bf5 *++[ECO "D31h"]+[Variation "QGD: Alatortsev, 5.Bf4 c6 6.e3 Bf5 7.g4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 5.Bf4 c6 6.e3 Bf5 7.g4 *++[ECO "D31i"]+[Variation "Semi-Slav"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 *++[ECO "D31j"]+[Variation "Semi-Slav: 4.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.cxd5 *++[ECO "D31j"]+[Variation "Semi-Slav: 4.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.cxd5 exd5 *++[ECO "D31k"]+[Variation "Semi-Slav: 4.cxd5 exd5 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.cxd5 exd5 5.Nf3 *++[ECO "D31l"]+[Variation "Semi-Slav: 4.cxd5 exd5 5.Nf3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.cxd5 exd5 5.Nf3 Bf5 *++[ECO "D31m"]+[Variation "Semi-Slav: 4.cxd5 exd5 5.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.cxd5 exd5 5.Bf4 *++[ECO "D31n"]+[Variation "Semi-Slav: 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e3 *++[ECO "D31o"]+[Variation "Semi-Slav: 4.e3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e3 Nf6 *++[ECO "D31p"]+[Variation "Semi-Slav: 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 *++[ECO "D31q"]+[Variation "Semi-Slav: Noteboom Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 *++[ECO "D31r"]+[Variation "Semi-Slav: Noteboom, 5.a4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 *++[ECO "D31s"]+[Variation "Semi-Slav: Noteboom, 5.a4 Bb4 6.e3 b5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 *++[ECO "D31s"]+[Variation "Semi-Slav: Noteboom, Koomen Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 Qe7 *++[ECO "D31s"]+[Variation "Semi-Slav: Noteboom, Junge Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 Qb6 *++[ECO "D31t"]+[Variation "Semi-Slav: Noteboom, Abrahams Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 a5 *++[ECO "D31u"]+[Variation "Semi-Slav: Noteboom, Abrahams, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 a5 8.axb5 Bxc3 9.Bxc3 cxb5 10.b3 Bb7 *++[ECO "D31v"]+[Variation "Semi-Slav: Noteboom, Abrahams, Main Line, 14.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 a5 8.axb5 Bxc3 9.Bxc3 cxb5 10.b3 Bb7 11.bxc4 b4 12.Bb2 Nf6 13.Bd3 Nbd7 14.O-O O-O *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit, 4...Bb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 Bb4 *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit, 4...dxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit, Gunderam Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.f3 *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit, 5.Nxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 *++[ECO "D31w"]+[Variation "Semi-Slav: Marshall Gambit, 5.Nxe4 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Nf6 *++[ECO "D31x"]+[Variation "Semi-Slav: Marshall Gambit, 5.Nxe4 Bb4+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ *++[ECO "D31x"]+[Variation "Semi-Slav: Marshall Gambit, 5.Nxe4 Bb4+ 6.Nc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ 6.Nc3 *++[ECO "D31x"]+[Variation "Semi-Slav: Marshall Gambit, 5.Nxe4 Bb4+ 6.Bd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ 6.Bd2 *++[ECO "D31x"]+[Variation "Semi-Slav: Marshall Gambit, 8.Ne2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ 6.Bd2 Qxd4 7.Bxb4 Qxe4+ 8.Ne2 *++[ECO "D31y"]+[Variation "Semi-Slav: Marshall Gambit, 8.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ 6.Bd2 Qxd4 7.Bxb4 Qxe4+ 8.Be2 *++[ECO "D31z"]+[Variation "Semi-Slav: Marshall Gambit, 8.Be2 Na6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 dxe4 5.Nxe4 Bb4+ 6.Bd2 Qxd4 7.Bxb4 Qxe4+ 8.Be2 Na6 *++[ECO "D32a"]+[Variation "QGD Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 *++[ECO "D32a"]+[Variation "QGD Tarrasch: 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.e3 *++[ECO "D32b"]+[Variation "QGD Tarrasch: 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.Nf3 *++[ECO "D32c"]+[Variation "QGD Tarrasch: 4.Nf3 cxd4 5.Nxd4 e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.Nf3 cxd4 5.Nxd4 e5 *++[ECO "D32d"]+[Variation "QGD Tarrasch: 4.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 *++[ECO "D32d"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 *++[ECO "D32d"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 5.Qxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qxd4 *++[ECO "D32e"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 5.Qxd4 Nc6 6.Qd1 exd5 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qxd4 Nc6 6.Qd1 exd5 7.e3 *++[ECO "D32f"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 5.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qa4+ *++[ECO "D32f"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 7.Qxd5 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qa4+ Bd7 6.Qxd4 exd5 7.Qxd5 Nc6 *++[ECO "D32g"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 7.Qxd5 Nc6 8.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qa4+ Bd7 6.Qxd4 exd5 7.Qxd5 Nc6 8.Bg5 *++[ECO "D32h"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, 7.Qxd5 Nc6 8.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qa4+ Bd7 6.Qxd4 exd5 7.Qxd5 Nc6 8.Nf3 *++[ECO "D32i"]+[Variation "QGD Tarrasch: von Hennig-Schara Gambit, Main Line (11.Be2 O-O-O)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 5.Qa4+ Bd7 6.Qxd4 exd5 7.Qxd5 Nc6 8.Nf3 Nf6 9.Qd1 Bc5 10.e3 Qe7 11.Be2 O-O-O *++[ECO "D32j"]+[Variation "QGD Tarrasch: 4.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 *++[ECO "D32j"]+[Variation "QGD Tarrasch: 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.g3 *++[ECO "D32k"]+[Variation "QGD Tarrasch: 5.dxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.dxc5 *++[ECO "D32k"]+[Variation "QGD Tarrasch: 5.dxc5, Tarrasch Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.dxc5 d4 6.Na4 b5 *++[ECO "D32l"]+[Variation "QGD Tarrasch: Marshall Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.e4 *++[ECO "D32l"]+[Variation "QGD Tarrasch: Marshall Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.e4 dxe4 *++[ECO "D32l"]+[Variation "QGD Tarrasch: Marshall Gambit, Modern 6.Bc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.e4 dxe4 6.Bc4 *++[ECO "D32l"]+[Variation "QGD Tarrasch: Marshall Gambit, 6.d5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.e4 dxe4 6.d5 *++[ECO "D32m"]+[Variation "QGD Tarrasch: 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 *++[ECO "D32n"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 *++[ECO "D32o"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.Bf4 *++[ECO "D32o"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.Bf4 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.Bf4 Nf6 *++[ECO "D32p"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.Bg5 *++[ECO "D32q"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.Bg5 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.Bg5 Be7 *++[ECO "D32r"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 *++[ECO "D32r"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 *++[ECO "D32s"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Bb5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Bb5 *++[ECO "D32t"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 *++[ECO "D32u"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 Be7 *++[ECO "D32u"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 Be7 8.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 Be7 8.dxc5 Bxc5 *++[ECO "D32v"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 *++[ECO "D32v"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 *++[ECO "D32v"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O *++[ECO "D32w"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O O-O *++[ECO "D32x"]+[Variation "QGD Tarrasch: 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O O-O 10.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 cxd4 8.Nxd4 Bd6 9.O-O O-O 10.b3 *++[ECO "D33a"]+[Variation "QGD Tarrasch: 6.g3 (Schlecter/Rubinstein)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 *++[ECO "D33b"]+[Variation "QGD Tarrasch: 6.g3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 cxd4 *++[ECO "D33c"]+[Variation "QGD Tarrasch: Swedish Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 *++[ECO "D33d"]+[Variation "QGD Tarrasch: Swedish, Rey Ardid Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.e4 *++[ECO "D33e"]+[Variation "QGD Tarrasch: Swedish, 7.Bg2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 *++[ECO "D33f"]+[Variation "QGD Tarrasch: Swedish, 7.Bg2 Bb4 8.O-O Nge7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 *++[ECO "D33g"]+[Variation "QGD Tarrasch: Swedish, 9.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 9.a3 *++[ECO "D33h"]+[Variation "QGD Tarrasch: Swedish, 9.Bd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 9.Bd2 *++[ECO "D33i"]+[Variation "QGD Tarrasch: Swedish, 9.Ne5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 9.Ne5 *++[ECO "D33j"]+[Variation "QGD Tarrasch: Swedish, 9.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 9.e4 *++[ECO "D33k"]+[Variation "QGD Tarrasch: Swedish, 9.e4 dxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.Bg2 Bb4 8.O-O Nge7 9.e4 dxe4 *++[ECO "D33l"]+[Variation "QGD Tarrasch: 6.g3 Nf6 (Prague)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 *++[ECO "D33l"]+[Variation "QGD Tarrasch: 6.g3 Nf6 (Prague)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 *++[ECO "D33m"]+[Variation "QGD Tarrasch: 7.Bg2 Be6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be6 *++[ECO "D33n"]+[Variation "QGD Tarrasch: Wagner Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Bg4 *++[ECO "D33o"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 *++[ECO "D33o"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4 8.Nxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 8.Nxd4 *++[ECO "D33p"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4 8.Nxd4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 8.Nxd4 Be7 *++[ECO "D33p"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4 8.Nxd4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 8.Nxd4 Be7 9.O-O *++[ECO "D33p"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4 8.Nxd4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 8.Nxd4 Be7 9.O-O O-O *++[ECO "D33q"]+[Variation "QGD Tarrasch: 7.Bg2 cxd4 8.Nxd4 Be7 9.O-O O-O 10.Be3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 cxd4 8.Nxd4 Be7 9.O-O O-O 10.Be3 *++[ECO "D34a"]+[Variation "QGD Tarrasch: 7.Bg2 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 *++[ECO "D34a"]+[Variation "QGD Tarrasch: 7.Bg2 Be7 8.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O *++[ECO "D34b"]+[Variation "QGD Tarrasch: 7.Bg2 Be7 8.O-O Be6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O Be6 *++[ECO "D34c"]+[Variation "QGD Tarrasch: 8.O-O O-O (Main Line)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O *++[ECO "D34d"]+[Variation "QGD Tarrasch: 9.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.b3 *++[ECO "D34e"]+[Variation "QGD Tarrasch: 9.b3 Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.b3 Ne4 *++[ECO "D34f"]+[Variation "QGD Tarrasch: 9.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bf4 *++[ECO "D34g"]+[Variation "QGD Tarrasch: 9.Be3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Be3 *++[ECO "D34h"]+[Variation "QGD Tarrasch: 9.dxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 *++[ECO "D34h"]+[Variation "QGD Tarrasch: Tarrasch's Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 d4 *++[ECO "D34i"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 *++[ECO "D34j"]+[Variation "QGD Tarrasch: Reti Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Na4 *++[ECO "D34k"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 *++[ECO "D34k"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5 Be6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 Be6 *++[ECO "D34k"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5 Be6 11.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 Be6 11.Bxf6 *++[ECO "D34l"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5 d4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 d4 *++[ECO "D34m"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5 d4 11.Bxf6 Qxf6 12.Nd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 d4 11.Bxf6 Qxf6 12.Nd5 *++[ECO "D34n"]+[Variation "QGD Tarrasch: 9.dxc5 Bxc5 10.Bg5 d4 11.Bxf6: Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Bg5 d4 11.Bxf6 Qxf6 12.Nd5 Qd8 13.Nd2 Re8 *++[ECO "D34o"]+[Variation "QGD Tarrasch: 9.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 *++[ECO "D34o"]+[Variation "QGD Tarrasch: 9.Bg5 Be6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 Be6 *++[ECO "D34o"]+[Variation "QGD Tarrasch: Stoltz Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 Be6 10.Rc1 b6 *++[ECO "D34o"]+[Variation "QGD Tarrasch: Bogoljubow Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 Be6 10.Rc1 c4 *++[ECO "D34p"]+[Variation "QGD Tarrasch: 9.Bg5 c4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 c4 *++[ECO "D34q"]+[Variation "QGD Tarrasch: 9.Bg5 c4 10.Ne5 Be6 11.Nxc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 c4 10.Ne5 Be6 11.Nxc6 *++[ECO "D34r"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 *++[ECO "D34r"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 *++[ECO "D34s"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 *++[ECO "D34t"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 *++[ECO "D34u"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 *++[ECO "D34v"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Qb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Qb3 *++[ECO "D34w"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1 *++[ECO "D34x"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1 Bf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1 Bf8 *++[ECO "D34y"]+[Variation "QGD Tarrasch: 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1 Bf8 13.Nxc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 cxd4 10.Nxd4 h6 11.Be3 Re8 12.Rc1 Bf8 13.Nxc6 *++[ECO "D35a"]+[Variation "QGD: 3.Nc3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 *++[ECO "D35a"]+[Variation "QGD: 3.Nc3 Nf6 4.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.e3 *++[ECO "D35a"]+[Variation "QGD: Harrwitz Attack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bf4 *++[ECO "D35a"]+[Variation "QGD: Catalan without Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.g3 *++[ECO "D35b"]+[Variation "QGD: Exchange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 *++[ECO "D35b"]+[Variation "QGD: Exchange, 4...Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 Nxd5 *++[ECO "D35b"]+[Variation "QGD: Exchange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 *++[ECO "D35c"]+[Variation "QGD: Exchange, Saemisch Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bf4 *++[ECO "D35d"]+[Variation "QGD: Exchange, 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 *++[ECO "D35d"]+[Variation "QGD: Exchange, 5.Nf3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 c6 *++[ECO "D35d"]+[Variation "QGD: Exchange, 5.Nf3 c6 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 c6 6.e3 *++[ECO "D35e"]+[Variation "QGD: Exchange, 5.Nf3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Nbd7 *++[ECO "D35e"]+[Variation "QGD: Exchange, 5.Nf3 Nbd7 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Nbd7 6.e3 *++[ECO "D35e"]+[Variation "QGD: Exchange, 5.Nf3 Nbd7 6.e3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Nbd7 6.e3 c6 *++[ECO "D35f"]+[Variation "QGD: Exchange, 5.Nf3 Nbd7 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Nbd7 6.Bf4 *++[ECO "D35g"]+[Variation "QGD: Exchange, 5.Nf3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Be7 *++[ECO "D35g"]+[Variation "QGD: Exchange, 5.Nf3 Be7 6.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Be7 6.Bf4 *++[ECO "D35h"]+[Variation "QGD: Exchange, 5.Nf3 Be7 6.Bf4 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Be7 6.Bf4 c6 *++[ECO "D35h"]+[Variation "QGD: Exchange, 5.Nf3 Be7 6.Bf4 c6 7.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Be7 6.Bf4 c6 7.Qc2 *++[ECO "D35h"]+[Variation "QGD: Exchange, 5.Nf3 Be7 6.Bf4 c6 7.Qc2 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Be7 6.Bf4 c6 7.Qc2 Nbd7 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Nbd7 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5 Nbd7 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Nbd7 6.Nf3 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5 Nbd7 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Nbd7 6.e3 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 *++[ECO "D35i"]+[Variation "QGD: Exchange, 5.Bg5 Be7 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.Nf3 *++[ECO "D35j"]+[Variation "QGD: Exchange, 5.Bg5 Be7 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 *++[ECO "D35j"]+[Variation "QGD: Exchange, 5.Bg5 Be7 6.e3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 h6 *++[ECO "D35j"]+[Variation "QGD: Exchange, 5.Bg5 Be7 6.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 Nbd7 *++[ECO "D35k"]+[Variation "QGD: Exchange, 5.Bg5 Be7 6.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 O-O *++[ECO "D35l"]+[Variation "QGD: Exchange, 5.Bg5 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 *++[ECO "D35l"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Nf3 *++[ECO "D35m"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 *++[ECO "D35n"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Nbd7 *++[ECO "D35o"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 *++[ECO "D35o"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Nf3 *++[ECO "D35p"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Nf3 Bf5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Nf3 Bf5 *++[ECO "D35q"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Nf3 Bf5 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Nf3 Bf5 8.Bd3 *++[ECO "D35r"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 *++[ECO "D35s"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 Ne4 *++[ECO "D35t"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7 *++[ECO "D35t"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7 8.Nge2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7 8.Nge2 *++[ECO "D35u"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7 8.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 Nbd7 8.Nf3 *++[ECO "D35v"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O *++[ECO "D35v"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O 8.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O 8.Nf3 *++[ECO "D35v"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O 8.Nge2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.e3 Be7 7.Bd3 O-O 8.Nge2 *++[ECO "D36a"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 *++[ECO "D36a"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.Qc2 g6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 g6 *++[ECO "D36b"]+[Variation "QGD: Exchange, 5.Bg5 c6 6.Qc2 Na6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Na6 *++[ECO "D36c"]+[Variation "QGD: Exchange, 6.Qc2 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 *++[ECO "D36c"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.Nf3 *++[ECO "D36c"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.Nf3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.Nf3 Nbd7 *++[ECO "D36c"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.Nf3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.Nf3 O-O *++[ECO "D36d"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.Nf3 g6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.Nf3 g6 *++[ECO "D36e"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.Nf3 g6 8.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.Nf3 g6 8.e3 *++[ECO "D36f"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 *++[ECO "D36f"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 O-O *++[ECO "D36f"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 O-O 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 O-O 8.Bd3 *++[ECO "D36g"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 h6 *++[ECO "D36g"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 h6 8.Bh4 O-O *++[ECO "D36g"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 h6 8.Bh4 O-O 9.Bd3 Re8 *++[ECO "D36h"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 *++[ECO "D36h"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 Nbd7 8.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Nf3 *++[ECO "D36i"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 Nbd7 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 *++[ECO "D36j"]+[Variation "QGD: Exchange, 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 Nf8 *++[ECO "D36k"]+[Variation "QGD: Exchange, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O *++[ECO "D36k"]+[Variation "QGD: Exchange, Main Line, 9.Nge2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 *++[ECO "D36k"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 h6 *++[ECO "D36k"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 h6 10.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 h6 10.Bh4 *++[ECO "D36l"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 Re8 *++[ECO "D36m"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 Re8 10.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 Re8 10.O-O *++[ECO "D36m"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 Re8 10.O-O Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 Re8 10.O-O Nf8 *++[ECO "D36n"]+[Variation "QGD: Exchange, Main Line, 9.Nge2 Re8 10.O-O Nf8 11.f3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nge2 Re8 10.O-O Nf8 11.f3 *++[ECO "D36o"]+[Variation "QGD: Exchange, Main Line, 9.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 *++[ECO "D36o"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 h6 *++[ECO "D36o"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 h6 10.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 h6 10.Bh4 *++[ECO "D36p"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 *++[ECO "D36p"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.h3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.h3 *++[ECO "D36p"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.h3 Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.h3 Nf8 *++[ECO "D36q"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.h3 Nf8 11.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.h3 Nf8 11.Bf4 *++[ECO "D36r"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O-O *++[ECO "D36r"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O-O h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O-O h6 11.Bh4 *++[ECO "D36r"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O-O Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O-O Nf8 *++[ECO "D36r"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O-O Nf8 11.h3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O-O Nf8 11.h3 *++[ECO "D36s"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O *++[ECO "D36t"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O h6 *++[ECO "D36t"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O h6 11.Bf4 *++[ECO "D36t"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O h6 11.Bh4 *++[ECO "D36u"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 *++[ECO "D36v"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8 11.Rae1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 11.Rae1 *++[ECO "D36w"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8 11.h3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 11.h3 *++[ECO "D36x"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8 11.h3 g6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 11.h3 g6 *++[ECO "D36y"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8 11.Rab1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 11.Rab1 *++[ECO "D36z"]+[Variation "QGD: Exchange, Main Line, 9.Nf3 Re8 10.O-O Nf8 11.Rab1 a5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 Be7 7.e3 Nbd7 8.Bd3 O-O 9.Nf3 Re8 10.O-O Nf8 11.Rab1 a5 *++[ECO "D37a"]+[Variation "QGD: 4.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 *++[ECO "D37b"]+[Variation "QGD: Westphalia without Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Nbd7 *++[ECO "D37c"]+[Variation "QGD: Westphalia: 4.Nf3 Nbd7 5.Bf4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Nbd7 5.Bf4 *++[ECO "D37d"]+[Variation "QGD: 4.Nf3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 *++[ECO "D37d"]+[Variation "QGD: 4.Nf3 Be7 5.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.cxd5 Nxd5 *++[ECO "D37e"]+[Variation "QGD: 4.Nf3 Be7 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.e3 *++[ECO "D37f"]+[Variation "QGD: 4.Nf3 Be7 5.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.e3 O-O *++[ECO "D37f"]+[Variation "QGD: 4.Nf3 Be7 5.e3 O-O 6.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.e3 O-O 6.b3 *++[ECO "D37g"]+[Variation "QGD: 4.Nf3 Be7 5.e3 O-O 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.e3 O-O 6.Bd3 *++[ECO "D37h"]+[Variation "QGD: Classical Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 *++[ECO "D37i"]+[Variation "QGD: Classical, 5...O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O *++[ECO "D37j"]+[Variation "QGD: Classical, 5...O-O 6.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 Nbd7 *++[ECO "D37k"]+[Variation "QGD: Classical, 5...O-O 6.e3 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 b6 *++[ECO "D37l"]+[Variation "QGD: Classical, 5...O-O 6.e3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c6 *++[ECO "D37m"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 *++[ECO "D37n"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 *++[ECO "D37o"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 *++[ECO "D37p"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.a3 *++[ECO "D37q"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.cxd5 *++[ECO "D37r"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 *++[ECO "D37s"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 *++[ECO "D37t"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5 *++[ECO "D37u"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5 10.Rd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5 10.Rd1 *++[ECO "D37v"]+[Variation "QGD: Classical, 5...O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5 10.O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 O-O 6.e3 c5 7.dxc5 Bxc5 8.Qc2 Nc6 9.a3 Qa5 10.O-O-O *++[ECO "D38a"]+[Variation "QGD: Ragozin"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 *++[ECO "D38b"]+[Variation "QGD: Ragozin, 5.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Qa4+ *++[ECO "D38c"]+[Variation "QGD: Ragozin, 5.Qa4+ Nc6 6.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Qa4+ Nc6 6.cxd5 *++[ECO "D38d"]+[Variation "QGD: Ragozin, 5.Qa4+ Nc6 6.cxd5 exd5 7.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Qa4+ Nc6 6.cxd5 exd5 7.Bg5 *++[ECO "D38e"]+[Variation "QGD: Ragozin, 5.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.cxd5 *++[ECO "D38f"]+[Variation "QGD: Ragozin, 5.cxd5 exd5 6.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.cxd5 exd5 6.Bg5 *++[ECO "D38g"]+[Variation "QGD: Ragozin, 5.cxd5 exd5 6.Bg5 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.cxd5 exd5 6.Bg5 h6 *++[ECO "D38g"]+[Variation "QGD: Ragozin, 5.cxd5 exd5 6.Bg5 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.cxd5 exd5 6.Bg5 h6 7.Bh4 *++[ECO "D38h"]+[Variation "QGD: Ragozin, 5.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 *++[ECO "D38i"]+[Variation "QGD: Ragozin, Westphalia Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 Nbd7 *++[ECO "D38j"]+[Variation "QGD: Ragozin, Westphalia, 7.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 Nbd7 6.cxd5 exd5 7.Qc2 *++[ECO "D38k"]+[Variation "QGD: Ragozin, Westphalia, 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 Nbd7 6.cxd5 exd5 7.e3 *++[ECO "D38l"]+[Variation "QGD: Ragozin, 5.Bg5 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 *++[ECO "D38m"]+[Variation "QGD: Ragozin, 5.Bg5 h6 6.Bxf6 Qxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 6.Bxf6 Qxf6 *++[ECO "D38n"]+[Variation "QGD: Ragozin, 5.Bg5 h6 6.Bxf6 Qxf6 7.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 6.Bxf6 Qxf6 7.cxd5 *++[ECO "D38n"]+[Variation "QGD: Ragozin, 5.Bg5 h6 6.Bxf6 Qxf6 7.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 6.Bxf6 Qxf6 7.cxd5 exd5 *++[ECO "D38o"]+[Variation "QGD: Ragozin, 5.Bg5 h6 6.Bxf6 Qxf6 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 *++[ECO "D38p"]+[Variation "QGD: Ragozin, 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 O-O 8.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 O-O 8.Rc1 *++[ECO "D39a"]+[Variation "QGD: Ragozin, Vienna Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 *++[ECO "D39b"]+[Variation "QGD: Ragozin, Vienna, 6.Qa4+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.Qa4+ *++[ECO "D39c"]+[Variation "QGD: Ragozin, Vienna, 6.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 *++[ECO "D39d"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 *++[ECO "D39e"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.e5 *++[ECO "D39f"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.e5 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.e5 cxd4 *++[ECO "D39g"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.e5 cxd4 8.Qa4+ Nc6 9.O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.e5 cxd4 8.Qa4+ Nc6 9.O-O-O *++[ECO "D39h"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 *++[ECO "D39h"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 *++[ECO "D39h"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 8.Nxd4 *++[ECO "D39i"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4, 8...Qa5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 8.Nxd4 Qa5 *++[ECO "D39j"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4, 8...Bxc3+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 8.Nxd4 Bxc3+ *++[ECO "D39j"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4, 8...Bxc3+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 8.Nxd4 Bxc3+ 9.bxc3 *++[ECO "D39k"]+[Variation "QGD: Ragozin, Vienna, 6.e4 c5 7.Bxc4, 8...Bxc3+, 10.Bb5+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 6.e4 c5 7.Bxc4 cxd4 8.Nxd4 Bxc3+ 9.bxc3 Qa5 10.Bb5+ *++[ECO "D40a"]+[Variation "QGD: Semi-Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 *++[ECO "D40a"]+[Variation "QGD: Semi-Tarrasch, 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 *++[ECO "D40b"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Be7 *++[ECO "D40c"]+[Variation "QGD: Semi-Tarrasch, 5.e3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 cxd4 *++[ECO "D40d"]+[Variation "QGD: Semi-Tarrasch, 5.e3 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 a6 *++[ECO "D40e"]+[Variation "QGD: Semi-Tarrasch, 5.e3 a6 6.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 a6 6.cxd5 *++[ECO "D40e"]+[Variation "QGD: Semi-Tarrasch, 5.e3 a6 6.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 a6 6.cxd5 exd5 *++[ECO "D40f"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 *++[ECO "D40g"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.Bd3 *++[ECO "D40h"]+[Variation "QGD: Semi-Tarrasch, Symmetrical Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.Bd3 Bd6 7.O-O O-O *++[ECO "D40i"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 *++[ECO "D40j"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 Ne4 *++[ECO "D40k"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 dxc4 *++[ECO "D40l"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 cxd4 *++[ECO "D40l"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7 *++[ECO "D40m"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7 8.c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7 8.c5 *++[ECO "D40n"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 cxd4 7.exd4 Be7 8.Bd3 *++[ECO "D40o"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 a6 *++[ECO "D40p"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 a6 7.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 a6 7.b3 *++[ECO "D40q"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 a6 7.dxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 a6 7.dxc5 *++[ECO "D40q"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 a6 7.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 a6 7.dxc5 Bxc5 *++[ECO "D40r"]+[Variation "QGD: Semi-Tarrasch, 5.e3 Nc6 6.a3 a6 7.dxc5 Bxc5 8.b4 Ba7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.a3 a6 7.dxc5 Bxc5 8.b4 Ba7 *++[ECO "D41a"]+[Variation "QGD: Semi-Tarrasch, 5.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 *++[ECO "D41b"]+[Variation "QGD: Semi-Tarrasch, Keres Counterattack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 cxd4 *++[ECO "D41c"]+[Variation "QGD: Semi-Tarrasch, 5.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 *++[ECO "D41c"]+[Variation "QGD: Semi-Tarrasch, 6.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 *++[ECO "D41c"]+[Variation "QGD: Semi-Tarrasch, 6.g3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 *++[ECO "D41c"]+[Variation "QGD: Semi-Tarrasch, 6.g3 Nc6 7.Bg2 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 *++[ECO "D41d"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O *++[ECO "D41e"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.e4 *++[ECO "D41f"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.e4 Nb6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.e4 Nb6 *++[ECO "D41g"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.e4 Ndb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.e4 Ndb4 *++[ECO "D41h"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.Nxd5 *++[ECO "D41i"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.Nxd5 exd5 10.dxc5 Bxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.Nxd5 exd5 10.dxc5 Bxc5 *++[ECO "D41j"]+[Variation "QGD: Semi-Tarrasch, 6.g3, Main Line, 9.Nxd5 exd5 10.dxc5 Bxc5 11.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.g3 Nc6 7.Bg2 Be7 8.O-O O-O 9.Nxd5 exd5 10.dxc5 Bxc5 11.Bg5 *++[ECO "D41k"]+[Variation "QGD: Semi-Tarrasch, 6.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 *++[ECO "D41k"]+[Variation "QGD: Semi-Tarrasch, 6.e4 Nxc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 *++[ECO "D41k"]+[Variation "QGD: Semi-Tarrasch, 6.e4, 8.cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 *++[ECO "D41l"]+[Variation "QGD: Semi-Tarrasch, 6.e4, 8.cxd4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Nc6 *++[ECO "D41m"]+[Variation "QGD: Semi-Tarrasch, 6.e4, 8.cxd4 Bb4+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ *++[ECO "D41m"]+[Variation "QGD: Semi-Tarrasch, 6.e4, San Sebastian Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Qa5 *++[ECO "D41m"]+[Variation "QGD: Semi-Tarrasch, 6.e4, Kmoch Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bb5 *++[ECO "D41n"]+[Variation "QGD: Semi-Tarrasch, 6.e4, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bc4 *++[ECO "D41n"]+[Variation "QGD: Semi-Tarrasch, 6.e4, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bc4 Nc6 12.O-O *++[ECO "D41o"]+[Variation "QGD: Semi-Tarrasch, 6.e4, Main Line, 12...b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bc4 Nc6 12.O-O b6 *++[ECO "D41o"]+[Variation "QGD: Semi-Tarrasch, 6.e4, Main Line, 12...b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bc4 Nc6 12.O-O b6 13.Rad1 *++[ECO "D41p"]+[Variation "QGD: Semi-Tarrasch, 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 *++[ECO "D41p"]+[Variation "QGD: Semi-Tarrasch, 6.e3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 cxd4 *++[ECO "D41p"]+[Variation "QGD: Semi-Tarrasch, 6.e3 cxd4 7.exd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 cxd4 7.exd4 *++[ECO "D41q"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 *++[ECO "D41r"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 *++[ECO "D41r"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 *++[ECO "D41r"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 *++[ECO "D41s"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 9.O-O O-O *++[ECO "D41t"]+[Variation "QGD: Semi-Tarrasch, 7.Bc4 Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nxc3 11.bxc3 *++[ECO "D41t"]+[Variation "QGD: Semi-Tarrasch, 7.Bc4 Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nxc3 11.bxc3 b6 12.Bd3 Bb7 *++[ECO "D41u"]+[Variation "QGD: Semi-Tarrasch, 7.Bc4 Main Line, 13.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nxc3 11.bxc3 b6 12.Bd3 Bb7 13.Qc2 *++[ECO "D41v"]+[Variation "QGD: Semi-Tarrasch, 7.Bc4 Main Line, 13.h4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bc4 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nxc3 11.bxc3 b6 12.Bd3 Bb7 13.h4 *++[ECO "D42a"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 *++[ECO "D42b"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bd3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 Be7 *++[ECO "D42c"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bd3 Be7 8.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 Be7 8.O-O O-O *++[ECO "D42d"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bd3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 *++[ECO "D42d"]+[Variation "QGD: Semi-Tarrasch, 6.e3 Nc6 7.Bd3 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 *++[ECO "D42e"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 *++[ECO "D42f"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 9.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O *++[ECO "D42g"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.a3 *++[ECO "D42h"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.a3 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.a3 Nf6 *++[ECO "D42i"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.a3 Bf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.a3 Bf6 *++[ECO "D42j"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 *++[ECO "D42k"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Ncb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Ncb4 *++[ECO "D42l"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 *++[ECO "D42l"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.Bg5 *++[ECO "D42m"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.a3 *++[ECO "D42m"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.a3 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.a3 b6 *++[ECO "D42m"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.a3 b6 12.Be3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.a3 b6 12.Be3 *++[ECO "D42n"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.a3 b6 12.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.a3 b6 12.Bg5 *++[ECO "D42o"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Nf6 11.a3 b6 12.Bc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Nf6 11.a3 b6 12.Bc2 *++[ECO "D42p"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Bf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Bf6 *++[ECO "D42p"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Bf6 11.Be4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Bf6 11.Be4 *++[ECO "D42q"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Bf6 11.Be4 Nce7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Bf6 11.Be4 Nce7 *++[ECO "D42r"]+[Variation "QGD: Semi-Tarrasch, 7.Bd3 Main Line, 10.Re1 Bf6 11.Be4 Nce7 12.Ne5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 cxd4 8.exd4 Be7 9.O-O O-O 10.Re1 Bf6 11.Be4 Nce7 12.Ne5 *++[ECO "D43a"]+[Variation "Semi-Slav"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 *++[ECO "D43b"]+[Variation "Semi-Slav: 5.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.g3 *++[ECO "D43c"]+[Variation "Semi-Slav: 5.Qd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Qd3 *++[ECO "D43d"]+[Variation "Semi-Slav: 5.Qb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Qb3 *++[ECO "D43e"]+[Variation "Semi-Slav: 5.Qb3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Qb3 dxc4 6.Qxc4 *++[ECO "D43f"]+[Variation "Semi-Slav: Botvinnik (Anti-Meran)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 *++[ECO "D43f"]+[Variation "Semi-Slav: Botvinnik, 5...Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 Be7 *++[ECO "D43g"]+[Variation "Semi-Slav: Botvinnik, 5...Be7 6.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 Be7 6.e3 *++[ECO "D43h"]+[Variation "Semi-Slav: Botvinnik, 5...Be7 6.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 Be7 6.e3 O-O *++[ECO "D43i"]+[Variation "Semi-Slav: Botvinnik, 5...Be7 6.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 Be7 6.e3 Nbd7 *++[ECO "D43j"]+[Variation "Semi-Slav: Botvinnik, 5...Be7 6.e3 Nbd7 7.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 Be7 6.e3 Nbd7 7.Bd3 *++[ECO "D43k"]+[Variation "Semi-Slav: Moscow Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 *++[ECO "D43k"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 *++[ECO "D43k"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 Be7 *++[ECO "D43k"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Be7 7.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 Be7 7.e3 O-O *++[ECO "D43k"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Gambit Accepted"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 dxc4 *++[ECO "D43l"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Gambit, 7.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 dxc4 7.e4 *++[ECO "D43m"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Gambit, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 dxc4 7.e4 g5 8.Bg3 b5 9.Be2 *++[ECO "D43n"]+[Variation "Semi-Slav: Moscow, 6.Bh4 Gambit, Main Line, 9...Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bh4 dxc4 7.e4 g5 8.Bg3 b5 9.Be2 Bb7 *++[ECO "D43o"]+[Variation "Semi-Slav: Moscow, 6.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 *++[ECO "D43p"]+[Variation "Semi-Slav: Moscow, 7.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.g3 *++[ECO "D43q"]+[Variation "Semi-Slav: Moscow, Hastings Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.Qb3 *++[ECO "D43r"]+[Variation "Semi-Slav: Moscow, 7.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.Qc2 *++[ECO "D43s"]+[Variation "Semi-Slav: Moscow, 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 *++[ECO "D43t"]+[Variation "Semi-Slav: Moscow, 7.e3 Nd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 *++[ECO "D43u"]+[Variation "Semi-Slav: Moscow, 7.e3 Nd7 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 *++[ECO "D43v"]+[Variation "Semi-Slav: Moscow, 7.e3 Nd7 8.Bd3 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 *++[ECO "D43v"]+[Variation "Semi-Slav: Moscow, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 9.Bxc4 g6 *++[ECO "D43v"]+[Variation "Semi-Slav: Moscow, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 9.Bxc4 g6 10.O-O *++[ECO "D43v"]+[Variation "Semi-Slav: Moscow, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 9.Bxc4 g6 10.O-O Bg7 *++[ECO "D43w"]+[Variation "Semi-Slav: Moscow, Main Line, 11.b4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 9.Bxc4 g6 10.O-O Bg7 11.b4 *++[ECO "D43x"]+[Variation "Semi-Slav: Moscow, Main Line, 11.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 Nd7 8.Bd3 dxc4 9.Bxc4 g6 10.O-O Bg7 11.Rc1 *++[ECO "D44a"]+[Variation "Semi-Slav: Botvinnik Accepted"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 *++[ECO "D44b"]+[Variation "Semi-Slav: Botvinnik, 6.a4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.a4 *++[ECO "D44c"]+[Variation "Semi-Slav: Botvinnik, 6.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 *++[ECO "D44c"]+[Variation "Semi-Slav: Botvinnik, 6.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 *++[ECO "D44d"]+[Variation "Semi-Slav: Botvinnik, 7.a4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.a4 *++[ECO "D44e"]+[Variation "Semi-Slav: Botvinnik, 7.e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 *++[ECO "D44f"]+[Variation "Semi-Slav: Botvinnik, 9.exf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.exf6 *++[ECO "D44g"]+[Variation "Semi-Slav: Botvinnik, Ekstrom Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.exf6 gxh4 10.Ne5 *++[ECO "D44h"]+[Variation "Semi-Slav: Botvinnik, 9.Nxg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 *++[ECO "D44i"]+[Variation "Semi-Slav: Botvinnik, Alatortsev Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 Nd5 *++[ECO "D44j"]+[Variation "Semi-Slav: Botvinnik, 9.Nxg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 *++[ECO "D44k"]+[Variation "Semi-Slav: Botvinnik, Lilienthal Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.g3 *++[ECO "D44l"]+[Variation "Semi-Slav: Botvinnik, Lilienthal, 11...Qa5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.g3 Qa5 *++[ECO "D44m"]+[Variation "Semi-Slav: Botvinnik, Lilienthal, 11...Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.g3 Bb7 *++[ECO "D44n"]+[Variation "Semi-Slav: Botvinnik, Szabo Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.Qf3 *++[ECO "D44o"]+[Variation "Semi-Slav: Botvinnik, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.exf6 *++[ECO "D44p"]+[Variation "Semi-Slav: Botvinnik, Main Line, 12.g3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.exf6 Bb7 12.g3 *++[ECO "D44q"]+[Variation "Semi-Slav: Botvinnik, Main Line, 12.g3 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.exf6 Bb7 12.g3 c5 *++[ECO "D44r"]+[Variation "Semi-Slav: Botvinnik, Main Line, 12.g3 c5 13.d5 Qb6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.exf6 Bb7 12.g3 c5 13.d5 Qb6 *++[ECO "D45a"]+[Variation "Semi-Slav: 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 *++[ECO "D45b"]+[Variation "Semi-Slav: 5.e3 Bd6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Bd6 *++[ECO "D45c"]+[Variation "Semi-Slav: 5.e3 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Be7 *++[ECO "D45d"]+[Variation "Semi-Slav: 5.e3 Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Ne4 *++[ECO "D45d"]+[Variation "Semi-Slav: Stonewall Defence"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Ne4 6.Bd3 f5 *++[ECO "D45e"]+[Variation "Semi-Slav: Accelerated Meran (Alekhine Variation)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 a6 *++[ECO "D45f"]+[Variation "Semi-Slav: 5.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 *++[ECO "D45f"]+[Variation "Semi-Slav: Rubinstein System"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Ne5 *++[ECO "D45g"]+[Variation "Semi-Slav: 6.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.a3 *++[ECO "D45h"]+[Variation "Semi-Slav: 6.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 *++[ECO "D45i"]+[Variation "Semi-Slav: 6.Qc2 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 b6 *++[ECO "D45j"]+[Variation "Semi-Slav: 6.Qc2 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Be7 *++[ECO "D45k"]+[Variation "Semi-Slav: 6.Qc2 Bd6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 *++[ECO "D45k"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.e4 *++[ECO "D45l"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.g4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.g4 *++[ECO "D45l"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.g4 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.g4 h6 *++[ECO "D45m"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.g4 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.g4 dxc4 *++[ECO "D45n"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.g4 Bb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.g4 Bb4 *++[ECO "D45o"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.g4 Nxg4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.g4 Nxg4 *++[ECO "D45p"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 *++[ECO "D45p"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 O-O *++[ECO "D45q"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3 O-O 8.Bb2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 O-O 8.Bb2 *++[ECO "D45r"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3 O-O 8.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 O-O 8.Be2 *++[ECO "D45s"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3 O-O 8.Be2 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 O-O 8.Be2 b6 *++[ECO "D45t"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.b3 O-O 8.Be2 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.b3 O-O 8.Be2 Re8 *++[ECO "D45u"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Bd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Bd2 *++[ECO "D45v"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 *++[ECO "D45v"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Be2 O-O 8.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 O-O 8.O-O *++[ECO "D45w"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Be2 O-O 8.O-O e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 O-O 8.O-O e5 *++[ECO "D45x"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Be2 O-O 8.O-O Qe7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 O-O 8.O-O Qe7 *++[ECO "D45y"]+[Variation "Semi-Slav: 6.Qc2 Bd6 7.Be2 O-O 8.O-O Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 O-O 8.O-O Re8 *++[ECO "D46a"]+[Variation "Semi-Slav: 6.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 *++[ECO "D46a"]+[Variation "Semi-Slav: 6.Bd3 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 a6 *++[ECO "D46b"]+[Variation "Semi-Slav: Romih Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bb4 *++[ECO "D46b"]+[Variation "Semi-Slav: Romih, 7.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bb4 7.O-O *++[ECO "D46b"]+[Variation "Semi-Slav: Romih, 7.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bb4 7.O-O O-O *++[ECO "D46c"]+[Variation "Semi-Slav: Bogoljubow Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Be7 *++[ECO "D46c"]+[Variation "Semi-Slav: Bogoljubow, 7.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Be7 7.O-O *++[ECO "D46c"]+[Variation "Semi-Slav: Bogoljubow, 7.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Be7 7.O-O O-O *++[ECO "D46d"]+[Variation "Semi-Slav: Bogoljubow, 7.O-O O-O 8.b3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Be7 7.O-O O-O 8.b3 *++[ECO "D46e"]+[Variation "Semi-Slav: Chigorin Defence"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 *++[ECO "D46e"]+[Variation "Semi-Slav: Chigorin, 7.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.e4 *++[ECO "D46e"]+[Variation "Semi-Slav: Chigorin, 7.e4 dxe4 8.Nxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.e4 dxe4 8.Nxe4 *++[ECO "D46f"]+[Variation "Semi-Slav: Chigorin, 7.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 *++[ECO "D46g"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 dxc4 *++[ECO "D46g"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 dxc4 8.Bxc4 *++[ECO "D46h"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O *++[ECO "D46i"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 *++[ECO "D46i"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 e5 *++[ECO "D46j"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...Qe7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 Qe7 *++[ECO "D46j"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...Qe7 10.Bd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 Qe7 10.Bd2 *++[ECO "D46j"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...Qe7 10.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 Qe7 10.a3 *++[ECO "D46j"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...Qe7 10.h3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 Qe7 10.h3 *++[ECO "D46k"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 a6 *++[ECO "D46k"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...a6 10.Rd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 a6 10.Rd1 *++[ECO "D46k"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...a6 10.Rd1 b5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 a6 10.Rd1 b5 *++[ECO "D46l"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...b5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 b5 *++[ECO "D46m"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...b5 10.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 b5 10.Be2 *++[ECO "D46m"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...b5 10.Be2 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 b5 10.Be2 Bb7 *++[ECO "D46m"]+[Variation "Semi-Slav: Chigorin, 7.Qc2 Main Line, 9...b5 10.Be2 Bb7 11.Rd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.Qc2 O-O 8.O-O dxc4 9.Bxc4 b5 10.Be2 Bb7 11.Rd1 *++[ECO "D46n"]+[Variation "Semi-Slav: Chigorin, 7.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O *++[ECO "D46o"]+[Variation "Semi-Slav: Chigorin, 7.O-O O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O *++[ECO "D46p"]+[Variation "Semi-Slav: Chigorin, 7.O-O O-O 8.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 *++[ECO "D46p"]+[Variation "Semi-Slav: Chigorin, 7.O-O O-O 8.e4 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxc4 *++[ECO "D46p"]+[Variation "Semi-Slav: Chigorin, 7.O-O O-O 8.e4 dxc4 9.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxc4 9.Bxc4 *++[ECO "D46p"]+[Variation "Semi-Slav: Chigorin, 7.O-O O-O 8.e4 dxc4 9.Bxc4 e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxc4 9.Bxc4 e5 *++[ECO "D46q"]+[Variation "Semi-Slav: Chigorin, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 *++[ECO "D46q"]+[Variation "Semi-Slav: Chigorin, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 *++[ECO "D46q"]+[Variation "Semi-Slav: Chigorin, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 Nxe4 10.Bxe4 *++[ECO "D46r"]+[Variation "Semi-Slav: Chigorin, Main Line, 10...h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 Nxe4 10.Bxe4 h6 *++[ECO "D46r"]+[Variation "Semi-Slav: Chigorin, Main Line, 10...h6 11.Bc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 Nxe4 10.Bxe4 h6 11.Bc2 *++[ECO "D46r"]+[Variation "Semi-Slav: Chigorin, Main Line, 10...h6 11.Bc2 e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 Nxe4 10.Bxe4 h6 11.Bc2 e5 *++[ECO "D47a"]+[Variation "Semi-Slav: Meran Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 *++[ECO "D47a"]+[Variation "Semi-Slav: Meran Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 *++[ECO "D47a"]+[Variation "Semi-Slav: Meran, 7...b5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 *++[ECO "D47b"]+[Variation "Semi-Slav: Meran, Freymann Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bb3 *++[ECO "D47c"]+[Variation "Semi-Slav: Meran, Freymann, 8...b4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bb3 b4 *++[ECO "D47d"]+[Variation "Semi-Slav: Meran, Capablanca Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 *++[ECO "D47d"]+[Variation "Semi-Slav: Meran, Capablanca, 8...b4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 b4 *++[ECO "D47e"]+[Variation "Semi-Slav: Meran, Capablanca, 8...a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 a6 *++[ECO "D47f"]+[Variation "Semi-Slav: Meran, Capablanca, 8...Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 Bb7 *++[ECO "D47f"]+[Variation "Semi-Slav: Meran, Capablanca, 8...Bb7 9.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 Bb7 9.O-O *++[ECO "D47g"]+[Variation "Semi-Slav: Meran, Capablanca, 8...Bb7 9.O-O a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Be2 Bb7 9.O-O a6 *++[ECO "D47h"]+[Variation "Semi-Slav: Meran, 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 *++[ECO "D47h"]+[Variation "Semi-Slav: Meran, 8.Bd3 Bd6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bd6 *++[ECO "D47i"]+[Variation "Semi-Slav: Meran, Lundin Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 *++[ECO "D47i"]+[Variation "Semi-Slav: Meran, Lundin, 9.Na4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 9.Na4 *++[ECO "D47j"]+[Variation "Semi-Slav: Meran, Lundin, 9.Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 9.Ne4 *++[ECO "D47k"]+[Variation "Semi-Slav: Meran, Lundin, 9.Ne4 Nxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 9.Ne4 Nxe4 *++[ECO "D47l"]+[Variation "Semi-Slav: Meran, Lundin, 9.Ne4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 9.Ne4 Be7 *++[ECO "D47l"]+[Variation "Semi-Slav: Meran, Lundin, 9.Ne4 Be7 10.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 9.Ne4 Be7 10.O-O *++[ECO "D47m"]+[Variation "Semi-Slav: Meran, Wade Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 *++[ECO "D47m"]+[Variation "Semi-Slav: Meran, Wade, 9.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.a3 *++[ECO "D47n"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O *++[ECO "D47n"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 *++[ECO "D47o"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4 10.Ne4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 10.Ne4 *++[ECO "D47o"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4 10.Ne4 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 10.Ne4 Be7 *++[ECO "D47p"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4 10.Ne4 Be7 11.Nxf6+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 10.Ne4 Be7 11.Nxf6+ *++[ECO "D47p"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4 10.Ne4 Be7 11.Nxf6+ Nxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 10.Ne4 Be7 11.Nxf6+ Nxf6 *++[ECO "D47p"]+[Variation "Semi-Slav: Meran, Wade, 9.O-O b4 10.Ne4 Be7 11.Nxf6+ Nxf6 12.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.O-O b4 10.Ne4 Be7 11.Nxf6+ Nxf6 12.e4 *++[ECO "D47q"]+[Variation "Semi-Slav: Meran, Wade, 9.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.e4 *++[ECO "D47r"]+[Variation "Semi-Slav: Meran, Wade, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.e4 b4 10.Na4 c5 11.e5 Nd5 *++[ECO "D47s"]+[Variation "Semi-Slav: Meran, Wade, Main Line, 12.Nxc5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.e4 b4 10.Na4 c5 11.e5 Nd5 12.Nxc5 *++[ECO "D47t"]+[Variation "Semi-Slav: Meran, Wade, Main Line, 12.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 9.e4 b4 10.Na4 c5 11.e5 Nd5 12.O-O *++[ECO "D48a"]+[Variation "Semi-Slav: Meran, 8...a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 *++[ECO "D48b"]+[Variation "Semi-Slav: Meran, 8...a6 9.a4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.a4 *++[ECO "D48c"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O *++[ECO "D48c"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O c5 *++[ECO "D48d"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O c5 10.Qe2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O c5 10.Qe2 *++[ECO "D48e"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 *++[ECO "D48f"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7 10.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 10.e4 *++[ECO "D48f"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7 10.e4 c5 11.d5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 10.e4 c5 11.d5 *++[ECO "D48g"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7 *++[ECO "D48g"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7 12.dxe6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7 12.dxe6 *++[ECO "D48g"]+[Variation "Semi-Slav: Meran, 8...a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7 12.dxe6 fxe6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.O-O Bb7 10.e4 c5 11.d5 Qc7 12.dxe6 fxe6 *++[ECO "D48h"]+[Variation "Semi-Slav: Meran, 8...a6 9.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 *++[ECO "D48i"]+[Variation "Semi-Slav: Meran, 8...a6 9.e4 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 Bb7 *++[ECO "D48j"]+[Variation "Semi-Slav: Meran, Pirc Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 b4 *++[ECO "D48k"]+[Variation "Semi-Slav: Meran, 8...a6 9.e4 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 *++[ECO "D48l"]+[Variation "Semi-Slav: Meran, Reynolds Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 *++[ECO "D48m"]+[Variation "Semi-Slav: Meran, Reynolds, 10...e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 e5 *++[ECO "D48n"]+[Variation "Semi-Slav: Meran, Reynolds, 10...Qc7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 Qc7 *++[ECO "D48o"]+[Variation "Semi-Slav: Meran, Reynolds, 10...c4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 c4 *++[ECO "D48p"]+[Variation "Semi-Slav: Meran, Reynolds, 10...c4 11.dxe6 fxe6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 c4 11.dxe6 fxe6 *++[ECO "D48p"]+[Variation "Semi-Slav: Meran, Reynolds, 10...c4 11.dxe6 fxe6 12.Bc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 c4 11.dxe6 fxe6 12.Bc2 *++[ECO "D48p"]+[Variation "Semi-Slav: Meran, Reynolds, 10...c4 11.dxe6 fxe6 12.Bc2 Qc7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 c4 11.dxe6 fxe6 12.Bc2 Qc7 *++[ECO "D48p"]+[Variation "Semi-Slav: Meran, Reynolds, 10...c4 11.dxe6 fxe6 12.Bc2 Qc7 13.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 c4 11.dxe6 fxe6 12.Bc2 Qc7 13.O-O *++[ECO "D48q"]+[Variation "Semi-Slav: Meran, Old Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 *++[ECO "D48r"]+[Variation "Semi-Slav: Meran, Rabinovich Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 Ng4 *++[ECO "D48s"]+[Variation "Semi-Slav: Meran, Old Main Line, 10...cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 *++[ECO "D49a"]+[Variation "Semi-Slav: Meran, Blumenfeld Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 *++[ECO "D49b"]+[Variation "Semi-Slav: Meran, Old Main Line, Gligoric Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Ng4 *++[ECO "D49c"]+[Variation "Semi-Slav: Meran, Old Main Line, Gligoric, 12.Qa4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Ng4 12.Qa4 *++[ECO "D49d"]+[Variation "Semi-Slav: Meran, Trifunovic Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Ng4 12.Qa4 Ngxe5 *++[ECO "D49e"]+[Variation "Semi-Slav: Meran, Sozin Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 *++[ECO "D49f"]+[Variation "Semi-Slav: Meran, Sozin, Rellstab Attack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.O-O *++[ECO "D49g"]+[Variation "Semi-Slav: Meran, Sozin, Stahlberg Attack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.Qf3 *++[ECO "D49g"]+[Variation "Semi-Slav: Meran, Sozin, Stahlberg Attack, 13...Bb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.Qf3 Bb4 *++[ECO "D49h"]+[Variation "Semi-Slav: Meran, Sozin, 13.Bxb5+"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.Bxb5+ *++[ECO "D49i"]+[Variation "Semi-Slav: Meran, Old Main Line, 11.Nxb5 axb5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 axb5 *++[ECO "D49j"]+[Variation "Semi-Slav: Meran, Old Main Line, Botvinnik Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 axb5 12.exf6 Qb6 *++[ECO "D49k"]+[Variation "Semi-Slav: Meran, Old Main Line, 11.Nxb5 axb5 12.exf6 gxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 axb5 12.exf6 gxf6 *++[ECO "D50"]+[Variation "QGD: 4.Bg5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 *++[ECO "D50"]+[Variation "QGD: 4.Bg5 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c6 *++[ECO "D50"]+[Variation "QGD: 4.Bg5 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 dxc4 *++[ECO "D50"]+[Variation "QGD: 4.Bg5 Bb4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Bb4 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian Gambit"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.e3 *++[ECO "D50"]+[Variation "QGD: Semi-Tarrasch, Pillsbury Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 *++[ECO "D50"]+[Variation "QGD: Semi-Tarrasch, Old Pillsbury Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Qxd4 *++[ECO "D50"]+[Variation "QGD: Semi-Tarrasch, Pillsbury, 6.Nxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Nxd4 *++[ECO "D50"]+[Variation "QGD: Semi-Tarrasch, Pillsbury, 6.Nxd4 e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Nxd4 e5 *++[ECO "D50"]+[Variation "QGD: Semi-Tarrasch, Pillsbury, Krause Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Nxd4 e5 7.Ndb5 a6 8.Qa4 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, 5.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, Canal (Venice) Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 Qb6 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, Prins Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 cxd4 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, Prins, 6.Qxd4 Be7 7.e4 Nc6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 cxd4 6.Qxd4 Be7 7.e4 Nc6 *++[ECO "D50"]+[Variation "QGD: Dutch-Peruvian, Prins, 6.Qxd4 Be7 7.e4 Nc6 8.Qd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 cxd4 6.Qxd4 Be7 7.e4 Nc6 8.Qd2 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.Nf3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 c6 *++[ECO "D51"]+[Variation "QGD: Rochlin Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 c6 6.Rc1 Qa5 7.Bd2 *++[ECO "D51"]+[Variation "QGD: Alekhine 4.Bg5 Nbd7 5.Nf3 c6 6.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 c6 6.e4 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 *++[ECO "D51"]+[Variation "QGD: Manhattan Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 Bb4 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.e3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 *++[ECO "D51"]+[Variation "QGD: Capablanca's Anti-Cambridge Springs"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.a3 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.e3 c6 6.cxd5 cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.cxd5 cxd5 *++[ECO "D51"]+[Variation "QGD: 4.Bg5 Nbd7 5.e3 c6 6.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Qc2 *++[ECO "D52a"]+[Variation "QGD: 4.Bg5 Nbd7 5.e3 c6 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 *++[ECO "D52b"]+[Variation "QGD: Cambridge Springs Defence"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 *++[ECO "D52c"]+[Variation "QGD: Cambridge Springs, Capablanca Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Bxf6 *++[ECO "D52d"]+[Variation "QGD: Cambridge Springs, 7.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.cxd5 *++[ECO "D52e"]+[Variation "QGD: Cambridge Springs, Yugoslav Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.cxd5 Nxd5 *++[ECO "D52f"]+[Variation "QGD: Cambridge Springs, Yugoslav, 8.Qd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.cxd5 Nxd5 8.Qd2 *++[ECO "D52g"]+[Variation "QGD: Cambridge Springs, 7.Nd2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 *++[ECO "D52h"]+[Variation "QGD: Cambridge Springs, Rubinstein Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 dxc4 *++[ECO "D52i"]+[Variation "QGD: Cambridge Springs, Bogoljubow Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 *++[ECO "D52j"]+[Variation "QGD: Cambridge Springs, Bogoljubow, 8.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 *++[ECO "D52k"]+[Variation "QGD: Cambridge Springs, 8.Qc2 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 dxc4 *++[ECO "D52l"]+[Variation "QGD: Cambridge Springs, 8.Qc2 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 O-O *++[ECO "D52m"]+[Variation "QGD: Cambridge Springs, Argentine Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 O-O 9.Bh4 *++[ECO "D52n"]+[Variation "QGD: Cambridge Springs, 8.Qc2 O-O 9.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 O-O 9.Be2 *++[ECO "D52o"]+[Variation "QGD: Cambridge Springs, 8.Qc2 O-O 9.Be2 e5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 O-O 9.Be2 e5 *++[ECO "D53a"]+[Variation "QGD: 4.Bg5 Be7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 *++[ECO "D53b"]+[Variation "QGD: 4.Bg5 Be7 5.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.cxd5 Nxd5 *++[ECO "D53c"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 *++[ECO "D53d"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 *++[ECO "D53e"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bxf6 *++[ECO "D53f"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bxf6 Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bxf6 Bxf6 *++[ECO "D53g"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bxf6 Bxf6 7.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bxf6 Bxf6 7.e3 *++[ECO "D53h"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bh4 *++[ECO "D53i"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O *++[ECO "D53j"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O 7.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O 7.Qc2 *++[ECO "D53k"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O 7.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 h6 6.Bh4 O-O 7.Rc1 *++[ECO "D53l"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 O-O *++[ECO "D53m"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 O-O 6.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 O-O 6.Qc2 *++[ECO "D53n"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 O-O 6.Qc2 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 O-O 6.Qc2 Nbd7 *++[ECO "D53o"]+[Variation "QGD: 4.Bg5 Be7 5.Nf3 O-O 6.Qc2 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 O-O 6.Qc2 c5 *++[ECO "D53p"]+[Variation "QGD: 4.Bg5 Be7 5.e3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 *++[ECO "D53q"]+[Variation "QGD: Early Lasker Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 Ne4 *++[ECO "D53r"]+[Variation "QGD: 4.Bg5 Be7 5.e3 Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 Nbd7 *++[ECO "D53s"]+[Variation "QGD: 4.Bg5 Be7 5.e3 Nbd7 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 Nbd7 6.Nf3 *++[ECO "D53t"]+[Variation "QGD: 4.Bg5 Be7 5.e3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 h6 *++[ECO "D53u"]+[Variation "QGD: 4.Bg5 Be7 5.e3 O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O *++[ECO "D53v"]+[Variation "QGD: 4.Bg5 Be7 5.e3 O-O 6.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Qc2 *++[ECO "D53v"]+[Variation "QGD: 4.Bg5 Be7 5.e3 O-O 6.Qc2 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Qc2 c5 *++[ECO "D54a"]+[Variation "QGD: Anti-Neo-Orthodox Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 *++[ECO "D54b"]+[Variation "QGD: Anti-Neo-Orthodox Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 h6 7.Bh4 *++[ECO "D54c"]+[Variation "QGD: Anti-Neo-Orthodox, 7.Bh4 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 h6 7.Bh4 b6 *++[ECO "D54c"]+[Variation "QGD: Anti-Neo-Orthodox, 8.cxd5 Nxd5 9.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 *++[ECO "D54d"]+[Variation "QGD: Anti-Neo-Orthodox, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 exd5 10.Bxe7 Qxe7 *++[ECO "D54e"]+[Variation "QGD: Anti-Neo-Orthodox, Main Line, 11.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 exd5 10.Bxe7 Qxe7 11.Be2 *++[ECO "D55a"]+[Variation "QGD: 6.Nf3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 *++[ECO "D55b"]+[Variation "QGD: Lasker without ...h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Ne4 *++[ECO "D55c"]+[Variation "QGD: 6.Nf3 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 b6 *++[ECO "D55d"]+[Variation "QGD: 6.Nf3 b6 7.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 b6 7.Be2 *++[ECO "D55e"]+[Variation "QGD: 6.Nf3 b6 7.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 b6 7.cxd5 exd5 *++[ECO "D55f"]+[Variation "QGD: 6.Nf3 b6 7.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 b6 7.cxd5 Nxd5 *++[ECO "D55g"]+[Variation "QGD: Neo-Orthodox Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 *++[ECO "D55h"]+[Variation "QGD: Neo-Orthodox, 7.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 *++[ECO "D55i"]+[Variation "QGD: Neo-Orthodox, 7.Bxf6 Bxf6 8.Qb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 Bxf6 8.Qb3 *++[ECO "D55j"]+[Variation "QGD: Neo-Orthodox, Gligoric Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 Bxf6 8.Rc1 *++[ECO "D55k"]+[Variation "QGD: Neo-Orthodox, Petrosian Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 Bxf6 8.Rc1 c6 9.Bd3 Nd7 10.O-O dxc4 11.Bxc4 *++[ECO "D56"]+[Variation "QGD: Neo-Orthodox, 7.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 *++[ECO "D56"]+[Variation "QGD: Lasker Defence"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, 9.Nxe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Nxe4 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, Teichmann Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Qc2 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, Teichmann, 9...c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Qc2 c6 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, Teichmann, 9...Nxc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Qc2 Nxc3 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, 9.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Rc1 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, 9.Rc1 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Rc1 c6 *++[ECO "D56"]+[Variation "QGD: Lasker Defence, 9.Rc1 c6 10.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Rc1 c6 10.Bd3 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line, 11.Qb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 11.Qb3 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line, Bernstein Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 11.Qb3 Qd6 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line, Bernstein, 12.c4 dxc4 13.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 11.Qb3 Qd6 12.c4 dxc4 13.Bxc4 *++[ECO "D57"]+[Variation "QGD: Lasker Defence, Main Line, 11.Qb3 Rd8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 11.Qb3 Rd8 *++[ECO "D58a"]+[Variation "QGD: Tartakower System"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 *++[ECO "D58b"]+[Variation "QGD: Tartakower, 8.Qb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Qb3 *++[ECO "D58c"]+[Variation "QGD: Tartakower, 8.Qc2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Qc2 *++[ECO "D58d"]+[Variation "QGD: Tartakower, 8.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bxf6 *++[ECO "D58e"]+[Variation "QGD: Tartakower, 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 *++[ECO "D58f"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 *++[ECO "D58g"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O *++[ECO "D58h"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 *++[ECO "D58h"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Bg3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Bg3 *++[ECO "D58h"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Rc1 *++[ECO "D58h"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Rc1 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Rc1 c5 *++[ECO "D58i"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 *++[ECO "D58j"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5 *++[ECO "D58j"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5 11.Bg3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5 11.Bg3 *++[ECO "D58j"]+[Variation "QGD: Tartakower, 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5 11.Rfd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Bd3 Bb7 9.O-O Nbd7 10.Qe2 c5 11.Rfd1 *++[ECO "D58k"]+[Variation "QGD: Tartakower, 8.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 *++[ECO "D58k"]+[Variation "QGD: Tartakower, 8.Be2 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 *++[ECO "D58l"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 *++[ECO "D58l"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 *++[ECO "D58m"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.O-O *++[ECO "D58n"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 *++[ECO "D58n"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c5 *++[ECO "D58o"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c6 *++[ECO "D58o"]+[Variation "QGD: Tartakower, 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c6 12.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.b4 c6 12.O-O *++[ECO "D58p"]+[Variation "QGD: Tartakower, 8.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 *++[ECO "D58p"]+[Variation "QGD: Tartakower, 8.Rc1 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 Bb7 *++[ECO "D58q"]+[Variation "QGD: Tartakower, 8.Rc1 Bb7 9.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 Bb7 9.cxd5 *++[ECO "D58q"]+[Variation "QGD: Tartakower, 8.Rc1 Bb7 9.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 Bb7 9.cxd5 exd5 *++[ECO "D58r"]+[Variation "QGD: Tartakower, 8.Rc1 Bb7 9.Bxf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 Bb7 9.Bxf6 *++[ECO "D58r"]+[Variation "QGD: Tartakower, 8.Rc1 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Rc1 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 *++[ECO "D58s"]+[Variation "QGD: Tartakower, 8.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 *++[ECO "D58s"]+[Variation "QGD: Tartakower, 8.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 exd5 *++[ECO "D58t"]+[Variation "QGD: Tartakower, 8.cxd5 exd5 9.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 exd5 9.Bd3 *++[ECO "D59a"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 *++[ECO "D59b"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 *++[ECO "D59c"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 *++[ECO "D59d"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 *++[ECO "D59e"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 *++[ECO "D59e"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 *++[ECO "D59f"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Nxd5 *++[ECO "D59f"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Nxd5 Bxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Nxd5 Bxd5 *++[ECO "D59g"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Bd3 *++[ECO "D59h"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Be2"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Rc1 Bb7 11.Be2 *++[ECO "D59i"]+[Variation "QGD: Tartakower, 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 *++[ECO "D59j"]+[Variation "QGD: Tartakower, Main Line, 11.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Be2 *++[ECO "D59k"]+[Variation "QGD: Tartakower, Main Line, 11.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 *++[ECO "D59l"]+[Variation "QGD: Tartakower, Main Line, 11.Rc1 Be6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 *++[ECO "D59m"]+[Variation "QGD: Tartakower, Main Line, 12.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 12.Bd3 *++[ECO "D59n"]+[Variation "QGD: Tartakower, Main Line, 12.Qa4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 12.Qa4 *++[ECO "D59n"]+[Variation "QGD: Tartakower, Main Line, 12.Qa4 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 12.Qa4 c5 *++[ECO "D60"]+[Variation "QGD: Orthodox Defence"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 *++[ECO "D60"]+[Variation "QGD: Orthodox, 7.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.cxd5 Nxd5 *++[ECO "D60"]+[Variation "QGD: Orthodox, Rauzer Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qb3 *++[ECO "D60"]+[Variation "QGD: Orthodox, Rauzer Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qb3 c6 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 7...b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 b6 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 7...c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 c6 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 7...dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 dxc4 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 7...dxc4 8.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 dxc4 8.Bxc4 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 8...a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 dxc4 8.Bxc4 a6 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 8...c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 dxc4 8.Bxc4 c5 *++[ECO "D60"]+[Variation "QGD: Orthodox, Botvinnik, 8...c5 9.O-O a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 dxc4 8.Bxc4 c5 9.O-O a6 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 h6 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 h6 8.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 h6 8.Bh4 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 h6 8.Bh4 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 h6 8.Bh4 c5 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 a6 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c6 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c6 8.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c6 8.a3 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c6 8.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c6 8.Bd3 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c6 8.Bd3 dxc4 9.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c6 8.Bd3 dxc4 9.Bxc4 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c6 8.Rd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c6 8.Rd1 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.Rd1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.Rd1 *++[ECO "D61"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.O-O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.O-O-O *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5 cxd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 cxd4 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 exd5 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5 exd5 9.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 exd5 9.Bd3 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 Nxd5 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5 Nxd5 9.Bxe7 Qxe7"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 Nxd5 9.Bxe7 Qxe7 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5, Main Line, 11.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Bd3 *++[ECO "D62"]+[Variation "QGD: Orthodox, Rubinstein, 7.Qc2 c5 8.cxd5, Main Line, 11.Bd3 g6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Bd3 g6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 Re8 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 h6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 h6 8.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 h6 8.Bh4 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 dxc4 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 dxc4 8.Bxc4 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 dxc4 8.Bxc4 a6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 b6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 b6, Duras Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 9.Qa4 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 b6, Pillsbury Attack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 9.Bd3 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 b6, Capablanca Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 9.Bb5 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, 8.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.a3 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, 8.c5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.c5 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, 8.c5 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.c5 c6 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, Karlsbad Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, Karlsbad Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 exd5 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, Karlsbad, 9.Bd3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 exd5 9.Bd3 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, Karlsbad, 9.Bd3 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 exd5 9.Bd3 Re8 *++[ECO "D63"]+[Variation "QGD: Orthodox, Swiss, Karlsbad, 9.Bd3 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 exd5 9.Bd3 c6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 c6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 *++[ECO "D63"]+[Variation "QGD: Orthodox, 7.Rc1 c6 8.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.a3 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, 8...dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 dxc4 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, Wolf Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 Ne4 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, 8...Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 Re8 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, 8...Re8 9.a3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 Re8 9.a3 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, 8...Re8 9.a3 a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 Re8 9.a3 a6 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, 8...h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 h6 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, Carlsbad Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, Gruenfeld Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.a3 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, Gruenfeld Variation, 9...h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.a3 h6 *++[ECO "D64"]+[Variation "QGD: Orthodox, Rubinstein Attack, Gruenfeld Variation, 9...h6 10.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.a3 h6 10.Bh4 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein Attack, 9.cxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein Attack, 9.cxd5 Nxd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 Nxd5 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein Attack, 9.cxd5 exd5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 h6 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 h6 11.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 h6 11.Bh4 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 Re8 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8 12.Ne5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8 12.Ne5 *++[ECO "D65"]+[Variation "QGD: Orthodox, Rubinstein, 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8 12.h3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 exd5 10.Bd3 Re8 11.O-O Nf8 12.h3 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...a6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 a6 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...h6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 h6 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...h6 9.Bh4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 h6 9.Bh4 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...h6 9.Bh4 dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 h6 9.Bh4 dxc4 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...h6 9.Bh4 dxc4 10.Bxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 h6 9.Bh4 dxc4 10.Bxc4 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...h6 9.Bh4 dxc4 10.Bxc4 b5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 h6 9.Bh4 dxc4 10.Bxc4 b5 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...Re8"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 Re8 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, 8...dxc4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, Fianchetto Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 b5 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, Fianchetto Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 b5 10.Bd3 a6 *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, Fianchetto, 11.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 b5 10.Bd3 a6 11.O-O *++[ECO "D66"]+[Variation "QGD: Orthodox, Main Line, Fianchetto, 11.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 b5 10.Bd3 a6 11.e4 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Capablanca Freeing Manoevure"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Janowski Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.h4 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Capablanca Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Alekhine Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.Ne4 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Alekhine, 11...e5 (Lasker)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.Ne4 e5 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Alekhine, 11...N5f6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.Ne4 N5f6 *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Capablanca, 11.O-O"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O *++[ECO "D67"]+[Variation "QGD: Orthodox, Main Line, Capablanca, 11.O-O Nxc3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, 13.Bb3"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Bb3 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Maroczy Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qb1 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Maroczy, 13...exd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qb1 exd4 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Vidmar Variation"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qc2 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Vidmar, 13...e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qc2 e4 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Vidmar, 13...exd4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qc2 exd4 *++[ECO "D68"]+[Variation "QGD: Orthodox, Classical, Vidmar, 13...exd4 14.exd4 Nb6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qc2 exd4 14.exd4 Nb6 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5: 15.f4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 15.f4 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5: 15.f4 Qe4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 15.f4 Qe4 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5: 15.f4 Qf6"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 15.f4 Qf6 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5: 15.f4 Qf6 16.f5"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 15.f4 Qf6 16.f5 *++[ECO "D69"]+[Variation "QGD: Orthodox, Classical, 13.dxe5: 15.f4 Qf6 16.e4"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 15.f4 Qf6 16.e4 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 3.Nf3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 d5 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: Alekhine's Anti-Gruenfeld"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.f3 d5 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: Alekhine's, 5.e4 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.f3 d5 4.cxd5 Nxd5 5.e4 Nb6 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: Alekhine's, 7.Be3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.f3 d5 4.cxd5 Nxd5 5.e4 Nb6 6.Nc3 Bg7 7.Be3 O-O *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 3.g3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 4.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.cxd5 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 4.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 4.Bg2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 c6 *++[ECO "D70"]+[Variation "Neo-Gruenfeld: 4.Bg2 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.Nc3 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.Nc3 Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.Nc3 Nxc3 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.Nc3 Nxc3 7.bxc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.Nc3 Nxc3 7.bxc3 c5 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.Nc3 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.Nc3 Nb6 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb4 *++[ECO "D71"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb4 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb4 7.d5 *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 Nc6 *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 e5 *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 c5 *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 O-O *++[ECO "D72"]+[Variation "Neo-Gruenfeld, 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 O-O 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 O-O 8.O-O *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 c6 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 c6 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 c6 6.cxd5 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 c6 6.cxd5 cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 c6 6.cxd5 cxd5 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 c6 6.cxd5 cxd5 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 c6 6.cxd5 cxd5 7.Nc3 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 c5 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 dxc4 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 dxc4 6.Na3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 dxc4 6.Na3 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 5.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 6.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.Qb3 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.Nc3 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 *++[ECO "D73"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.e4 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Na6 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nc6 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c6 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.e4 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.e4 Nf6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.e4 Nf6 *++[ECO "D74"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.e4 Nf6 9.e5 Nd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.e4 Nf6 9.e5 Nd5 *++[ECO "D75"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.Nc3 *++[ECO "D75"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.Nc3 Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.Nc3 Nxc3 *++[ECO "D75"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.Nc3 Nxc3 9.bxc3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.Nc3 Nxc3 9.bxc3 cxd4 *++[ECO "D75"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.dxc5 *++[ECO "D75"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O c5 8.dxc5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.dxc5 Na6 *++[ECO "D76a"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 *++[ECO "D76b"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 *++[ECO "D76c"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 *++[ECO "D76d"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 *++[ECO "D76e"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5 *++[ECO "D76e"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5 10.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5 10.d5 *++[ECO "D76f"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5 10.d5 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 e5 10.d5 Na5 *++[ECO "D76g"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 Re8 *++[ECO "D76h"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 Re8 10.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.e3 Re8 10.d5 *++[ECO "D76i"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 *++[ECO "D76j"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 *++[ECO "D76k"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4 *++[ECO "D76k"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4 c6 *++[ECO "D76l"]+[Variation "Neo-Gruenfeld, 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4 c6 11.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 8.Nc3 Nc6 9.d5 Na5 10.e4 c6 11.Bg5 *++[ECO "D77a"]+[Variation "Neo-Gruenfeld, 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O *++[ECO "D77b"]+[Variation "Neo-Gruenfeld, 6.O-O e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O e6 *++[ECO "D77c"]+[Variation "Neo-Gruenfeld, 6.O-O c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c5 *++[ECO "D77c"]+[Variation "Neo-Gruenfeld, 6.O-O c5 7.dxc5 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c5 7.dxc5 dxc4 *++[ECO "D77d"]+[Variation "Neo-Gruenfeld, 6.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O Nc6 *++[ECO "D77e"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 *++[ECO "D77f"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 *++[ECO "D77g"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Na6 *++[ECO "D77h"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 c3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 c3 *++[ECO "D77h"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 c3 8.bxc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 c3 8.bxc3 c5 *++[ECO "D77i"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 c3 8.bxc3 c5 9.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 c3 8.bxc3 c5 9.e3 *++[ECO "D77j"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Nc6 *++[ECO "D77j"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Nc6 8.Nxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 *++[ECO "D77j"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6 *++[ECO "D77k"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6 9.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6 9.b3 *++[ECO "D77l"]+[Variation "Neo-Gruenfeld, 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6 9.b3 Bd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O dxc4 7.Na3 Nc6 8.Nxc4 Be6 9.b3 Bd5 *++[ECO "D78a"]+[Variation "Neo-Gruenfeld, 6.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 *++[ECO "D78b"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Na3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Na3 *++[ECO "D78c"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Ne5 *++[ECO "D78d"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Qa4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Qa4 *++[ECO "D78e"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nc3 *++[ECO "D78f"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nc3 dxc4 *++[ECO "D78g"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Qb3 *++[ECO "D78h"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Qb3 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Qb3 Qb6 *++[ECO "D78i"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Qb3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Qb3 dxc4 *++[ECO "D78j"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Qb3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Qb3 dxc4 8.Qxc4 *++[ECO "D78k"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nbd2 *++[ECO "D78l"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nbd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nbd2 Nbd7 *++[ECO "D78m"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nbd2 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nbd2 Ne4 *++[ECO "D78n"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.Nbd2 Bf5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nbd2 Bf5 *++[ECO "D78o"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.b3 *++[ECO "D78p"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.b3 Bf5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.b3 Bf5 *++[ECO "D78q"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.b3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.b3 Ne4 *++[ECO "D79a"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 *++[ECO "D79a"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 *++[ECO "D79b"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 *++[ECO "D79c"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 e6 *++[ECO "D79d"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4 *++[ECO "D79d"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4 9.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4 9.Ne5 *++[ECO "D79e"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4 9.Nxe4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Ne4 9.Nxe4 *++[ECO "D79f"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6 *++[ECO "D79g"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6 9.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6 9.Ne5 *++[ECO "D79h"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6 9.Ne5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Nc3 Nc6 9.Ne5 e6 *++[ECO "D79i"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 *++[ECO "D79i"]+[Variation "Neo-Gruenfeld, 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 *++[ECO "D79j"]+[Variation "Neo-Gruenfeld, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 *++[ECO "D79k"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 *++[ECO "D79l"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 Nc6 *++[ECO "D79m"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4 Nc6 11.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 Nc6 11.Be3 *++[ECO "D79m"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4 Nc6 11.Be3 f6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 Nc6 11.Be3 f6 *++[ECO "D79n"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4 Nc6 11.Be3 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 Nc6 11.Be3 Nb6 *++[ECO "D79n"]+[Variation "Neo-Gruenfeld, Main Line, 10.f4 Nc6 11.Be3 Nb6 12.Bf2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 8.Ne5 e6 9.Nc3 Nfd7 10.f4 Nc6 11.Be3 Nb6 12.Bf2 *++[ECO "D80"]+[Variation "Gruenfeld Defence"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 *++[ECO "D80"]+[Variation "Gruenfeld: Spike/Gibbon Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.g4 *++[ECO "D80"]+[Variation "Gruenfeld: 4.h4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.h4 *++[ECO "D80"]+[Variation "Gruenfeld: 4.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.g3 *++[ECO "D80"]+[Variation "Gruenfeld: 4.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.f3 *++[ECO "D80"]+[Variation "Gruenfeld: 4.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.e3 *++[ECO "D80"]+[Variation "Gruenfeld: 4.e3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.e3 Bg7 *++[ECO "D80"]+[Variation "Gruenfeld: 4.e3 Bg7 5.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.e3 Bg7 5.Qb3 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, 4...Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, 4...Ne4 5.Nxe4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Nxe4 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, Lundin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Nxe4 dxe4 6.Qd2 c5 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, 4...Ne4 5.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Bf4 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, Taimanov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Bh4 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, Taimanov, 5...Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Bh4 Nxc3 *++[ECO "D80"]+[Variation "Gruenfeld: Stockholm, Taimanov, 5...Nxc3 6.bxc3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Bh4 Nxc3 6.bxc3 Bg7 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, 5...Be6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Be6 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, 5...Be6 6.Qb5+"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Be6 6.Qb5+ *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, Adorjan Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Be6 6.Qb5+ Bd7 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, 5...Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Bg7 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, 5...Bg7 6.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Bg7 6.e4 *++[ECO "D81"]+[Variation "Gruenfeld: Early Russian, 5...Bg7 6.e4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 dxc4 5.Qxc4 Bg7 6.e4 O-O *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7 5.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 c5 *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 7.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 7.Qa4+ *++[ECO "D82"]+[Variation "Gruenfeld: 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 7.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 7.Rc1 *++[ECO "D83"]+[Variation "Gruenfeld: Gruenfeld Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O *++[ECO "D83"]+[Variation "Gruenfeld: Gruenfeld Gambit, 6.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Qb3 *++[ECO "D83"]+[Variation "Gruenfeld: Gruenfeld Gambit, Capablanca Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 *++[ECO "D83"]+[Variation "Gruenfeld: Gruenfeld Gambit, Capablanca Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 c5 *++[ECO "D83"]+[Variation "Gruenfeld: Gruenfeld Gambit, Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 c5 7.dxc5 Be6 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 b6 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Bf5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Bf5 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Na6 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Na6 9.Bxa6 Qxg2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Na6 9.Bxa6 Qxg2 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Nc6 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Nc6 9.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Nc6 9.Ne2 *++[ECO "D84"]+[Variation "Gruenfeld: Gruenfeld Gambit Accepted, 8...Nc6 9.Ne2 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 Nc6 9.Ne2 Bg4 *++[ECO "D85a"]+[Variation "Gruenfeld: Exchange Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 *++[ECO "D85a"]+[Variation "Gruenfeld: Exchange Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 *++[ECO "D85a"]+[Variation "Gruenfeld: Exchange, 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.g3 *++[ECO "D85a"]+[Variation "Gruenfeld: Exchange, 5.Na4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.Na4 *++[ECO "D85b"]+[Variation "Gruenfeld: Exchange, 5.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.Bd2 *++[ECO "D85c"]+[Variation "Gruenfeld: Exchange, 5.Bd2 Bg7 6.e4 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.Bd2 Bg7 6.e4 Nb6 *++[ECO "D85c"]+[Variation "Gruenfeld: Exchange, 5.Bd2 Bg7 6.e4 Nb6 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.Bd2 Bg7 6.e4 Nb6 7.Be3 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 5.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 5.e4 Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nb6 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 5.e4 Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 5.e4 Nxc3 6.bxc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 c5 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 5.e4 Nxc3 6.bxc3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 *++[ECO "D85d"]+[Variation "Gruenfeld: Exchange, 7.Ba3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Ba3 *++[ECO "D85e"]+[Variation "Gruenfeld: Exchange, 7.Bb5+"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bb5+ *++[ECO "D85e"]+[Variation "Gruenfeld: Exchange, 7.Bb5+ c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bb5+ c6 *++[ECO "D85e"]+[Variation "Gruenfeld: Exchange, 7.Bb5+ c6 8.Ba4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bb5+ c6 8.Ba4 *++[ECO "D85f"]+[Variation "Gruenfeld: Exchange, 7.Bb5+ c6 8.Ba4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bb5+ c6 8.Ba4 O-O *++[ECO "D85g"]+[Variation "Gruenfeld: Exchange, 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 *++[ECO "D85g"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 *++[ECO "D85g"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 *++[ECO "D85g"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 O-O *++[ECO "D85g"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 O-O 9.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 O-O 9.Rc1 *++[ECO "D85h"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 Qa5 *++[ECO "D85h"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 Qa5 9.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 Qa5 9.Rc1 *++[ECO "D85h"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 Qa5 9.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 Qa5 9.Rb1 *++[ECO "D85h"]+[Variation "Gruenfeld: Exchange, 7.Be3 c5 8.Qd2 Qa5 9.Rb1 b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Be3 c5 8.Qd2 Qa5 9.Rb1 b6 *++[ECO "D85i"]+[Variation "Gruenfeld: Modern Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 *++[ECO "D85i"]+[Variation "Gruenfeld: Modern Exchange, 7...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 O-O *++[ECO "D85j"]+[Variation "Gruenfeld: Modern Exchange, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 *++[ECO "D85k"]+[Variation "Gruenfeld: Modern Exchange, 8.Bb5+"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Bb5+ *++[ECO "D85l"]+[Variation "Gruenfeld: Modern Exchange, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be2 *++[ECO "D85l"]+[Variation "Gruenfeld: Modern Exchange, 8.Be2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be2 O-O *++[ECO "D85l"]+[Variation "Gruenfeld: Modern Exchange, 8.Be2 O-O 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be2 O-O 9.O-O *++[ECO "D85l"]+[Variation "Gruenfeld: Modern Exchange, 8.Be2 O-O 9.O-O b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be2 O-O 9.O-O b6 *++[ECO "D85l"]+[Variation "Gruenfeld: Modern Exchange, 8.Be2 O-O 9.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be2 O-O 9.O-O Nc6 *++[ECO "D85m"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 *++[ECO "D85m"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O *++[ECO "D85m"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 *++[ECO "D85m"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 Qa5 *++[ECO "D85n"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 b6 *++[ECO "D85o"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 Nc6 *++[ECO "D85p"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 Nc6, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 Nc6 10.d5 Ne5 11.Nxe5 Bxe5 12.Qd2 *++[ECO "D85p"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 Nc6, Main Line, 12...e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 Nc6 10.d5 Ne5 11.Nxe5 Bxe5 12.Qd2 e6 *++[ECO "D85q"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 cd"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 *++[ECO "D85q"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 cd 10.cd"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 *++[ECO "D85q"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 cd 10.cd Qa5+"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 Qa5+ *++[ECO "D85q"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 cd 10.cd Qa5+ 11.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 Qa5+ 11.Qd2 *++[ECO "D85r"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1 O-O 9.Be2 cd 10.cd Qa5+ 11.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 Qa5+ 11.Bd2 *++[ECO "D85s"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1, 10...Qa5+ 11.Bd2 Qxa2 12.O-O Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 Qa5+ 11.Bd2 Qxa2 12.O-O Bg4 *++[ECO "D85s"]+[Variation "Gruenfeld: Modern Exchange, 8.Rb1, 10...Qa5+ 11.Bd2 Qxa2 12.O-O Bg4 13.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Rb1 O-O 9.Be2 cxd4 10.cxd4 Qa5+ 11.Bd2 Qxa2 12.O-O Bg4 13.Bg5 *++[ECO "D85t"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 *++[ECO "D85t"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 Bg4 *++[ECO "D85t"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 Nc6 *++[ECO "D85u"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 Qa5 *++[ECO "D85u"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 Qa5 9.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 Qa5 9.Qd2 *++[ECO "D85v"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 Qa5 9.Qd2 Nc6 10.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 Qa5 9.Qd2 Nc6 10.Rc1 *++[ECO "D85w"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 O-O *++[ECO "D85x"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 O-O 9.Rc1 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 O-O 9.Rc1 Qa5 *++[ECO "D85x"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 O-O 9.Rc1 Qa5 10.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 O-O 9.Rc1 Qa5 10.Qd2 *++[ECO "D85x"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 O-O 9.Rc1 Qa5 Queenswap, 12.Kxd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 O-O 9.Rc1 Qa5 10.Qd2 cxd4 11.cxd4 Qxd2+ 12.Kxd2 *++[ECO "D85y"]+[Variation "Gruenfeld: Modern Exchange, 8.Be3 O-O 9.Rc1 Qa5 Queenswap, 12.Nxd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 c5 8.Be3 O-O 9.Rc1 Qa5 10.Qd2 cxd4 11.cxd4 Qxd2+ 12.Nxd2 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, 7...b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 b6 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 c5 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, 7...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, 8.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Larsen Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Qd7 9.O-O b6 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 b6 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin, 9.h4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 b6 9.h4 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin, 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 b6 9.O-O *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin Improved"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin Improved, 9.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 9.Be3 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin Improved, 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 9.O-O *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin Improved, 9.O-O e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 9.O-O e5 *++[ECO "D86"]+[Variation "Gruenfeld: Classical Exchange, Simagin Improved, 9.O-O b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 9.O-O b6 *++[ECO "D87a"]+[Variation "Gruenfeld: Classical Exchange, 8...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 *++[ECO "D87b"]+[Variation "Gruenfeld: Classical Exchange, 8...c5 9.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.Be3 *++[ECO "D87c"]+[Variation "Gruenfeld: Classical Exchange, 8...c5 9.Be3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.Be3 Qa5 *++[ECO "D87c"]+[Variation "Gruenfeld: Classical Exchange, 8...c5 9.Be3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.Be3 Qa5 10.O-O Nd7 *++[ECO "D87d"]+[Variation "Gruenfeld: Classical Exchange, 8...c5 9.Be3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.Be3 Nc6 *++[ECO "D87e"]+[Variation "Gruenfeld: Classical Exchange, 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O *++[ECO "D87f"]+[Variation "Gruenfeld: Classical Exchange, 9.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 *++[ECO "D87g"]+[Variation "Gruenfeld: Classical Exchange, 9.O-O Nc6 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 *++[ECO "D87h"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Qa5 *++[ECO "D87i"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Na5 *++[ECO "D87j"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Qc7 *++[ECO "D87k"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Qc7 11.Rc1 Rd8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Qc7 11.Rc1 Rd8 *++[ECO "D87l"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Qc7 11.Rc1 Rd8 12.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Qc7 11.Rc1 Rd8 12.Qd2 *++[ECO "D87m"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Qc7 11.Rc1 Rd8 12.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Qc7 11.Rc1 Rd8 12.Bf4 *++[ECO "D87n"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Bg4 *++[ECO "D87o"]+[Variation "Gruenfeld: Classical Exchange, 10.Be3 Bg4 11.f3 Na5 12.Bd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Bg4 11.f3 Na5 12.Bd5 *++[ECO "D87p"]+[Variation "Gruenfeld: Classical Exchange, Seville Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Bg4 11.f3 Na5 12.Bxf7+ *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Na5 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Na5 12.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Na5 12.Bd3 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Bg4 12.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Bg4 12.f3 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, Neo-Seville"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bxf7+ *++[ECO "D88"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 11.cxd4 Bg4 12.f3 Na5 13.Bd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd5 *++[ECO "D89a"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 13.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 *++[ECO "D89b"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 13.Bd3 Be6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 *++[ECO "D89c"]+[Variation "Gruenfeld: Classical Exchange, Main Line, 13.Bd3 Be6 14.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.Rc1 *++[ECO "D89d"]+[Variation "Gruenfeld: Classical Exchange, 14.Rc1 Bxa2 15.Qa4 Be6 16.d5 Be7 17.Qb4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.Rc1 Bxa2 15.Qa4 Be6 16.d5 Bd7 17.Qb4 *++[ECO "D89e"]+[Variation "Gruenfeld: Classical Exchange, 14.Rc1 Bxa2 15.Qa4 with 17.Qb4 b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.Rc1 Bxa2 15.Qa4 Be6 16.d5 Bd7 17.Qb4 b6 *++[ECO "D89f"]+[Variation "Gruenfeld: Classical Exchange, 14.Rc1 Bxa2 15.Qa4 with 17.Qb4 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.Rc1 Bxa2 15.Qa4 Be6 16.d5 Bd7 17.Qb4 e6 *++[ECO "D89g"]+[Variation "Gruenfeld: Classical Exchange, Main Line, Sokolsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.d5 *++[ECO "D89h"]+[Variation "Gruenfeld: Classical Exchange, Main Line, Sokolsky, 16.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.d5 Bxa1 15.Qxa1 f6 16.Rb1 *++[ECO "D89i"]+[Variation "Gruenfeld: Classical Exchange, Main Line, Sokolsky, 16.Bh6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.d5 Bxa1 15.Qxa1 f6 16.Bh6 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 *++[ECO "D90"]+[Variation "Gruenfeld: Schlechter Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 c6 *++[ECO "D90"]+[Variation "Gruenfeld: Schlechter, 5.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 c6 5.Qb3 *++[ECO "D90"]+[Variation "Gruenfeld: Schlechter, Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 c6 5.cxd5 *++[ECO "D90"]+[Variation "Gruenfeld: Schlechter, Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 c6 5.cxd5 cxd5 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights, 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.g3 *++[ECO "D90"]+[Variation "Gruenfeld: Flohr Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qa4+ *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 Nxd5 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange, Romanishin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 Nxd5 6.Qb3 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange, 6.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 Nxd5 6.Bd2 *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange, 6.Bd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 Nxd5 6.Bd2 O-O *++[ECO "D90"]+[Variation "Gruenfeld: Three Knights Exchange, 6.Bd2 O-O 7.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.cxd5 Nxd5 6.Bd2 O-O 7.Rc1 *++[ECO "D91a"]+[Variation "Gruenfeld: 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 *++[ECO "D91a"]+[Variation "Gruenfeld: 5.Bg5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 c6 *++[ECO "D91b"]+[Variation "Gruenfeld: 5.Bg5 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 dxc4 *++[ECO "D91c"]+[Variation "Gruenfeld: 5.Bg5 dxc4 6.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 dxc4 6.e4 *++[ECO "D91d"]+[Variation "Gruenfeld: 5.Bg5 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 *++[ECO "D91d"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.Bf4 *++[ECO "D91e"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.Bh4 *++[ECO "D91f"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.Bh4 Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.Bh4 Nxc3 *++[ECO "D91g"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.Bh4 Nxc3 7.bxc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.Bh4 Nxc3 7.bxc3 dxc4 *++[ECO "D91h"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 *++[ECO "D91i"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 *++[ECO "D91j"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 c6 *++[ECO "D91k"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 *++[ECO "D91l"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2 *++[ECO "D91m"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2 exd5 *++[ECO "D91n"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2 exd5: 11.h4 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Qd2 exd5 9.Qe3+ Kf8 10.Qf4 Bf6 11.h4 h6 *++[ECO "D91o"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 *++[ECO "D91p"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 *++[ECO "D91q"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O *++[ECO "D91r"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Bd3 *++[ECO "D91r"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Bd3 c6 *++[ECO "D91s"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Be2 *++[ECO "D91s"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.Be2 c6 *++[ECO "D91t"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.b4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.b4 *++[ECO "D91t"]+[Variation "Gruenfeld: 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.b4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 Ne4 6.cxd5 Nxg5 7.Nxg5 e6 8.Nf3 exd5 9.e3 O-O 10.b4 c6 *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 c6 *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.Rc1 *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.Rc1 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.Rc1 dxc4 *++[ECO "D92"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.Rc1 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.Rc1 c5 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c5 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c5 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c5 7.dxc5 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5 8.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5 8.Rc1 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5 8.Rc1 dxc4 9.Bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c5 7.dxc5 Qa5 8.Rc1 dxc4 9.Bxc4 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c6 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c6 7.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c6 7.Qb3 *++[ECO "D93"]+[Variation "Gruenfeld: 5.Bf4 O-O 6.e3 c6 7.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 c6 7.Rc1 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 *++[ECO "D94"]+[Variation "Gruenfeld: Slav/Schlecter"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 *++[ECO "D94"]+[Variation "Gruenfeld: Slav/Schlecter, 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 6.Bd3 *++[ECO "D94"]+[Variation "Gruenfeld: Slav/Schlecter, 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 6.Be2 *++[ECO "D94"]+[Variation "Gruenfeld: Slav/Schlecter, 6.Be2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 6.Be2 O-O *++[ECO "D94"]+[Variation "Gruenfeld: Slav/Schlecter, 6.Be2 O-O 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 6.Be2 O-O 7.O-O *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O *++[ECO "D94"]+[Variation "Gruenfeld: Makogonov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.b4 *++[ECO "D94"]+[Variation "Gruenfeld: Opovcensky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd2 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Be2 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Be2 c5 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.Bd3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 c6 *++[ECO "D94"]+[Variation "Gruenfeld: Smyslov Defence"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 c6 7.O-O Bg4 *++[ECO "D94"]+[Variation "Gruenfeld: Flohr Defence"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 c6 7.O-O Bf5 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.cxd5 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.cxd5 Nxd5 *++[ECO "D94"]+[Variation "Gruenfeld: 5.e3 O-O 6.cxd5 Nxd5 7.Bc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Bc4 *++[ECO "D95a"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 *++[ECO "D95b"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 b6 *++[ECO "D95c"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 c6 *++[ECO "D95d"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 c6 7.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 c6 7.Bd2 *++[ECO "D95e"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 c6 7.Bd2 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 c6 7.Bd2 e6 *++[ECO "D95f"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 c6 7.Bd2 e6 8.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 c6 7.Bd2 e6 8.Bd3 *++[ECO "D95g"]+[Variation "Gruenfeld: Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 e6 *++[ECO "D95h"]+[Variation "Gruenfeld: Botvinnik, 7.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 e6 7.Bd2 *++[ECO "D95i"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 dxc4 *++[ECO "D95i"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 dxc4 7.Bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 dxc4 7.Bxc4 *++[ECO "D95i"]+[Variation "Gruenfeld: Pachman Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 dxc4 7.Bxc4 Nbd7 8.Ng5 *++[ECO "D95j"]+[Variation "Gruenfeld: 5.e3 O-O 6.Qb3 dxc4 7.Bxc4 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 dxc4 7.Bxc4 Nc6 *++[ECO "D96"]+[Variation "Gruenfeld: Russian Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 c6 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...c6 6.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 c6 6.Bf4 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...c6 6.cxd5 cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 c6 6.cxd5 cxd5 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...c6 6.cxd5 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 c6 6.cxd5 Nxd5 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 5...dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 6...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 a6 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 6...a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 7.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.Bf4 *++[ECO "D96"]+[Variation "Gruenfeld: Russian, 7.Bf4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.Bf4 c6 *++[ECO "D97a"]+[Variation "Gruenfeld: Russian, 7.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 *++[ECO "D97a"]+[Variation "Gruenfeld: Russian, 7.e4 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Nfd7 *++[ECO "D97b"]+[Variation "Gruenfeld: Russian, Levenfish Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 b6 *++[ECO "D97c"]+[Variation "Gruenfeld: Russian, Szabo Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 c6 *++[ECO "D97c"]+[Variation "Gruenfeld: Russian, Szabo, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 c6 8.Be2 *++[ECO "D97d"]+[Variation "Gruenfeld: Russian, Alekhine (Hungarian) Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 *++[ECO "D97e"]+[Variation "Gruenfeld: Russian, Alekhine, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.Be2 *++[ECO "D97f"]+[Variation "Gruenfeld: Russian, Alekhine, 8.Be2 b5 9.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.Be2 b5 9.Qb3 *++[ECO "D97g"]+[Variation "Gruenfeld: Russian, Alekhine, 8.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.Qb3 *++[ECO "D97h"]+[Variation "Gruenfeld: Russian, Alekhine, 8.e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.e5 *++[ECO "D97i"]+[Variation "Gruenfeld: Russian, Alekhine, 8.e5 b5 9.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.e5 b5 9.Qb3 *++[ECO "D97j"]+[Variation "Gruenfeld: Russian, Alekhine, 8.e5 b5 9.Qb3 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.e5 b5 9.Qb3 Nfd7 *++[ECO "D97k"]+[Variation "Gruenfeld: Russian, Alekhine, 8.e5 b5 9.Qb3 Nfd7 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 8.e5 b5 9.Qb3 Nfd7 10.Be3 *++[ECO "D97l"]+[Variation "Gruenfeld: Russian, Simagin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Nc6 *++[ECO "D97l"]+[Variation "Gruenfeld: Russian, Simagin, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Nc6 8.Be2 *++[ECO "D97m"]+[Variation "Gruenfeld: Russian, Prins Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Na6 *++[ECO "D97n"]+[Variation "Gruenfeld: Russian, Prins, 8.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Na6 8.Bf4 *++[ECO "D97o"]+[Variation "Gruenfeld: Russian, Prins, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Na6 8.Be2 *++[ECO "D97p"]+[Variation "Gruenfeld: Russian, Prins, 8.Be2, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Na6 8.Be2 c5 9.d5 e6 10.O-O exd5 11.exd5 Bf5 *++[ECO "D98a"]+[Variation "Gruenfeld: Russian, Smyslov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 *++[ECO "D98b"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be2 *++[ECO "D98c"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be2 Nc6 *++[ECO "D98d"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be2 Nc6 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be2 Nc6 9.d5 *++[ECO "D98e"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 *++[ECO "D98f"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 *++[ECO "D98g"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3 Nfd7 9.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Be2 *++[ECO "D98h"]+[Variation "Gruenfeld: Russian, Smyslov, Keres Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Be2 Nb6 10.Qd3 Nc6 11.O-O-O *++[ECO "D98i"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3 Nfd7 9.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.O-O-O *++[ECO "D98j"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3 Nfd7 9.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Rd1 *++[ECO "D98k"]+[Variation "Gruenfeld: Russian, Smyslov, 8.Be3 Nfd7 9.Rd1 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Rd1 Nc6 *++[ECO "D99a"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 *++[ECO "D99b"]+[Variation "Gruenfeld: Russian, Smyslov, Yugoslav"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 c5 *++[ECO "D99c"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line, 9...Nb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 Nb6 *++[ECO "D99d"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line, 9...Nb6 10.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 Nb6 10.Rd1 *++[ECO "D99e"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line, 9...Nb6 10.Rd1 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 Nb6 10.Rd1 e6 *++[ECO "D99f"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line, 9...Nb6 10.Rd1 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 Nb6 10.Rd1 Nc6 *++[ECO "D99g"]+[Variation "Gruenfeld: Russian, Smyslov, Main Line, 9...Nb6 10.Rd1 Nc6 11.d5 Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 Nb6 10.Rd1 Nc6 11.d5 Ne5 *++[ECO "E00a"]+[Variation "Queen's Pawn: Neo-Indian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 *++[ECO "E00a"]+[Variation "Queen's Pawn: Neo-Indian, Devin Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g4 *++[ECO "E00b"]+[Variation "Queen's Pawn: Anti-Nimzo-Indian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.a3 *++[ECO "E00b"]+[Variation "Queen's Pawn: Anti-Nimzo-Indian, 3...d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.a3 d5 *++[ECO "E00c"]+[Variation "Neo-Indian (Seirawan) Attack"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Bg5 *++[ECO "E00d"]+[Variation "Queen's Pawn: Neo-Indian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 *++[ECO "E00e"]+[Variation "Queen's Pawn: Neo-Indian, 3...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 b6 *++[ECO "E00e"]+[Variation "Queen's Pawn: Neo-Indian, 3...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 b6 4.e4 *++[ECO "E00f"]+[Variation "Queen's Pawn: Neo-Indian, 3...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 c5 *++[ECO "E00g"]+[Variation "Catalan"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 *++[ECO "E00g"]+[Variation "Catalan: Hungarian Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 e5 *++[ECO "E00g"]+[Variation "Catalan: 3...c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 c6 *++[ECO "E00h"]+[Variation "Catalan: 3...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 c5 *++[ECO "E00h"]+[Variation "Catalan: 3...c5 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 c5 4.Nf3 *++[ECO "E00i"]+[Variation "Catalan: 3...Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ *++[ECO "E00i"]+[Variation "Catalan: 3...Bb4+ 4.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Nd2 *++[ECO "E00j"]+[Variation "Catalan: 3...Bb4+ 4.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 *++[ECO "E00k"]+[Variation "Catalan: 3...Bb4+ 4.Bd2 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Bxd2+ *++[ECO "E00l"]+[Variation "Catalan: 3...Bb4+ 4.Bd2 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Be7 *++[ECO "E00m"]+[Variation "Catalan: 3...Bb4+ 4.Bd2 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Qe7 *++[ECO "E00m"]+[Variation "Catalan: 3...Bb4+ 4.Bd2 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Qe7 5.Bg2 *++[ECO "E00n"]+[Variation "Catalan: 3...d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 *++[ECO "E00o"]+[Variation "Catalan: 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 *++[ECO "E00p"]+[Variation "Catalan: 4.Nf3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 c6 *++[ECO "E00q"]+[Variation "Catalan: 4.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 c5 *++[ECO "E00r"]+[Variation "Catalan: 4.Nf3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Bb4+ *++[ECO "E00r"]+[Variation "Catalan: 4.Nf3 Bb4+ 5.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Bb4+ 5.Bd2 *++[ECO "E00s"]+[Variation "Catalan: 4.Nf3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Be7 *++[ECO "E00t"]+[Variation "Catalan: 4.Nf3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 dxc4 *++[ECO "E00u"]+[Variation "Catalan: 4.Nf3 dxc4 5.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 dxc4 5.Qa4+ *++[ECO "E00v"]+[Variation "Catalan: 4.Nf3 dxc4 5.Qa4+ Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 dxc4 5.Qa4+ Nbd7 *++[ECO "E01"]+[Variation "Catalan: 4.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 *++[ECO "E01"]+[Variation "Catalan: 4...Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Bb4+ *++[ECO "E01"]+[Variation "Catalan: 4...Bb4+ 5.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Bb4+ 5.Bd2 *++[ECO "E01"]+[Variation "Catalan: 4...Bb4+ 5.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Bb4+ 5.Nd2 *++[ECO "E01"]+[Variation "Catalan: 4...Bb4+ 5.Nd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Bb4+ 5.Nd2 O-O *++[ECO "E01"]+[Variation "Catalan: 4...c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c6 *++[ECO "E01"]+[Variation "Catalan: 4...c6 5.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c6 5.Qc2 *++[ECO "E01"]+[Variation "Catalan: 4...c6 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c6 5.Nf3 *++[ECO "E01"]+[Variation "Catalan: 4...c6 5.Nf3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c6 5.Nf3 Nbd7 *++[ECO "E01"]+[Variation "Catalan: 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c5 *++[ECO "E01"]+[Variation "Catalan: 4...c5 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c5 5.Nf3 *++[ECO "E01"]+[Variation "Catalan: Open"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Bd7 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Bd7 6.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Bd7 6.Qxc4 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Nf3 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Nf3 a6 *++[ECO "E02"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Nf3 a6 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Nf3 a6 7.Nc3 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 *++[ECO "E03"]+[Variation "Catalan: Open, Alekhine Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Qc2 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5 8.Qc2 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5 8.Qc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Nf3 b5 8.Qc6 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.O-O *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.Qc2 *++[ECO "E03"]+[Variation "Catalan: Open, 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.Qc2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.Nf3 a6 8.Qc2 b6 *++[ECO "E04a"]+[Variation "Catalan: Open, 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 *++[ECO "E04a"]+[Variation "Catalan: Open, 5.Nf3 Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Bd7 *++[ECO "E04b"]+[Variation "Catalan: Open, 5.Nf3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Bb4+ *++[ECO "E04c"]+[Variation "Catalan: Open, 5.Nf3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nbd7 *++[ECO "E04d"]+[Variation "Catalan: Open, 5.Nf3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 b5 *++[ECO "E04e"]+[Variation "Catalan: Open, 5.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 *++[ECO "E04f"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O *++[ECO "E04g"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O b5 *++[ECO "E04g"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O b5 7.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O b5 7.Ne5 *++[ECO "E04h"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O b5 7.Ne5 Nd5 8.a4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O b5 7.Ne5 Nd5 8.a4 *++[ECO "E04i"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O Nc6 *++[ECO "E04j"]+[Variation "Catalan: Open, 5.Nf3 a6 6.O-O Nc6 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 a6 6.O-O Nc6 7.e3 *++[ECO "E04k"]+[Variation "Catalan: Open, 5.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 *++[ECO "E04k"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O *++[ECO "E04l"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 *++[ECO "E04m"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Ne5 *++[ECO "E04n"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Ne5 Bd7 8.Na3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Ne5 Bd7 8.Na3 *++[ECO "E04n"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Ne5 Bd7 8.Na3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Ne5 Bd7 8.Na3 cxd4 9.Naxc4 *++[ECO "E04o"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Qa4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Qa4 *++[ECO "E04o"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Qa4 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Qa4 cxd4 *++[ECO "E04p"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7 *++[ECO "E04q"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7 8.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7 8.Qxc4 *++[ECO "E04r"]+[Variation "Catalan: Open, 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7 8.Qxc4 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 7.Qa4 Bd7 8.Qxc4 b5 *++[ECO "E04s"]+[Variation "Catalan: Open, 5.Nf3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 *++[ECO "E04s"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.O-O *++[ECO "E04t"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.O-O Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.O-O Rb8 *++[ECO "E04u"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.O-O Rb8 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.O-O Rb8 7.Nc3 *++[ECO "E04v"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.Qa4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.Qa4 *++[ECO "E04w"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.Qa4 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.Qa4 Bb4+ *++[ECO "E04x"]+[Variation "Catalan: Open, 5.Nf3 Nc6 6.Qa4 Bb4+ 7.Bd2 Nd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 6.Qa4 Bb4+ 7.Bd2 Nd5 *++[ECO "E05a"]+[Variation "Catalan: Open, Classical"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 *++[ECO "E05b"]+[Variation "Catalan: Open, Classical, 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.Nc3 *++[ECO "E05c"]+[Variation "Catalan: Open, Classical, 6.Nc3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.Nc3 O-O *++[ECO "E05d"]+[Variation "Catalan: Open, Classical, 6.Nc3 O-O 7.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.Nc3 O-O 7.Ne5 *++[ECO "E05e"]+[Variation "Catalan: Open, Classical, 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O *++[ECO "E05f"]+[Variation "Catalan: Open, Classical, 6.O-O O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O *++[ECO "E05g"]+[Variation "Catalan: Open, Classical, 7.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Ne5 *++[ECO "E05h"]+[Variation "Catalan: Open, Classical, 7.Ne5 Nc6 8.Nxc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Ne5 Nc6 8.Nxc6 *++[ECO "E05i"]+[Variation "Catalan: Open, Classical, 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 *++[ECO "E05j"]+[Variation "Catalan: Open, Classical Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 *++[ECO "E05k"]+[Variation "Catalan: Open, Classical, 8.a4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 *++[ECO "E05l"]+[Variation "Catalan: Open, Classical, 8.a4 Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 Bd7 *++[ECO "E05m"]+[Variation "Catalan: Open, Classical, 8.a4 Bd7 9.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 Bd7 9.Qxc4 *++[ECO "E05m"]+[Variation "Catalan: Open, Classical, 8.a4 Bd7 9.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 Bd7 9.Qxc4 Bc6 *++[ECO "E05n"]+[Variation "Catalan: Open, Classical, 8.a4, 10.Bg5 Bd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 Bd7 9.Qxc4 Bc6 10.Bg5 Bd5 *++[ECO "E05o"]+[Variation "Catalan: Open, Classical, 8.a4, 10.Bg5 a5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.a4 Bd7 9.Qxc4 Bc6 10.Bg5 a5 *++[ECO "E05p"]+[Variation "Catalan: Open, Classical, 8.Qxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 *++[ECO "E05q"]+[Variation "Catalan: Open, Classical, 8.Qxc4 b5 9.Qc2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 *++[ECO "E05r"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bg5 *++[ECO "E05s"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bd2 *++[ECO "E05t"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bd2 Be4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bd2 Be4 *++[ECO "E05u"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bf4 *++[ECO "E05v"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bf4 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bf4 Nc6 *++[ECO "E05v"]+[Variation "Catalan: Open, Classical, 8.Qxc4, 10.Bf4 Nc6 11.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O 7.Qc2 a6 8.Qxc4 b5 9.Qc2 Bb7 10.Bf4 Nc6 11.Rd1 *++[ECO "E06"]+[Variation "Catalan: Closed"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 *++[ECO "E06"]+[Variation "Catalan: Closed, 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 *++[ECO "E06"]+[Variation "Catalan: Closed, 5.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O *++[ECO "E06"]+[Variation "Catalan: Closed, 6.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.Qc2 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c5 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c5 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c5 7.cxd5 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.b3 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Nbd2 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Nc3 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Nc3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Nc3 b6 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Nc3 b6 8.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Nc3 b6 8.Ne5 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Qc2 *++[ECO "E06"]+[Variation "Catalan: Closed, 6.O-O c6 7.Qc2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Qc2 b6 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nbd2 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Qd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qd3 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.b3 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.b3 c6 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.b3 c6 8.Ba3 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.b3 c6 8.Bb2 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 dxc4 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 dxc4 8.e4 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 c6 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3 c6 8.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 c6 8.Qb3 *++[ECO "E07"]+[Variation "Catalan: Closed, Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 c6 8.Qd3 *++[ECO "E07"]+[Variation "Catalan: Closed, 6...Nbd7 7.Nc3 c6 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 c6 8.b3 *++[ECO "E08a"]+[Variation "Catalan: Closed, 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 *++[ECO "E08b"]+[Variation "Catalan: Closed, 7.Qc2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c5 *++[ECO "E08c"]+[Variation "Catalan: Closed, 7.Qc2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 b6 *++[ECO "E08d"]+[Variation "Catalan: Closed, 7.Qc2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 *++[ECO "E08e"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Rd1 *++[ECO "E08f"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Rd1 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Rd1 b6 *++[ECO "E08f"]+[Variation "Catalan: Closed, Zagoryansky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Rd1 b6 9.a4 *++[ECO "E08g"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Bf4 *++[ECO "E08h"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Bf4 Nh5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Bf4 Nh5 *++[ECO "E08i"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Bf4 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Bf4 Ne4 *++[ECO "E08j"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.Bf4 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Bf4 b6 *++[ECO "E08k"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 *++[ECO "E08l"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b5 *++[ECO "E08m"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 *++[ECO "E08n"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 *++[ECO "E08n"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Ba6 *++[ECO "E08o"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Ba6 10.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Ba6 10.Nbd2 *++[ECO "E08p"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 *++[ECO "E08p"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 *++[ECO "E08p"]+[Variation "Catalan: Closed, Spassky Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 b5 *++[ECO "E08q"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8 *++[ECO "E08q"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8 11.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8 11.e4 *++[ECO "E08r"]+[Variation "Catalan: Closed, 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8 11.e4 dxe4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 Rc8 11.e4 dxe4 *++[ECO "E09a"]+[Variation "Catalan: Closed, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 *++[ECO "E09b"]+[Variation "Catalan: Closed, Main Line, 8...b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b5 *++[ECO "E09c"]+[Variation "Catalan: Closed, Main Line, 8...Re8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 Re8 *++[ECO "E09d"]+[Variation "Catalan: Closed, Main Line, 8...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 *++[ECO "E09e"]+[Variation "Catalan: Closed, Main Line, 9.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 *++[ECO "E09e"]+[Variation "Catalan: Closed, Main Line, Sokolsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 a5 10.Bb2 Ba6 *++[ECO "E09e"]+[Variation "Catalan: Closed, Main Line, 9.b3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 Bb7 *++[ECO "E09f"]+[Variation "Catalan: Closed, Main Line, 9.b3 Bb7 10.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 Bb7 10.Bb2 *++[ECO "E09g"]+[Variation "Catalan: Closed, Main Line, 9.b3 Bb7 10.Bb2 Rc8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 Bb7 10.Bb2 Rc8 *++[ECO "E09h"]+[Variation "Catalan: Closed, Main Line, 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 *++[ECO "E09i"]+[Variation "Catalan: Closed, Main Line, 9.e4 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Ba6 *++[ECO "E09i"]+[Variation "Catalan: Closed, Main Line, 9.e4 Ba6 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Ba6 10.b3 *++[ECO "E09j"]+[Variation "Catalan: Closed, Main Line, 9.e4 dxe4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 dxe4 *++[ECO "E09k"]+[Variation "Catalan: Closed, Main Line, 9.e4 dxe4 10.Nxe4 Nxe4 11.Qxe4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 dxe4 10.Nxe4 Nxe4 11.Qxe4 *++[ECO "E09l"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 *++[ECO "E09m"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7 10.e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 10.e5 *++[ECO "E09n"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 10.b3 *++[ECO "E09o"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7 10.b3 Rc8 11.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 10.b3 Rc8 11.Bb2 *++[ECO "E09p"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7 10.b3 Rc8 11.Bb2 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 10.b3 Rc8 11.Bb2 Qc7 *++[ECO "E09q"]+[Variation "Catalan: Closed, Main Line, 9.e4 Bb7 10.b3 Rc8 11.Bb2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.e4 Bb7 10.b3 Rc8 11.Bb2 c5 *++[ECO "E10a"]+[Variation "Neo-Indian: 3.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 *++[ECO "E10b"]+[Variation "Neo-Indian: Doery Defence"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Ne4 *++[ECO "E10c"]+[Variation "Neo-Indian: 3.Nf3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Be7 *++[ECO "E10d"]+[Variation "Neo-Indian: 3.Nf3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 a6 *++[ECO "E10e"]+[Variation "Neo-Indian: 3.Nf3 a6 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 a6 4.Nc3 *++[ECO "E10f"]+[Variation "Neo-Indian: 3.Nf3 a6 4.Nc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 a6 4.Nc3 c5 *++[ECO "E10g"]+[Variation "Neo-Indian: Blumenfeld/Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 *++[ECO "E10h"]+[Variation "Neo-Indian: Blumenfeld/Benoni, 4.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.e3 *++[ECO "E10i"]+[Variation "Neo-Indian: Blumenfeld/Benoni, 4.e3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.e3 b6 *++[ECO "E10j"]+[Variation "Neo-Indian: Blumenfeld/Benoni, 4.e3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.e3 cxd4 *++[ECO "E10k"]+[Variation "Blumenfeld Countergambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 *++[ECO "E10k"]+[Variation "Blumenfeld: 5.dxe6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.dxe6 *++[ECO "E10k"]+[Variation "Blumenfeld: 5.dxe6 fxe6 6.cxb5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.dxe6 fxe6 6.cxb5 *++[ECO "E10l"]+[Variation "Blumenfeld: 5.dxe6 fxe6 6.cxb5 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.dxe6 fxe6 6.cxb5 d5 *++[ECO "E10m"]+[Variation "Blumenfeld: 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 *++[ECO "E10n"]+[Variation "Blumenfeld: 5.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 h6 *++[ECO "E10o"]+[Variation "Blumenfeld: 5.Bg5 Qa5+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 Qa5+ *++[ECO "E10p"]+[Variation "Blumenfeld: 5.Bg5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 exd5 *++[ECO "E10q"]+[Variation "Blumenfeld: Spielmann Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 exd5 6.cxd5 h6 *++[ECO "E11a"]+[Variation "Bogo-Indian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ *++[ECO "E11a"]+[Variation "Bogo-Indian: 4.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 *++[ECO "E11b"]+[Variation "Bogo-Indian: 4.Nbd2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 d5 *++[ECO "E11c"]+[Variation "Bogo-Indian: 4.Nbd2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 b6 *++[ECO "E11c"]+[Variation "Bogo-Indian: 4.Nbd2 b6 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 b6 5.a3 *++[ECO "E11c"]+[Variation "Bogo-Indian: 4.Nbd2 b6 5.a3 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 b6 5.a3 Bxd2+ *++[ECO "E11d"]+[Variation "Bogo-Indian: 4.Nbd2 b6 5.a3 Bxd2+ 6.Bxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 b6 5.a3 Bxd2+ 6.Bxd2 *++[ECO "E11d"]+[Variation "Bogo-Indian: 4.Nbd2 b6 5.a3 Bxd2+ 6.Bxd2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 b6 5.a3 Bxd2+ 6.Bxd2 Bb7 *++[ECO "E11e"]+[Variation "Bogo-Indian: 4.Nbd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 O-O *++[ECO "E11f"]+[Variation "Bogo-Indian: 4.Nbd2 O-O 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 O-O 5.a3 *++[ECO "E11f"]+[Variation "Bogo-Indian: 4.Nbd2 O-O 5.a3 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 O-O 5.a3 Bxd2+ *++[ECO "E11f"]+[Variation "Bogo-Indian: 4.Nbd2 O-O 5.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 O-O 5.a3 Be7 *++[ECO "E11f"]+[Variation "Bogo-Indian: Gruenfeld Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 O-O 5.a3 Be7 6.e4 d5 *++[ECO "E11g"]+[Variation "Bogo-Indian: 4.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 *++[ECO "E11g"]+[Variation "Bogo-Indian: 4.Bd2 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 *++[ECO "E11g"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 *++[ECO "E11g"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 *++[ECO "E11g"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 *++[ECO "E11h"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O *++[ECO "E11h"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 *++[ECO "E11i"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2 *++[ECO "E11i"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2 b6 *++[ECO "E11i"]+[Variation "Bogo-Indian: 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2 b6 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 8.Qc2 b6 9.Bf4 *++[ECO "E11j"]+[Variation "Bogo-Indian: Vitolins Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 c5 *++[ECO "E11k"]+[Variation "Bogo-Indian: Vitolins, 6.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 c5 5.Bxb4 cxb4 6.g3 *++[ECO "E11l"]+[Variation "Bogo-Indian: 4.Bd2 a5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 a5 *++[ECO "E11l"]+[Variation "Bogo-Indian: 4.Bd2 a5 5.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 a5 5.Nc3 *++[ECO "E11m"]+[Variation "Bogo-Indian: 4.Bd2 a5 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 a5 5.g3 *++[ECO "E11n"]+[Variation "Bogo-Indian: Nimzowitsch Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 *++[ECO "E11o"]+[Variation "Bogo-Indian: Nimzowitsch, 5.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.Nc3 *++[ECO "E11p"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 *++[ECO "E11q"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 O-O *++[ECO "E11q"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 O-O 6.Bg2 *++[ECO "E11r"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 *++[ECO "E11r"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Nc3 *++[ECO "E11s"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Nc3 Bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Nc3 Bxc3 *++[ECO "E11s"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3 *++[ECO "E11s"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3 Ne4 *++[ECO "E11s"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3 Ne4 8.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Nc3 Bxc3 7.Bxc3 Ne4 8.Rc1 *++[ECO "E11t"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 *++[ECO "E11t"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Bg2 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ *++[ECO "E11u"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 *++[ECO "E11v"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 d6 8.O-O *++[ECO "E11v"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 Main Line, 8...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 d6 8.O-O O-O *++[ECO "E11w"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 Main Line, 8...a5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 d6 8.O-O a5 *++[ECO "E11w"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 Main Line, 8...a5 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 d6 8.O-O a5 9.e4 *++[ECO "E11w"]+[Variation "Bogo-Indian: Nimzowitsch, 5.g3 Nc6 Main Line, 8...a5 9.e4 e5 10.d5 Nb8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 Nc6 6.Bg2 Bxd2+ 7.Nbxd2 d6 8.O-O a5 9.e4 e5 10.d5 Nb8 *++[ECO "E11x"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ *++[ECO "E11x"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Nbxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Nbxd2 *++[ECO "E11y"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Qxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 *++[ECO "E11y"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Qxd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 O-O *++[ECO "E11y"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3 *++[ECO "E11y"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3 d5 *++[ECO "E11z"]+[Variation "Bogo-Indian: 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3 d5 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 O-O 6.Nc3 d5 7.e3 *++[ECO "E12a"]+[Variation "Queen's Indian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 *++[ECO "E12b"]+[Variation "Queen's Indian: Miles Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 *++[ECO "E12b"]+[Variation "Queen's Indian: Miles, 5.e3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 Bb7 5.e3 Be7 *++[ECO "E12b"]+[Variation "Queen's Indian: Miles, 5.e3 Be7 6.h3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 Bb7 5.e3 Be7 6.h3 *++[ECO "E12c"]+[Variation "Queen's Indian: Miles, 5.e3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 Bb7 5.e3 Bb4+ *++[ECO "E12c"]+[Variation "Queen's Indian: Miles, 5.e3 Bb4+ 6.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 Bb7 5.e3 Bb4+ 6.Nbd2 *++[ECO "E12c"]+[Variation "Queen's Indian: Miles, 5.e3 Bb4+ 6.Nfd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 Bb7 5.e3 Bb4+ 6.Nfd2 *++[ECO "E12d"]+[Variation "Queen's Indian: Petrosian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 *++[ECO "E12e"]+[Variation "Queen's Indian: Petrosian, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 c5 *++[ECO "E12e"]+[Variation "Queen's Indian: Petrosian, 4...c5 5.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 c5 5.d5 *++[ECO "E12e"]+[Variation "Queen's Indian: Petrosian, 4...c5 5.d5 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 c5 5.d5 Ba6 *++[ECO "E12f"]+[Variation "Queen's Indian: Petrosian, 4...c5 5.d5 Ba6 6.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 c5 5.d5 Ba6 6.Qc2 *++[ECO "E12f"]+[Variation "Queen's Indian: Petrosian, 4...c5 5.d5 Ba6 6.Qc2 exd5 6.cxd5 g6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 c5 5.d5 Ba6 6.Qc2 exd5 6.cxd5 g6 *	; Move-number error ?++[ECO "E12g"]+[Variation "Queen's Indian: Petrosian, 4...Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 *++[ECO "E12g"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.e3 *++[ECO "E12g"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 *++[ECO "E12g"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 c5 *++[ECO "E12h"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 Bb7 *++[ECO "E12h"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2 Bb7 6.Nc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 Bb7 6.Nc3 c5 *++[ECO "E12i"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2 Bb7 6.Nc3 c5 7.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 Bb7 6.Nc3 c5 7.e4 *++[ECO "E12i"]+[Variation "Queen's Indian: Petrosian, 4...Ba6 5.Qc2 Bb7 6.Nc3 c5 7.e4 cd 8.Nxd4 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Ba6 5.Qc2 Bb7 6.Nc3 c5 7.e4 cxd4 8.Nxd4 Nc6 *++[ECO "E12j"]+[Variation "Queen's Indian: Petrosian, 4...Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 *++[ECO "E12j"]+[Variation "Queen's Indian: Petrosian, 5.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 *++[ECO "E12j"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 Bxf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 Bxf3 *++[ECO "E12j"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 Be7 *++[ECO "E12k"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 Ne4 *++[ECO "E12l"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 g6 *++[ECO "E12m"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 *++[ECO "E12n"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5 6.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.Bg5 *++[ECO "E12n"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5 6.Bg5 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.Bg5 Be7 *++[ECO "E12o"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5 6.Bg5 Be7 7.Qa4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.Bg5 Be7 7.Qa4+ *++[ECO "E12o"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5 6.Bg5 Be7 7.Qa4+ c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.Bg5 Be7 7.Qa4+ c6 *++[ECO "E12o"]+[Variation "Queen's Indian: Petrosian, 5.Nc3 d5 6.Bg5 Be7 7.Qa4+ c6 8.Bxf6 Bxf6 9.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.Bg5 Be7 7.Qa4+ c6 8.Bxf6 Bxf6 9.cxd5 exd5 *++[ECO "E12p"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 exd5 *++[ECO "E12p"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 exd5 7.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 exd5 7.g3 *++[ECO "E12q"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 exd5 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 exd5 7.Bg5 *++[ECO "E12r"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 *++[ECO "E12r"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 Nxd5 7.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.e4 *++[ECO "E12s"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 Nxd5 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.e3 *++[ECO "E12s"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 Nxd5 7.e3 g6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.e3 g6 *++[ECO "E12s"]+[Variation "Queen's Indian: Petrosian, 6.cxd5 Nxd5 7.e3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.e3 Be7 *++[ECO "E12t"]+[Variation "Queen's Indian: Petrosian, Kasparov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 *++[ECO "E12t"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Be7 *++[ECO "E12t"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 c5 *++[ECO "E12t"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 *++[ECO "E12u"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3 8.bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 8.bxc3 *++[ECO "E12u"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3 8.bxc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 8.bxc3 c5 *++[ECO "E12u"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3 8.bxc3 c5 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 8.bxc3 c5 8.e4 *	; Move-number error ?++[ECO "E12u"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3 8.bxc3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 8.bxc3 Be7 *++[ECO "E12u"]+[Variation "Queen's Indian: Petrosian, Kasparov, 7...Nxc3 8.bxc3 Be7 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 Bb7 5.Nc3 d5 6.cxd5 Nxd5 7.Qc2 Nxc3 8.bxc3 Be7 8.e4 *	; Move-number error ?++[ECO "E12v"]+[Variation "Queen's Indian: 4.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bg5 *++[ECO "E12w"]+[Variation "Queen's Indian: 4.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 *++[ECO "E12w"]+[Variation "Queen's Indian: 4.Nc3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 *++[ECO "E12w"]+[Variation "Queen's Indian: 4.Nc3 Bb7 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 *++[ECO "E12x"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Be7 *++[ECO "E12x"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Be7 7.e3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Be7 7.e3 Ne4 *++[ECO "E12x"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Be7 7.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Be7 7.e3 c5 *++[ECO "E12y"]+[Variation "Queen's Indian: Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 g5 *++[ECO "E12y"]+[Variation "Queen's Indian: Botvinnik, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 g5 7.Bg3 Nh5 8.Qc2 *++[ECO "E12y"]+[Variation "Queen's Indian: Botvinnik, 8.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 g5 7.Bg3 Nh5 8.e3 *++[ECO "E13a"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 *++[ECO "E13b"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.Qc2 *++[ECO "E13c"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.Qc2 g5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.Qc2 g5 *++[ECO "E13d"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.Nd2 *++[ECO "E13e"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.Nd2 Bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.Nd2 Bxc3 *++[ECO "E13e"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.Nd2 Bxc3 8.bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.Nd2 Bxc3 8.bxc3 *++[ECO "E13f"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 *++[ECO "E13g"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 c5 *++[ECO "E13h"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ *++[ECO "E13h"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 *++[ECO "E13i"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 *++[ECO "E13j"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 *++[ECO "E13k"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7 *++[ECO "E13k"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7 10.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7 10.f3 *++[ECO "E13l"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7 10.f3 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 Bxc3+ 8.bxc3 d6 9.Nd2 Nbd7 10.f3 Qe7 *++[ECO "E13m"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 *++[ECO "E13m"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 *++[ECO "E13m"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 *++[ECO "E13n"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 *++[ECO "E13o"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ *++[ECO "E13o"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 *++[ECO "E13p"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6 *++[ECO "E13p"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6 11.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6 11.Bd3 *++[ECO "E13q"]+[Variation "Queen's Indian: 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6 11.Bd3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 g5 8.Bg3 Ne4 9.Qc2 Bxc3+ 10.bxc3 d6 11.Bd3 f5 *++[ECO "E14a"]+[Variation "Queen's Indian: 4.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 *++[ECO "E14a"]+[Variation "Queen's Indian: 4.e3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb4+ *++[ECO "E14b"]+[Variation "Queen's Indian: 4.e3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 *++[ECO "E14c"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Nc3 *++[ECO "E14d"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Nc3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Nc3 d5 *++[ECO "E14e"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 *++[ECO "E14f"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ *++[ECO "E14g"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 *++[ECO "E14g"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 c5 *++[ECO "E14h"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O *++[ECO "E14i"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 *++[ECO "E14i"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 8.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 8.a3 *++[ECO "E14i"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 8.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 8.a3 Be7 *++[ECO "E14i"]+[Variation "Queen's Indian: Dreev Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 O-O 7.O-O d5 8.a3 Be7 9.b4 *++[ECO "E14j"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Be7 *++[ECO "E14k"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Be7 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Be7 6.O-O *++[ECO "E14k"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Be7 6.O-O O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Be7 6.O-O O-O *++[ECO "E14l"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 Be7 6.O-O O-O 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Be7 6.O-O O-O 7.Nc3 *++[ECO "E14m"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 d5 *++[ECO "E14n"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 d5 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 d5 6.O-O *++[ECO "E14n"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6 *++[ECO "E14o"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6 7.b3 *++[ECO "E14p"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 d5 6.O-O Bd6 7.Nc3 *++[ECO "E14q"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 *++[ECO "E14q"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.Nc3 *++[ECO "E14r"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O *++[ECO "E14s"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O cxd4 *++[ECO "E14s"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O cxd4 7.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O cxd4 7.exd4 *++[ECO "E14t"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 *++[ECO "E14t"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nbd2 *++[ECO "E14u"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 *++[ECO "E14u"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 *++[ECO "E14v"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 d5 *++[ECO "E14w"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 *++[ECO "E14w"]+[Variation "Queen's Indian: Averbakh Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.Nxd4 *++[ECO "E14w"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4 *++[ECO "E14w"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4 d5 *++[ECO "E14x"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 *++[ECO "E14x"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 O-O *++[ECO "E14x"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4 *++[ECO "E14y"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4 8.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4 8.exd4 *++[ECO "E14z"]+[Variation "Queen's Indian: 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4 8.exd4 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.Nc3 cxd4 8.exd4 d5 *++[ECO "E15a"]+[Variation "Queen's Indian: 4.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 *++[ECO "E15b"]+[Variation "Queen's Indian: 4.g3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb4+ *++[ECO "E15b"]+[Variation "Queen's Indian: 4.g3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb4+ 5.Bd2 *++[ECO "E15c"]+[Variation "Queen's Indian: 4.g3 Bb4+ 5.Bd2 Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb4+ 5.Bd2 Bxd2+ *++[ECO "E15c"]+[Variation "Queen's Indian: 4.g3 Bb4+ 5.Bd2 Bxd2+ 6.Qxd2 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb4+ 5.Bd2 Bxd2+ 6.Qxd2 Ba6 *++[ECO "E15d"]+[Variation "Queen's Indian: Nimzowitsch Variation (4.g3 Ba6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 *++[ECO "E15d"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qb3 *++[ECO "E15d"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qc2 *++[ECO "E15e"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 *++[ECO "E15e"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 c5 *++[ECO "E15f"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 Bb7 *++[ECO "E15f"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2 Bb7 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 Bb7 6.Bg2 *++[ECO "E15f"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2 Bb7 6.Bg2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 Bb7 6.Bg2 c5 *++[ECO "E15g"]+[Variation "Queen's Indian: Nimzowitsch, 5.Nbd2 Bb4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Nbd2 Bb4 *++[ECO "E15h"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 *++[ECO "E15h"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 Be7 *++[ECO "E15i"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c6 *++[ECO "E15i"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c6 6.Nc3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c6 6.Nc3 b5 *++[ECO "E15j"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c5 *++[ECO "E15j"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c5 6.Bg2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c5 6.Bg2 Bb7 *++[ECO "E15j"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c5 6.Bg2 Bb7 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c5 6.Bg2 Bb7 7.dxc5 *++[ECO "E15k"]+[Variation "Queen's Indian: Nimzowitsch, 5.Qa4 c5 6.Bg2 Bb7 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.Qa4 c5 6.Bg2 Bb7 7.O-O *++[ECO "E15l"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 "]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 *++[ECO "E15l"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 b5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 b5 *++[ECO "E15l"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 b5 6.cxb5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 b5 6.cxb5 *++[ECO "E15m"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 d5 *++[ECO "E15m"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 d5 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 d5 6.cxd5 *++[ECO "E15m"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 d5 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 d5 6.Bg2 *++[ECO "E15n"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb7 *++[ECO "E15n"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb7 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb7 6.Bg2 *++[ECO "E15n"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb7, 7...a5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb7 6.Bg2 Bb4+ 7.Bd2 a5 *++[ECO "E15n"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb7, 7...a5 8.O-O O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb7 6.Bg2 Bb4+ 7.Bd2 a5 8.O-O O-O *++[ECO "E15o"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ *++[ECO "E15o"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 *++[ECO "E15o"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Nc3 *++[ECO "E15p"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 *++[ECO "E15p"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 d5 *++[ECO "E15p"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 d5 8.cxd5 exd5 9.O-O O-O *++[ECO "E15q"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 *++[ECO "E15q"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.O-O *++[ECO "E15q"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.O-O d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.O-O d5 *++[ECO "E15r"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.Bc3 *++[ECO "E15s"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+, Main Line, 9.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.Bc3 d5 9.Ne5 *++[ECO "E15s"]+[Variation "Queen's Indian: Nimzowitsch, 5.b3 Bb4+, Main Line, 9.Ne5 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.Bc3 d5 9.Ne5 Nfd7 *++[ECO "E15t"]+[Variation "Queen's Indian: 4.g3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 *++[ECO "E15t"]+[Variation "Queen's Indian: 4.g3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 *++[ECO "E15t"]+[Variation "Queen's Indian: 4.g3 Bb7 5.Bg2 Qc8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Qc8 *++[ECO "E15t"]+[Variation "Queen's Indian: 4.g3 Bb7 5.Bg2 Qc8 6.O-O c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Qc8 6.O-O c5 7.d5 *++[ECO "E15u"]+[Variation "Queen's Indian: 4.g3 Bb7 5.Bg2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 c5 *++[ECO "E15u"]+[Variation "Queen's Indian: Buerger Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 c5 6.d5 exd5 7.Ng5 *++[ECO "E15v"]+[Variation "Queen's Indian: Rubinstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 c5 6.d5 exd5 7.Nh4 *++[ECO "E16a"]+[Variation "Queen's Indian: Capablanca Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ *++[ECO "E16b"]+[Variation "Queen's Indian: Capablanca, 6.Nbd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Nbd2 *++[ECO "E16c"]+[Variation "Queen's Indian: Capablanca, 6.Nbd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Nbd2 O-O *++[ECO "E16d"]+[Variation "Queen's Indian: Capablanca, 6.Nbd2 O-O 7.O-O d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Nbd2 O-O 7.O-O d5 *++[ECO "E16e"]+[Variation "Queen's Indian: Capablanca, 6.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 *++[ECO "E16e"]+[Variation "Queen's Indian: Capablanca, 6.Bd2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 c5 *++[ECO "E16f"]+[Variation "Queen's Indian: Capablanca, Yates Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 a5 *++[ECO "E16g"]+[Variation "Queen's Indian: Capablanca, Yates, 7.O-O O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 a5 7.O-O O-O *++[ECO "E16h"]+[Variation "Queen's Indian: Capablanca, Nimzowitsch Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Qe7 *++[ECO "E16i"]+[Variation "Queen's Indian: Capablanca, Nimzowitsch, 7.O-O Bxd2 8.Qxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Qe7 7.O-O Bxd2 8.Qxd2 *++[ECO "E16j"]+[Variation "Queen's Indian: Capablanca, Riumin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 *++[ECO "E16k"]+[Variation "Queen's Indian: Capablanca, Riumin, 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 7.Nc3 *++[ECO "E16l"]+[Variation "Queen's Indian: Capablanca, Riumin, 7.Nc3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 7.Nc3 O-O *++[ECO "E16m"]+[Variation "Queen's Indian: Capablanca, Riumin, 7.Nc3 O-O 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 7.Nc3 O-O 8.O-O *++[ECO "E16n"]+[Variation "Queen's Indian: Capablanca, Riumin, 7.Nc3 O-O 8.O-O d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 7.Nc3 O-O 8.O-O d5 *++[ECO "E16o"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ *++[ECO "E16o"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+ 7.Nbxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ 7.Nbxd2 *++[ECO "E16p"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+ 7.Qxd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ 7.Qxd2 *++[ECO "E16q"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+ 7.Qxd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ 7.Qxd2 O-O *++[ECO "E16q"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+ 7.Qxd2 O-O 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ 7.Qxd2 O-O 8.O-O *++[ECO "E16r"]+[Variation "Queen's Indian: Capablanca, 6...Bxd2+ 7.Qxd2 O-O 8.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Bxd2+ 7.Qxd2 O-O 8.Nc3 *++[ECO "E17a"]+[Variation "Queen's Indian: 5.Bg2 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 *++[ECO "E17b"]+[Variation "Queen's Indian: 6.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 *++[ECO "E17b"]+[Variation "Queen's Indian: 6.Nc3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 d5 *++[ECO "E17c"]+[Variation "Queen's Indian: 6.Nc3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 O-O *++[ECO "E17d"]+[Variation "Queen's Indian: 6.Nc3 O-O 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 O-O 7.Qc2 *++[ECO "E17e"]+[Variation "Queen's Indian: 6.Nc3 O-O 7.Qc2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 O-O 7.Qc2 c5 *++[ECO "E17f"]+[Variation "Queen's Indian: 6.Nc3 O-O 7.Qc2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 O-O 7.Qc2 d5 *++[ECO "E17g"]+[Variation "Queen's Indian: 6.Nc3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 *++[ECO "E17g"]+[Variation "Queen's Indian: 6.Nc3 Ne4 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Qc2 *++[ECO "E17h"]+[Variation "Queen's Indian: Opovcensky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Bd2 *++[ECO "E17i"]+[Variation "Queen's Indian: Opovcensky, 7...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Bd2 O-O *++[ECO "E17j"]+[Variation "Queen's Indian: Opovcensky, 7...f5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Bd2 f5 *++[ECO "E17k"]+[Variation "Queen's Indian: Opovcensky, 7...Bf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Bd2 Bf6 *++[ECO "E17l"]+[Variation "Queen's Indian: 6.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O *++[ECO "E17m"]+[Variation "Queen's Indian: 6.O-O d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O d5 *++[ECO "E17n"]+[Variation "Queen's Indian: 6.O-O O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O *++[ECO "E17o"]+[Variation "Queen's Indian: 6.O-O O-O 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Qc2 *++[ECO "E17p"]+[Variation "Queen's Indian: 6.O-O O-O 7.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Re1 *++[ECO "E17q"]+[Variation "Queen's Indian: 6.O-O O-O 7.Re1 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Re1 d5 *++[ECO "E17r"]+[Variation "Queen's Indian: Euwe Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.b3 *++[ECO "E17s"]+[Variation "Queen's Indian: Euwe, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.b3 c5 *++[ECO "E17t"]+[Variation "Queen's Indian: Euwe, 7...d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.b3 d5 *++[ECO "E17u"]+[Variation "Queen's Indian: Pomar Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 *++[ECO "E17u"]+[Variation "Queen's Indian: Pomar, 7...exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 *++[ECO "E17v"]+[Variation "Queen's Indian: Pomar, Taimanov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nd4 *++[ECO "E17w"]+[Variation "Queen's Indian: Pomar, Polugaevsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nh4 *++[ECO "E17w"]+[Variation "Queen's Indian: Pomar, Polugaevsky, 8...c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nh4 c6 *++[ECO "E17x"]+[Variation "Queen's Indian: Pomar, Polugaevsky, 8...c6 9.cxd5 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nh4 c6 9.cxd5 Nxd5 *++[ECO "E17y"]+[Variation "Queen's Indian: Pomar, Polugaevsky, 8...c6 9.cxd5 Nxd5 10.Nf5 Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nh4 c6 9.cxd5 Nxd5 10.Nf5 Nc7 *++[ECO "E17z"]+[Variation "Queen's Indian: Pomar, Polugaevsky, 8...c6 9.cxd5 Nxd5 10.Nf5 Nc7 11.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.d5 exd5 8.Nh4 c6 9.cxd5 Nxd5 10.Nf5 Nc7 11.e4 *++[ECO "E18a"]+[Variation "Queen's Indian: 7.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 *++[ECO "E18b"]+[Variation "Queen's Indian: 7.Nc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 c5 *++[ECO "E18c"]+[Variation "Queen's Indian: 7.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d6 *++[ECO "E18d"]+[Variation "Queen's Indian: 7.Nc3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Na6 *++[ECO "E18e"]+[Variation "Queen's Indian: 7.Nc3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 *++[ECO "E18e"]+[Variation "Queen's Indian: 7.Nc3 d5 8.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.cxd5 *++[ECO "E18f"]+[Variation "Queen's Indian: 7.Nc3 d5 8.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.cxd5 exd5 *++[ECO "E18g"]+[Variation "Queen's Indian: 7.Nc3 d5 8.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.Ne5 *++[ECO "E18h"]+[Variation "Queen's Indian: 7.Nc3 d5 8.Ne5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.Ne5 c6 *++[ECO "E18i"]+[Variation "Queen's Indian: 7.Nc3 d5 8.Ne5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.Ne5 Nbd7 *++[ECO "E18j"]+[Variation "Queen's Indian: 7.Nc3 d5 8.Ne5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.Ne5 Na6 *++[ECO "E18k"]+[Variation "Queen's Indian: 7.Nc3 d5 8.Ne5 Na6 9.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.Ne5 Na6 9.cxd5 exd5 *++[ECO "E18l"]+[Variation "Queen's Indian: 7.Nc3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 *++[ECO "E18m"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 *++[ECO "E18n"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 d5 *++[ECO "E18n"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 d5 9.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 d5 9.cxd5 exd5 *++[ECO "E18o"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 f5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 f5 *++[ECO "E18p"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 f5 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 f5 9.d5 *++[ECO "E18p"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 f5 9.d5 Bf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 f5 9.d5 Bf6 *++[ECO "E18p"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 f5 9.d5 Bf6 10.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 f5 9.d5 Bf6 10.Rc1 *++[ECO "E18q"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 Bf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 Bf6 *++[ECO "E18r"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Bd2 Bf6 9.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Bd2 Bf6 9.Rc1 *++[ECO "E18s"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 *++[ECO "E18s"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.d5 *++[ECO "E18s"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Bf4 *++[ECO "E18s"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Nh4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Nh4 *++[ECO "E18t"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 *++[ECO "E18u"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 *++[ECO "E18u"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 *++[ECO "E18v"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4 *++[ECO "E18w"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4 Qd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4 Qd7 *++[ECO "E18x"]+[Variation "Queen's Indian: 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Nxe4 Bxe4 9.Ne1 Bxg2 10.Nxg2 d5 11.Qa4 dxc4 *++[ECO "E18y"]+[Variation "Queen's Indian: Old Main Line, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 *++[ECO "E18y"]+[Variation "Queen's Indian: Old Main Line, 8.Qc2 Nxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 *++[ECO "E18z"]+[Variation "Queen's Indian: Old Main Line, 8.Qc2 Nxc3 9.bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.bxc3 *++[ECO "E19a"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 *++[ECO "E19b"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 d6 *++[ECO "E19c"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 d6 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 d6 10.b3 *++[ECO "E19d"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 Be4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 Be4 *++[ECO "E19e"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 Be4 10.Ne1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 Be4 10.Ne1 *++[ECO "E19f"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 f5 *++[ECO "E19g"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 f5 10.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 f5 10.Rd1 *++[ECO "E19h"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 f5 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 f5 10.b3 *++[ECO "E19i"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 f5 10.b3 Bf6 11.Bb2 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 f5 10.b3 Bf6 11.Bb2 d6 *++[ECO "E19j"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 *++[ECO "E19k"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.b3 *++[ECO "E19l"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 *++[ECO "E19m"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 d6 *++[ECO "E19n"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1 d6 11.b3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 d6 11.b3 *++[ECO "E19o"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6 *++[ECO "E19o"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6 12.Bb2 *++[ECO "E19p"]+[Variation "Queen's Indian: Old Main Line, 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6 12.Bb2 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 c5 10.Rd1 d6 11.b3 Bf6 12.Bb2 Qe7 *++[ECO "E20"]+[Variation "Nimzo-Indian Defence"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 *++[ECO "E20"]+[Variation "Nimzo-Indian: Mikenas Attack"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qd3 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bd2 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.Bd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bd2 O-O *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.Bd2 O-O 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bd2 O-O 5.Nf3 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.d5 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.Nf3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 Ne4 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.Nf3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 Nc6 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 O-O *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 4...c5 5.Nf3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 6.Nxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 6.Nxd4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 O-O *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 6.Nxd4 O-O 7.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 O-O 7.Bg2 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 6.Nxd4 O-O 7.Bg2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 O-O 7.Bg2 d5 *++[ECO "E20"]+[Variation "Nimzo-Indian: Romanishin, 8.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 O-O 7.Bg2 d5 8.cxd5 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.f3 (Kmoch)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.f3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 d5 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.f3 d5 5.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 d5 5.a3 Be7 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.f3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 c5 *++[ECO "E20"]+[Variation "Nimzo-Indian: 4.f3 c5 5.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 c5 5.d5 *++[ECO "E21"]+[Variation "Nimzo-Indian: Three Knights"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Qc2 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Qc2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Qc2 Bb7 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Qb3 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Qb3 a5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Qb3 a5 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Qb3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Qb3 c5 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Bg5 *++[ECO "E21"]+[Variation "Nimzo-Indian: Nimzo-Queen's Hybrid, 5.Bg5 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 b6 5.Bg5 Bb7 *++[ECO "E21"]+[Variation "Nimzo-Indian: Three Knights, 4...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 O-O *++[ECO "E21"]+[Variation "Nimzo-Indian: Three Knights, 4...Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 Bxc3+ *++[ECO "E21"]+[Variation "Nimzo-Indian: Three Knights, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 *++[ECO "E21"]+[Variation "Nimzo-Indian: Three Knights, Euwe Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.d5 Ne4 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 Nc6 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.e3 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.Nf3 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 *++[ECO "E22"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Na6 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5 Nc6 6.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Bg5 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5 Nc6 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, 4...c5 5.dxc5 Nc6 6.Nf3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, San Remo Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxc5 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, Stahlberg Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxc5 8.Qc2 f5 9.g3 *++[ECO "E23"]+[Variation "Nimzo-Indian: Spielmann, Carlsbad Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxd2 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 b6 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...b6 6.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 b6 6.f3 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 d5 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...d5 6.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 d5 6.f3 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.f3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 *++[ECO "E24"]+[Variation "Nimzo-Indian: Saemisch, Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.e3 O-O 8.cxd5 Nxd5 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.f3 d5 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.f3 d5 7.cxd5 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.f3 d5 7.cxd5 Nxd5 8.Qd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.Qd3 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, Keres Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, Keres, Romanovsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 f5 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, Keres, Romanovsky, 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 f5 9.e4 *++[ECO "E25"]+[Variation "Nimzo-Indian: Saemisch, Keres, Romanovsky, 9.Nh3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 f5 9.Nh3 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.e3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 Qa5 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.e3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 d6 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, O'Kelly Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 b6 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.e3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 Nc6 *++[ECO "E26"]+[Variation "Nimzo-Indian: Saemisch, 5...c5 6.e3 Nc6 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 Nc6 7.Bd3 *++[ECO "E27"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O *++[ECO "E27"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.f3 *++[ECO "E27"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.f3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.f3 d5 *++[ECO "E27"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.f3 d5 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.f3 d5 7.e3 *++[ECO "E27"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.f3 d5 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.f3 d5 7.cxd5 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 b6 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Ne2 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 *++[ECO "E28"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 b6 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Nf3 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 e5 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 d6 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, 5...O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 9.e4 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, Capablanca Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 9.e4 Ne8 *++[ECO "E29"]+[Variation "Nimzo-Indian: Saemisch, Capablanca, 10.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 9.e4 Ne8 10.O-O *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 O-O *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 exd5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 Bxc3+ *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 d6 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5 d6 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 d6 6.e3 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...c5 5.d5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 c5 5.d5 h6 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...h6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...h6 5.Bxf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bxf6 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...h6 5.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 4...h6 5.Bh4 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 6.d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 6.d5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 exd5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 6.d5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 exd5 7.cxd5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 6.d5 b5 Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 b5 *++[ECO "E30"]+[Variation "Nimzo-Indian: Leningrad, 6.d5 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 Bxc3+ *++[ECO "E31a"]+[Variation "Nimzo-Indian: Leningrad, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 *++[ECO "E31b"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 *++[ECO "E31c"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 g5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 g5 *++[ECO "E31d"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 exd5 *++[ECO "E31e"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 e5 *++[ECO "E31f"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Qe7 *++[ECO "E31g"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 O-O *++[ECO "E31h"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ *++[ECO "E31h"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 7.e3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 *++[ECO "E31i"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 Qe7 *++[ECO "E31j"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 *++[ECO "E31k"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5 9.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 9.Nf3 *++[ECO "E31l"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5 9.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 9.Qc2 *++[ECO "E31m"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5 9.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 9.Bd3 *++[ECO "E31n"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5 9.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 9.f3 *++[ECO "E31o"]+[Variation "Nimzo-Indian: Leningrad, Main Line, 8...e5 9.f3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 7.e3 Bxc3+ 8.bxc3 e5 9.f3 Nbd7 *++[ECO "E32a"]+[Variation "Nimzo-Indian: Classical Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 *++[ECO "E32b"]+[Variation "Nimzo-Indian: Classical, 4...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 b6 *++[ECO "E32c"]+[Variation "Nimzo-Indian: Classical, 4...d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d6 *++[ECO "E32d"]+[Variation "Nimzo-Indian: Classical, 4...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O *++[ECO "E32e"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.Bg5 *++[ECO "E32f"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.e4 *++[ECO "E32g"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.Nf3 *++[ECO "E32h"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 *++[ECO "E32h"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ *++[ECO "E32h"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 *++[ECO "E32i"]+[Variation "Nimzo-Indian: Classical, Adorjan Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b5 *++[ECO "E32j"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 d6 *++[ECO "E32k"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 Ne4 *++[ECO "E32l"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 *++[ECO "E32m"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Nf3 *++[ECO "E32n"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 *++[ECO "E32o"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Ba6 *++[ECO "E32p"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 *++[ECO "E32q"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7 8.f3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 8.f3 *++[ECO "E32r"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7 8.f3 h6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 8.f3 h6 *++[ECO "E32r"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7 8.f3 h6 9.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 8.f3 h6 9.Bh4 *++[ECO "E32s"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7 8.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 8.e3 *++[ECO "E32t"]+[Variation "Nimzo-Indian: Classical, 4...O-O 5.a3, 6...b6 7.Bg5 Bb7 8.e3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b6 7.Bg5 Bb7 8.e3 d6 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, 4...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, 4...Nc6 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, 4...Nc6 5.Nf3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d5 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, Milner-Barry (Zurich) Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, Milner-Barry (Zurich), 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 6.a3 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, Milner-Barry (Zurich), 6.a3 Bxc3+ 7.Qxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 6.a3 Bxc3+ 7.Qxc3 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, Milner-Barry (Zurich), 6.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 6.Bd2 *++[ECO "E33"]+[Variation "Nimzo-Indian: Classical, Milner-Barry (Zurich), 6.Bd2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 6.Bd2 O-O *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.e3 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.e3 O-O *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.e3 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.e3 c5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.Nf3 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.Nf3 c5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.Nf3 Qf5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.Nf3 Qf5 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, 5.cxd5 Qxd5 6.Nf3 Qf5 7.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.Nf3 Qf5 7.Qb3 *++[ECO "E34"]+[Variation "Nimzo-Indian: Classical, Noa, Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 Qxd5 6.Nf3 Qf5 7.Qxf5 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.a3 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 c5 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 h6 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5 h6 7.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 h6 7.Bh4 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5 h6 7.Bh4 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 h6 7.Bh4 c5 *++[ECO "E35"]+[Variation "Nimzo-Indian: Classical, Noa, Exchange, 6.Bg5 h6 7.Bxf6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 6.Bg5 h6 7.Bxf6 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Be7 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3 Bxc3+ 6.Qxc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 dxc4 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, 5.a3 Bxc3+ 6.Qxc3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 O-O *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, Botvinnik Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Nc6 *++[ECO "E36"]+[Variation "Nimzo-Indian: Classical, Noa, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 *++[ECO "E37"]+[Variation "Nimzo-Indian: Classical, Noa, Main Line, 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 *++[ECO "E37"]+[Variation "Nimzo-Indian: Classical, Noa, Main Line, 7.Qc2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 Nc6 *++[ECO "E37"]+[Variation "Nimzo-Indian: Classical, Noa, San Remo Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 Nc6 8.e3 e5 *++[ECO "E37"]+[Variation "Nimzo-Indian: Classical, Noa, Main Line, 7.Qc2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 c5 *++[ECO "E37"]+[Variation "Nimzo-Indian: Classical, Noa, Main Line, 7.Qc2 c5 8.dxc5 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 c5 8.dxc5 Nc6 *++[ECO "E38a"]+[Variation "Nimzo-Indian: Classical, 4...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 *++[ECO "E38b"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.Nf3 *++[ECO "E38c"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.e3 *++[ECO "E38d"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 *++[ECO "E38e"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Bxc5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Bxc5 *++[ECO "E38e"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Bxc5 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Bxc5 6.Nf3 *++[ECO "E38f"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Bxc5 6.Nf3 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Bxc5 6.Nf3 Qb6 *++[ECO "E38g"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Qc7 *++[ECO "E38h"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Nc6 *++[ECO "E38i"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 *++[ECO "E38j"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 *++[ECO "E38k"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6: 8.b4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 Nxc5 8.b4 *++[ECO "E38k"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6: 8.b4 Nce4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 Nxc5 8.b4 Nce4 *++[ECO "E38l"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6: 8.b4 Nce4 9.Qd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 Nxc5 8.b4 Nce4 9.Qd4 *++[ECO "E38l"]+[Variation "Nimzo-Indian: Classical, 4...c5 5.dxc5 Na6: 8.b4 Nce4 9.Qd4 d5 10.c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 Nxc5 8.b4 Nce4 9.Qd4 d5 10.c5 *++[ECO "E39a"]+[Variation "Nimzo-Indian: Classical, Pirc Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O *++[ECO "E39b"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Bf4 *++[ECO "E39c"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 *++[ECO "E39d"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3 Bxc5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Bxc5 *++[ECO "E39e"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Na6 *++[ECO "E39f"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3 Na6 7.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Na6 7.Bd2 *++[ECO "E39g"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3 Na6 7.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Na6 7.a3 *++[ECO "E39h"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.Nf3 Na6 7.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Na6 7.g3 *++[ECO "E39i"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.a3 *++[ECO "E39j"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.a3 Bxc5 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.a3 Bxc5 7.Nf3 *++[ECO "E39k"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.a3 Bxc5 7.Nf3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.a3 Bxc5 7.Nf3 Nc6 *++[ECO "E39l"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.a3 Bxc5 7.Nf3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.a3 Bxc5 7.Nf3 b6 *++[ECO "E39m"]+[Variation "Nimzo-Indian: Classical, Pirc, 6.a3 Bxc5 7.Nf3 b6 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.a3 Bxc5 7.Nf3 b6 8.Bg5 *++[ECO "E40"]+[Variation "Nimzo-Indian: Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 *++[ECO "E40"]+[Variation "Nimzo-Indian: Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 Nc6 *++[ECO "E40"]+[Variation "Nimzo-Indian: Taimanov, 5.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 Nc6 5.Ne2 *++[ECO "E40"]+[Variation "Nimzo-Indian: Taimanov, 5.Ne2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 Nc6 5.Ne2 d5 *++[ECO "E40"]+[Variation "Nimzo-Indian: Taimanov, 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 Nc6 5.Bd3 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Nf3 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Bd3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Bd3 Nc6 6.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Ne2 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Bd3 Nc6 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 *++[ECO "E41"]+[Variation "Nimzo-Indian: 4.e3 c5, Huebner Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 *++[ECO "E41"]+[Variation "Nimzo-Indian: Huebner, 8.e4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 8.e4 *++[ECO "E41"]+[Variation "Nimzo-Indian: Huebner, 8.e4 e5 9.d5 Ne7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 8.e4 e5 9.d5 Ne7 *++[ECO "E41"]+[Variation "Nimzo-Indian: Huebner, 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 8.O-O *++[ECO "E41"]+[Variation "Nimzo-Indian: Huebner, 8.O-O e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 8.O-O e5 *++[ECO "E41"]+[Variation "Nimzo-Indian: Huebner, 8.O-O e5 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 8.O-O e5 9.Nd2 *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 d5 *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2 cxd4 6.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 cxd4 6.exd4 *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2 cxd4 6.exd4 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 cxd4 6.exd4 d5 *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2 cxd4 6.exd4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 cxd4 6.exd4 O-O *++[ECO "E42"]+[Variation "Nimzo-Indian: 4.e3 c5 5.Ne2 cxd4 6.exd4 O-O 7.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Ne2 cxd4 6.exd4 O-O 7.a3 Be7 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch (Fischer) Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Bd3 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7 6.Bd3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 O-O *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7 6.Bd3 O-O 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 O-O 7.O-O *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7 6.Bd3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 Ne4 *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Nf3 Bb7 6.Bd3 Ne4 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 Ne4 7.O-O *++[ECO "E43"]+[Variation "Nimzo-Indian: Nimzowitsch, Keene Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nf3 Bb7 6.Bd3 Ne4 7.O-O f5 *++[ECO "E44"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 *++[ECO "E44"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Bb7 *++[ECO "E44"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ne4 *++[ECO "E44"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ne4 6.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ne4 6.Bd2 *++[ECO "E44"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ne4 6.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ne4 6.Qc2 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.a3 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.a3 Be7 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.a3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.a3 Bxc3+ *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.Ng3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.Ng3 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.Ng3 h5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.Ng3 h5 *++[ECO "E45"]+[Variation "Nimzo-Indian: Nimzowitsch, 5.Ne2 Ba6 6.Ng3 Bxc3+"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Ne2 Ba6 6.Ng3 Bxc3+ *++[ECO "E46"]+[Variation "Nimzo-Indian: 4.e3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 b6 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 Re8 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 d5 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky, Simagin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 d5 6.a3 Bd6 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky, 6.a3 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 d5 6.a3 Be7 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky, 6.a3 Be7 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 d5 6.a3 Be7 7.cxd5 *++[ECO "E46"]+[Variation "Nimzo-Indian: Reshevsky, 6.a3 Be7 7.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Ne2 d5 6.a3 Be7 7.cxd5 exd5 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 b6 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d6 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 c5 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 c5 6.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 c5 6.Ne2 *++[ECO "E47"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 c5 6.Ne2 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 c5 6.Ne2 cxd4 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.cxd5 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.O-O *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.O-O cxd4 8.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.O-O cxd4 8.exd4 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4 Nxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4 Nxd5 *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4 Nxd5 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.Ne2 c5 7.cxd5 cxd4 8.exd4 Nxd5 9.O-O *++[ECO "E48"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Bd3 d5 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik System"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 dxc4 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...dxc4 8.Bxc4 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 dxc4 8.Bxc4 c5 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...dxc4 8.Bxc4 c5 9.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 dxc4 8.Bxc4 c5 9.Ne2 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 c5 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...c5 8.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 c5 8.cxd5 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...c5 8.cxd5 exd5 9.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 c5 8.cxd5 exd5 9.Ne2 *++[ECO "E49"]+[Variation "Nimzo-Indian: Botvinnik, 7...c5 8.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 c5 8.cxd5 exd5 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 Ne4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 Ne4 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 b6 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 c5 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 c5 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 c5 6.Be2 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 c5 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 c5 6.Bd3 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 c5 6.Bd3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 c5 6.Bd3 Nc6 *++[ECO "E50"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 c5 6.Bd3 Nc6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 c5 6.Bd3 Nc6 7.O-O *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.a3 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Be2 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O a6 *++[ECO "E51"]+[Variation "Nimzo-Indian: 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O dxc4 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.a3 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.a3 Bd6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.a3 Bd6 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.cxd5 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.cxd5 exd5 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.cxd5 exd5 9.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.cxd5 exd5 9.Ne5 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.cxd5 exd5 9.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.cxd5 exd5 9.a3 *++[ECO "E52"]+[Variation "Nimzo-Indian: Main Line, 6...b6 7.O-O Bb7 8.cxd5 exd5 9.a3 Bd6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 7.O-O Bb7 8.cxd5 exd5 9.a3 Bd6 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, 6...c5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, 6...c5 7.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.a3 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, 6...c5 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, 7...Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Bd7 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, 7...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nbd7 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, Keres Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O b6 *++[ECO "E53"]+[Variation "Nimzo-Indian: Main Line, Keres, 8.cxd5 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O b6 8.cxd5 exd5 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Smyslov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Qe7 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nc6 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4 cxd4 9.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4 cxd4 9.exd4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 a6 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, 7...dxc4 8.Bxc4 cxd4 9.exd4 a6 10.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 a6 10.Bg5 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 Bb7 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5 Bb7 11.Ne5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 Bb7 11.Ne5 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5 Bb7 11.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 Bb7 11.Re1 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5 Bb7 11.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 Bb7 11.Rc1 *++[ECO "E54"]+[Variation "Nimzo-Indian: Main Line, Karpov, 10.Bg5 Bb7 11.Qe2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 b6 10.Bg5 Bb7 11.Qe2 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.Ne2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.Ne2 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.a3 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.a3 cd4 10.ed4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.a3 cxd4 10.exd4 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.Qe2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.Qe2 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.Qe2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.Qe2 a6 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.Qe2 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.Qe2 b6 *++[ECO "E55"]+[Variation "Nimzo-Indian: Main Line, Bronstein, 9.Qe2 b6 10.Rd1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 9.Qe2 b6 10.Rd1 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.cxd5 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 Ba5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Ba5 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 Ba5 9.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Ba5 9.cxd5 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 cxd4 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 cxd4 9.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 cxd4 9.exd4 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 dxc4 9.Bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 *++[ECO "E56"]+[Variation "Nimzo-Indian: Main Line, 7...Nc6 8.a3 dxc4 9.Bxc4 Ba5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 Ba5 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Be3 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Bf4 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Bg5 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Qd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Qd3 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Re1 *++[ECO "E57"]+[Variation "Nimzo-Indian: Main Line, 8...dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Re1 a6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 10.exd4 Be7 11.Re1 a6 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 8...Bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 8...Bxc3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 b6"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 b6 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.h3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.h3 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.Bb2 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.Qc2 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.cxd5 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.cxd5 exd5 11.a4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.cxd5 exd5 11.a4 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.cxd5 exd5 11.a4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.cxd5 exd5 11.a4 Re8 *++[ECO "E58"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 Qc7 10.cxd5 exd5 11.Nh4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 Qc7 10.cxd5 exd5 11.Nh4 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.a4"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.a4 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Qe2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Qe2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Qc2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bb2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Be2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bb5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bb5 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Ba2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Ba2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Ba2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Ba2 e5 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2 Re8 *++[ECO "E59"]+[Variation "Nimzo-Indian: Main Line, 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2 Re8 13.de5"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 Qc7 11.Bd3 e5 12.Qc2 Re8 13.dxe5 *++[ECO "E60a"]+[Variation "King's Indian"]+[Result "*"]+1.d4 Nf6 2.c4 g6 *++[ECO "E60a"]+[Variation "King's Indian: Mengarini Attack"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Qc2 *++[ECO "E60b"]+[Variation "King's Indian: 3.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Bg5 *++[ECO "E60c"]+[Variation "King's Indian: 3.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.d5 *++[ECO "E60c"]+[Variation "King's Indian: 3.d5, Danube/Adorjan Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.d5 b5 *++[ECO "E60d"]+[Variation "King's Indian: 3.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.f3 *++[ECO "E60e"]+[Variation "King's Indian: 3.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 *++[ECO "E60e"]+[Variation "King's Indian: 3.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 Bg7 *++[ECO "E60e"]+[Variation "King's Indian: 3.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 *++[ECO "E60e"]+[Variation "King's Indian: 3.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 O-O *++[ECO "E60f"]+[Variation "King's Indian: 3.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 *++[ECO "E60f"]+[Variation "King's Indian: 3.Nf3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 d6 *++[ECO "E60g"]+[Variation "King's Indian: 3.Nf3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 *++[ECO "E60h"]+[Variation "King's Indian: b3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 *++[ECO "E60h"]+[Variation "King's Indian: b3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 O-O 5.Bb2 *++[ECO "E60h"]+[Variation "King's Indian: b3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 d6 5.Bb2 *++[ECO "E60h"]+[Variation "King's Indian: b3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 d6 5.Bb2 O-O *++[ECO "E60h"]+[Variation "King's Indian: b3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 d6 5.Bb2 O-O 6.e3 *++[ECO "E60i"]+[Variation "King's Indian: b3+g3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 d6 5.Bb2 O-O 6.g3 *++[ECO "E60i"]+[Variation "King's Indian: b3+g3 System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.b3 d6 5.Bb2 O-O 6.g3 c5 7.Bg2 Nc6 8.O-O *++[ECO "E60j"]+[Variation "King's Indian: Fianchetto"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 *++[ECO "E60j"]+[Variation "King's Indian: Fianchetto"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O *++[ECO "E60k"]+[Variation "King's Indian: Fianchetto without Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 *++[ECO "E60k"]+[Variation "King's Indian: Fianchetto without Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 *++[ECO "E60k"]+[Variation "King's Indian: Fianchetto without Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O *++[ECO "E60l"]+[Variation "King's Indian: Fianchetto, Yugoslav without Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O c5 *++[ECO "E60l"]+[Variation "King's Indian: Fianchetto, Yugoslav without Nc3, 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O c5 7.dxc5 *++[ECO "E60m"]+[Variation "King's Indian: Fianchetto without Nc3, 6...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O c6 *++[ECO "E60n"]+[Variation "King's Indian: Fianchetto without Nc3, 6...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nc6 *++[ECO "E60o"]+[Variation "King's Indian: Fianchetto without Nc3, 6...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nbd7 *++[ECO "E60p"]+[Variation "King's Indian: Fianchetto without Nc3, 6...Nbd7 7.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nbd7 7.Qc2 *++[ECO "E60q"]+[Variation "King's Indian: Fianchetto without Nc3, 6...Nbd7 7.Qc2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nbd7 7.Qc2 e5 *++[ECO "E60r"]+[Variation "King's Indian: Fianchetto without Nc3, 6...Nbd7 7.Qc2 e5 8.Rd1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nbd7 7.Qc2 e5 8.Rd1 Re8 *++[ECO "E61a"]+[Variation "King's Indian: 3.Nc3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 *++[ECO "E61a"]+[Variation "King's Indian: 3.Nc3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 c5 *++[ECO "E61a"]+[Variation "King's Indian: 3.Nc3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 c6 *++[ECO "E61a"]+[Variation "King's Indian: 3.Nc3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d6 *++[ECO "E61b"]+[Variation "King's Indian: 3.Nc3 Bg7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 *++[ECO "E61b"]+[Variation "King's Indian: 4.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Bf4 *++[ECO "E61c"]+[Variation "King's Indian: 4.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Bg5 *++[ECO "E61d"]+[Variation "King's Indian: 4.Bg5 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Bg5 O-O *++[ECO "E61e"]+[Variation "King's Indian: 4.Bg5 O-O 5.e3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Bg5 O-O 5.e3 d6 *++[ECO "E61f"]+[Variation "King's Indian: 4.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 *++[ECO "E61f"]+[Variation "King's Indian: 4.g3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 d6 *++[ECO "E61f"]+[Variation "King's Indian: 4.g3 d6 5.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 d6 5.Bg2 *++[ECO "E61g"]+[Variation "King's Indian: 4.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 O-O *++[ECO "E61g"]+[Variation "King's Indian: 4.g3 O-O 5.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 O-O 5.Bg2 *++[ECO "E61g"]+[Variation "King's Indian: 4.g3 O-O 5.Bg2 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 O-O 5.Bg2 d6 *++[ECO "E61h"]+[Variation "King's Indian: Fianchetto, Flohr Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 O-O 5.Bg2 d6 6.e3 *++[ECO "E61i"]+[Variation "King's Indian: 4.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 *++[ECO "E61i"]+[Variation "King's Indian: 4.Nf3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 *++[ECO "E61i"]+[Variation "King's Indian: 4.Nf3 d6 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.e3 *++[ECO "E61j"]+[Variation "King's Indian: Smyslov System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.Bg5 *++[ECO "E61j"]+[Variation "King's Indian: Smyslov System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.Bg5 h6 *++[ECO "E61k"]+[Variation "King's Indian: 4.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O *++[ECO "E61l"]+[Variation "King's Indian: 4.Nf3 O-O 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.g3 *++[ECO "E61m"]+[Variation "King's Indian: 4.Nf3 O-O 5.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.e3 *++[ECO "E61m"]+[Variation "King's Indian: 4.Nf3 O-O 5.e3 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.e3 d6 *++[ECO "E61n"]+[Variation "King's Indian: 4.Nf3 O-O 5.e3 d6 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.e3 d6 6.Be2 *++[ECO "E61o"]+[Variation "King's Indian: 4.Nf3 O-O 5.e3 d6 6.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.e3 d6 6.Be2 c5 *++[ECO "E61o"]+[Variation "King's Indian: 4.Nf3 O-O 5.e3 d6 6.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.e3 d6 6.Be2 c5 7.O-O *++[ECO "E61p"]+[Variation "King's Indian: 4.Nf3 O-O 5.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bf4 *++[ECO "E61q"]+[Variation "King's Indian: 4.Nf3 O-O 5.Bf4 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bf4 d6 *++[ECO "E61q"]+[Variation "King's Indian: 4.Nf3 d6 5.Bf4 d6 6.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bf4 d6 6.h3 *++[ECO "E61r"]+[Variation "King's Indian: 4.Nf3 d6 5.Bf4 d6 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bf4 d6 6.e3 *++[ECO "E61s"]+[Variation "King's Indian: Smyslov System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 *++[ECO "E61t"]+[Variation "King's Indian: Smyslov System, 5...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 c5 *++[ECO "E61t"]+[Variation "King's Indian: Smyslov System, 5...c5 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 c5 6.e3 *++[ECO "E61u"]+[Variation "King's Indian: Smyslov System, 5...d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 *++[ECO "E61v"]+[Variation "King's Indian: Smyslov System, 6.e3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 *++[ECO "E61w"]+[Variation "King's Indian: Smyslov System, 6.e3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 c6 *++[ECO "E61x"]+[Variation "King's Indian: Smyslov System, 6.e3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 c5 *++[ECO "E61y"]+[Variation "King's Indian: Smyslov System, 5...O-O 6.e3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 Nbd7 *++[ECO "E61y"]+[Variation "King's Indian: Smyslov System, 5...O-O 6.e3 Nbd7 7.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 Nbd7 7.Be2 *++[ECO "E61z"]+[Variation "King's Indian: Smyslov System, 5...O-O 6.e3 Nbd7 7.Be2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 Nbd7 7.Be2 c6 *++[ECO "E61z"]+[Variation "King's Indian: Smyslov System, 5...O-O 6.e3 Nbd7 7.Be2 c6 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 O-O 5.Bg5 d6 6.e3 Nbd7 7.Be2 c6 8.O-O *++[ECO "E62a"]+[Variation "King's Indian: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 *++[ECO "E62a"]+[Variation "King's Indian: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O *++[ECO "E62b"]+[Variation "King's Indian: Fianchetto Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 *++[ECO "E62c"]+[Variation "King's Indian: Fianchetto, 6...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 *++[ECO "E62d"]+[Variation "King's Indian: Fianchetto, 6...c6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O *++[ECO "E62e"]+[Variation "King's Indian: Fianchetto, 6...c6 7.O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O a6 *++[ECO "E62f"]+[Variation "King's Indian: Fianchetto, Larsen System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Bf5 *++[ECO "E62g"]+[Variation "King's Indian: Fianchetto, Larsen System, 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Bf5 8.b3 *++[ECO "E62h"]+[Variation "King's Indian: Fianchetto, Kavalek/Bronstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Qa5 *++[ECO "E62i"]+[Variation "King's Indian: Fianchetto, Kavalek/Bronstein, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Qa5 8.h3 *++[ECO "E62j"]+[Variation "King's Indian: Fianchetto, Kavalek/Bronstein, 8.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Qa5 8.e4 *++[ECO "E62k"]+[Variation "King's Indian: Fianchetto, Kavalek/Bronstein, 8.e4 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Qa5 8.e4 Bg4 *++[ECO "E62l"]+[Variation "King's Indian: Fianchetto, 6...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 *++[ECO "E62m"]+[Variation "King's Indian: Fianchetto, 6...Nc6 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.d5 *++[ECO "E62n"]+[Variation "King's Indian: Fianchetto, 6...Nc6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O *++[ECO "E62o"]+[Variation "King's Indian: Fianchetto, 6...Nc6 7.O-O Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Rb8 *++[ECO "E62p"]+[Variation "King's Indian: Fianchetto, Spassky Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bf5 *++[ECO "E62q"]+[Variation "King's Indian: Fianchetto, Spassky, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bf5 8.d5 *++[ECO "E62r"]+[Variation "King's Indian: Fianchetto, Simagin Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bg4 *++[ECO "E62s"]+[Variation "King's Indian: Fianchetto, Simagin, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bg4 8.d5 *++[ECO "E62t"]+[Variation "King's Indian: Fianchetto, Uhlmann/Szabo Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O e5 *++[ECO "E62u"]+[Variation "King's Indian: Fianchetto, Uhlmann/Szabo Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O e5 8.d5 Ne7 *++[ECO "E62v"]+[Variation "King's Indian: Fianchetto, Uhlmann/Szabo, 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O e5 8.d5 Ne7 9.e4 *++[ECO "E63a"]+[Variation "King's Indian: Fianchetto, Panno Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 *++[ECO "E63b"]+[Variation "King's Indian: Fianchetto, Panno, 8.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.Re1 *++[ECO "E63c"]+[Variation "King's Indian: Fianchetto, Panno, 8.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.e4 *++[ECO "E63d"]+[Variation "King's Indian: Fianchetto, Panno, 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.b3 *++[ECO "E63e"]+[Variation "King's Indian: Fianchetto, Panno, 8.b3 Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.b3 Rb8 *++[ECO "E63f"]+[Variation "King's Indian: Fianchetto, Panno, 8.b3 Rb8 9.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.b3 Rb8 9.Bb2 *++[ECO "E63g"]+[Variation "King's Indian: Fianchetto, Panno, 8.b3 Rb8 9.Nd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.b3 Rb8 9.Nd5 *++[ECO "E63h"]+[Variation "King's Indian: Fianchetto, Panno, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.h3 *++[ECO "E63i"]+[Variation "King's Indian: Fianchetto, Panno, 8.h3 Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.h3 Rb8 *++[ECO "E63j"]+[Variation "King's Indian: Fianchetto, Panno, 8.h3 Rb8 9.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.h3 Rb8 9.Be3 *++[ECO "E63k"]+[Variation "King's Indian: Fianchetto, Panno, 8.h3 Rb8 9.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.h3 Rb8 9.e4 *++[ECO "E63l"]+[Variation "King's Indian: Fianchetto, Panno, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.d5 *++[ECO "E63m"]+[Variation "King's Indian: Fianchetto, Panno, 8.d5 Na5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 8.d5 Na5 *++[ECO "E64a"]+[Variation "King's Indian: Fianchetto, Yugoslav System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 *++[ECO "E64b"]+[Variation "King's Indian: Fianchetto, Yugoslav, Early Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.dxc5 *++[ECO "E64c"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.d5 *++[ECO "E64d"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.d5 e6 *++[ECO "E64e"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.d5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.d5 Na6 *++[ECO "E65a"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O *++[ECO "E65b"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.O-O cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O cxd4 *++[ECO "E65c"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.O-O Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nbd7 *++[ECO "E65d"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 *++[ECO "E65e"]+[Variation "King's Indian: Fianchetto, Yugoslav, 7.O-O Nc6 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.h3 *++[ECO "E65f"]+[Variation "King's Indian: Fianchetto, Yugoslav, Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.dxc5 *++[ECO "E65g"]+[Variation "King's Indian: Fianchetto, Yugoslav, Exchange, 9.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.dxc5 dxc5 9.Be3 *++[ECO "E65h"]+[Variation "King's Indian: Fianchetto, Yugoslav, Exchange, 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.dxc5 dxc5 9.Bf4 *++[ECO "E66a"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 *++[ECO "E66b"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 *++[ECO "E66c"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 *++[ECO "E66d"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 e5 *++[ECO "E66e"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 *++[ECO "E66f"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6 10.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Rb1 *++[ECO "E66g"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6 10.Rb1 Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Rb1 Rb8 *++[ECO "E66h"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6 10.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 *++[ECO "E66i"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6 10.Qc2 Rb8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 *++[ECO "E66j"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, 9...a6 10.Qc2 Rb8 11.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 *++[ECO "E66k"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 b5 *++[ECO "E66l"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, Main Line, 12.Bb2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 b5 12.Bb2 *++[ECO "E66m"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, Main Line, 12.Bb2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 b5 12.Bb2 e5 *++[ECO "E66n"]+[Variation "King's Indian: Fianchetto, Yugoslav Panno, Main Line, 12.Bb2 bxc4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 b5 12.Bb2 bxc4 *++[ECO "E67a"]+[Variation "King's Indian: Fianchetto with 6...Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 *++[ECO "E67b"]+[Variation "King's Indian: Fianchetto with 6...Nd7 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O *++[ECO "E67c"]+[Variation "King's Indian: Fianchetto with 6...Nd7 7.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O c6 *++[ECO "E67d"]+[Variation "King's Indian: Fianchetto, Classical Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 *++[ECO "E67e"]+[Variation "King's Indian: Fianchetto, Classical, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.d5 *++[ECO "E67f"]+[Variation "King's Indian: Fianchetto, Classical, 8.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.dxe5 *++[ECO "E67g"]+[Variation "King's Indian: Fianchetto, Classical, 8.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.b3 *++[ECO "E67h"]+[Variation "King's Indian: Fianchetto, Classical, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.Qc2 *++[ECO "E67i"]+[Variation "King's Indian: Fianchetto, Classical, 8.Qc2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.Qc2 c6 *++[ECO "E67j"]+[Variation "King's Indian: Fianchetto, Classical, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.h3 *++[ECO "E67k"]+[Variation "King's Indian: Fianchetto, Classical, 8.h3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.h3 Re8 *++[ECO "E67l"]+[Variation "King's Indian: Fianchetto, Classical, 8.h3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.h3 c6 *++[ECO "E68a"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 *++[ECO "E68b"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 Re8 *++[ECO "E68c"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 *++[ECO "E68d"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4 9.Nxd4 Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 9.Nxd4 Nc5 *++[ECO "E68e"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4 9.Nxd4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 9.Nxd4 Re8 *++[ECO "E68f"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4 9.Nxd4 Re8 10.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 9.Nxd4 Re8 10.h3 *++[ECO "E68g"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4 9.Nxd4 Re8 10.h3 Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 9.Nxd4 Re8 10.h3 Nc5 *++[ECO "E68h"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 exd4 9.Nxd4 Re8 10.h3 Nc5 11.Re1 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 exd4 9.Nxd4 Re8 10.h3 Nc5 11.Re1 a5 *++[ECO "E68i"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 a6 *++[ECO "E68j"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 *++[ECO "E68k"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 c6 9.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.Rb1 *++[ECO "E68l"]+[Variation "King's Indian: Fianchetto, Classical, 8.e4 c6 9.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.b3 *++[ECO "E69a"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 *++[ECO "E69b"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qe7 *++[ECO "E69c"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 a6 *++[ECO "E69d"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 a5 *++[ECO "E69e"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 exd4 *++[ECO "E69f"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 exd4 10.Nxd4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 exd4 10.Nxd4 Re8 *++[ECO "E69g"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qa5 *++[ECO "E69h"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qa5 10.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qa5 10.Re1 *++[ECO "E69h"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qa5 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qa5 10.Re1 exd4 *++[ECO "E69h"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qa5 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qa5 10.Re1 exd4 11.Nxd4 *++[ECO "E69i"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 *++[ECO "E69i"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.d5 *++[ECO "E69j"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.c5 *++[ECO "E69k"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.Re1 *++[ECO "E69l"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.Re1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.Re1 Re8 *++[ECO "E69m"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.Re1 exd4 *++[ECO "E69m"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.Re1 exd4 11.Nxd4 *++[ECO "E69n"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Qb6 10.Re1 exd4 11.Nxd4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Qb6 10.Re1 exd4 11.Nxd4 Re8 *++[ECO "E69o"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 *++[ECO "E69p"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.b3 *++[ECO "E69q"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Be3 *++[ECO "E69r"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Be3 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Be3 exd4 *++[ECO "E69r"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Be3 exd4 11.Nxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Be3 exd4 11.Nxd4 *++[ECO "E69s"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 *++[ECO "E69t"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 Qc7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 Qc7 *++[ECO "E69u"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 a5 *++[ECO "E69u"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 a5 11.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 a5 11.Be3 *++[ECO "E69v"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 *++[ECO "E69v"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 11.Nxd4 *++[ECO "E69w"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4, 11...a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 11.Nxd4 a5 *++[ECO "E69x"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4, 11...Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 11.Nxd4 Nc5 *++[ECO "E69y"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4, 11...Nc5 12.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 11.Nxd4 Nc5 12.Rb1 *++[ECO "E69z"]+[Variation "King's Indian: Fianchetto, Classical, 9.h3 Re8 10.Re1 exd4, 11...Nc5 12.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 Re8 10.Re1 exd4 11.Nxd4 Nc5 12.b3 *++[ECO "E70a"]+[Variation "King's Indian: 4.e4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 *++[ECO "E70b"]+[Variation "King's Indian: 4.e4 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 O-O *++[ECO "E70c"]+[Variation "King's Indian: 4.e4 O-O 5.e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 O-O 5.e5 *++[ECO "E70d"]+[Variation "King's Indian: 4.e4 O-O 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 O-O 5.Nf3 *++[ECO "E70e"]+[Variation "King's Indian: 4.e4 d6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 *++[ECO "E70f"]+[Variation "King's Indian: Kramer"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 *++[ECO "E70g"]+[Variation "King's Indian: Kramer, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O *++[ECO "E70h"]+[Variation "King's Indian: Kramer, 5...O-O 6.Ng3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O 6.Ng3 *++[ECO "E70i"]+[Variation "King's Indian: Kramer, 5...O-O 6.Ng3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O 6.Ng3 e5 *++[ECO "E70i"]+[Variation "King's Indian: Kramer, 5...O-O 6.Ng3 e5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O 6.Ng3 e5 7.d5 *++[ECO "E70j"]+[Variation "King's Indian: 4.e4 d6 5.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 *++[ECO "E70k"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 e5 *++[ECO "E70l"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O *++[ECO "E70m"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 *++[ECO "E70n"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6 *++[ECO "E70n"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6 7.O-O *++[ECO "E70n"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6 7.O-O e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 Nc6 7.O-O e5 *++[ECO "E70o"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 *++[ECO "E70p"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5 *++[ECO "E70p"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5 e6 *++[ECO "E70p"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5 e6 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 c5 7.d5 e6 8.O-O *++[ECO "E70q"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 e5 *++[ECO "E70r"]+[Variation "King's Indian: 4.e4 d6 5.Bd3 O-O 6.Nge2 e5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bd3 O-O 6.Nge2 e5 7.d5 *++[ECO "E70s"]+[Variation "King's Indian: Accelerated Averbakh System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bg5 *++[ECO "E70t"]+[Variation "King's Indian: Accelerated Averbakh, 5...h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bg5 h6 *++[ECO "E70u"]+[Variation "King's Indian: Accelerated Averbakh, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bg5 O-O *++[ECO "E70v"]+[Variation "King's Indian: Accelerated Averbakh, 5...O-O 6.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bg5 O-O 6.Qd2 *++[ECO "E71a"]+[Variation "King's Indian: Makagonov System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 *++[ECO "E71b"]+[Variation "King's Indian: Makagonov, 5...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 c5 *++[ECO "E71c"]+[Variation "King's Indian: Makagonov, 5...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 Nbd7 *++[ECO "E71d"]+[Variation "King's Indian: Makagonov, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O *++[ECO "E71e"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Be3 *++[ECO "E71f"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Be3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Be3 e5 *++[ECO "E71g"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 *++[ECO "E71h"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c6 *++[ECO "E71i"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 h6 *++[ECO "E71j"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 Nbd7 *++[ECO "E71k"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 Na6 *++[ECO "E71l"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 Na6 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 Na6 7.Bd3 *++[ECO "E71l"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 Na6 7.Bd3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 Na6 7.Bd3 e5 *++[ECO "E71m"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c5 *++[ECO "E71m"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c5 7.d5 *++[ECO "E71n"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 c5 7.d5 b5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c5 7.d5 b5 *++[ECO "E71o"]+[Variation "King's Indian: Makagonov, 5...O-O 6.Bg5 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c5 7.d5 e6 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O 6.Bg2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O 6.Bg2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 Nbd7 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O 6.Bg2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 Nc6 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O 6.Bg2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 c5 *++[ECO "E72"]+[Variation "King's Indian: 4.e4 d6 5.g3 O-O 6.Bg2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 e5 *++[ECO "E72"]+[Variation "King's Indian: Pomar System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 e5 7.Nge2 *++[ECO "E72"]+[Variation "King's Indian: Pomar System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 e5 7.Nge2 Nc6 *++[ECO "E73a"]+[Variation "King's Indian: 5.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 *++[ECO "E73b"]+[Variation "King's Indian: 5.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 c5 *++[ECO "E73c"]+[Variation "King's Indian: 5.Be2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 e5 *++[ECO "E73d"]+[Variation "King's Indian: 5.Be2 e5 6.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 e5 6.d5 *++[ECO "E73e"]+[Variation "King's Indian: 5.Be2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 Nbd7 *++[ECO "E73f"]+[Variation "King's Indian: 5.Be2 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O *++[ECO "E73g"]+[Variation "King's Indian: 5.Be2 O-O 6.g4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.g4 *++[ECO "E73h"]+[Variation "King's Indian: Semi-Averbakh System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Be3 *++[ECO "E73i"]+[Variation "King's Indian: Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 *++[ECO "E73j"]+[Variation "King's Indian: Averbakh, 6...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c6 *++[ECO "E73k"]+[Variation "King's Indian: Averbakh, 6...c6 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c6 7.Qd2 *++[ECO "E73l"]+[Variation "King's Indian: Averbakh, 6...c6 7.Qd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c6 7.Qd2 Nbd7 *++[ECO "E73m"]+[Variation "King's Indian: Averbakh, 6...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Nbd7 *++[ECO "E73n"]+[Variation "King's Indian: Averbakh, 6...Nbd7 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Nbd7 7.Qd2 *++[ECO "E73o"]+[Variation "King's Indian: Averbakh, 6...Nbd7 7.Qd2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Nbd7 7.Qd2 e5 *++[ECO "E73o"]+[Variation "King's Indian: Averbakh, 6...Nbd7 7.Qd2 e5 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Nbd7 7.Qd2 e5 8.d5 *++[ECO "E73o"]+[Variation "King's Indian: Averbakh, 6...Nbd7 7.Qd2 e5 8.d5 Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Nbd7 7.Qd2 e5 8.d5 Nc5 *++[ECO "E73p"]+[Variation "King's Indian: Averbakh, 6...Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 *++[ECO "E73q"]+[Variation "King's Indian: Averbakh, 6...Na6 7.h4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.h4 *++[ECO "E73r"]+[Variation "King's Indian: Averbakh, 6...Na6 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.Qd2 *++[ECO "E73s"]+[Variation "King's Indian: Averbakh, 6...Na6 7.Qd2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.Qd2 e5 *++[ECO "E73s"]+[Variation "King's Indian: Averbakh, 6...Na6 7.Qd2 e5 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.Qd2 e5 8.d5 *++[ECO "E73t"]+[Variation "King's Indian: Averbakh, 6...Na6 7.Qd2 e5 8.d5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.Qd2 e5 8.d5 c6 *++[ECO "E73u"]+[Variation "King's Indian: Averbakh, 6...Na6 7.Qd2 e5 8.d5 Qe8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 Na6 7.Qd2 e5 8.d5 Qe8 *++[ECO "E73v"]+[Variation "King's Indian: Averbakh, 6...h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 *++[ECO "E73w"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 *++[ECO "E73x"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 c5 *++[ECO "E73y"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 e5 *++[ECO "E73y"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3 e5 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 e5 8.d5 *++[ECO "E73y"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3 e5 8.d5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 e5 8.d5 c6 *++[ECO "E73z"]+[Variation "King's Indian: Averbakh, 6...h6 7.Be3 e5 8.d5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 h6 7.Be3 e5 8.d5 Nbd7 *++[ECO "E74a"]+[Variation "King's Indian: Averbakh, 6...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 *++[ECO "E74b"]+[Variation "King's Indian: Averbakh, 6...c5 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.dxc5 *++[ECO "E74b"]+[Variation "King's Indian: Averbakh, 6...c5 7.dxc5 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.dxc5 Qa5 *++[ECO "E74c"]+[Variation "King's Indian: Averbakh, 6...c5 7.dxc5 Qa5 8.Bd2 Qxc5 9.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.dxc5 Qa5 8.Bd2 Qxc5 9.Nf3 Bg4 *++[ECO "E74d"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 *++[ECO "E74e"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 Qa5 *++[ECO "E74f"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 b5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 b5 *++[ECO "E74f"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 b5 8.cxb5 a6 9.a4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 b5 8.cxb5 a6 9.a4 *++[ECO "E74g"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 a6 *++[ECO "E74g"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 a6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 a6 8.Qd2 *++[ECO "E74h"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 a6 8.a4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 a6 8.a4 *++[ECO "E74i"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 a6 8.a4 Qa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 a6 8.a4 Qa5 *++[ECO "E74j"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 *++[ECO "E74j"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Bh4 *++[ECO "E74k"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Be3 *++[ECO "E74l"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Be3 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Be3 e6 *++[ECO "E74m"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Be3 e6 9.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Be3 e6 9.Qd2 *++[ECO "E74n"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Bf4 *++[ECO "E74o"]+[Variation "King's Indian: Averbakh, 6...c5 7.d5 h6 8.Bf4 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 h6 8.Bf4 e6 *++[ECO "E75a"]+[Variation "King's Indian: Averbakh, 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 *++[ECO "E75b"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 *++[ECO "E75b"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 exd5 *++[ECO "E75b"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 exd5 9.exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 exd5 9.exd5 *++[ECO "E75c"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 *++[ECO "E75c"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6 9.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 9.Bd2 *++[ECO "E75c"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6 9.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 9.Be3 *++[ECO "E75c"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6 9.Bf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 9.Bf4 *++[ECO "E75d"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6 9.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 9.Bh4 *++[ECO "E75e"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Nf3 h6 9.Bh4 exd5 10.cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Nf3 h6 9.Bh4 exd5 10.cxd5 *++[ECO "E75f"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 *++[ECO "E75g"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 *++[ECO "E75g"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5 9.exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.exd5 *++[ECO "E75h"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5 9.exd5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.exd5 a6 *++[ECO "E75i"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5 9.exd5 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.exd5 Re8 *++[ECO "E75i"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5 9.exd5 Re8 10.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.exd5 Re8 10.Nf3 *++[ECO "E75j"]+[Variation "King's Indian: Averbakh, 7.d5 e6 8.Qd2 exd5 9.exd5 Re8 10.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.exd5 Re8 10.Nf3 Bg4 *++[ECO "E76a"]+[Variation "King's Indian: Four Pawns Attack"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 *++[ECO "E76b"]+[Variation "King's Indian: Four Pawns Attack, 5...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 *++[ECO "E76b"]+[Variation "King's Indian: Four Pawns Attack, Exchange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 6.dxc5 *++[ECO "E76c"]+[Variation "King's Indian: Four Pawns Attack, 5...c5 6.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 6.d5 *++[ECO "E76d"]+[Variation "King's Indian: Four Pawns Attack, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O *++[ECO "E76e"]+[Variation "King's Indian: Four Pawns Attack, 5...O-O 6.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 *++[ECO "E76e"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Bg4 *++[ECO "E76f"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Na6 *++[ECO "E76g"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Na6 7.e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Na6 7.e5 *++[ECO "E76h"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Na6 7.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Na6 7.Be2 *++[ECO "E76i"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Na6 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Na6 7.Bd3 *++[ECO "E76j"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 Na6 7.Bd3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Na6 7.Bd3 e5 *++[ECO "E76k"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 *++[ECO "E76l"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.dxc5 *++[ECO "E76m"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.dxc5 Qa5 8.Bd3 Qxc5 9.Qe2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.dxc5 Qa5 8.Bd3 Qxc5 9.Qe2 Nc6 *++[ECO "E76n"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 *++[ECO "E76o"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 a6 *++[ECO "E76p"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5 b5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 b5 *++[ECO "E76q"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5 b5 8.cxb5 a6 9.a4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 b5 8.cxb5 a6 9.a4 *++[ECO "E76r"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 e6 *++[ECO "E76r"]+[Variation "King's Indian: Four Pawns Attack, 6.Nf3 c5 7.d5 e6 8.dxe6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 e6 8.dxe6 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, 6.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, 6.Be2 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, Six Pawns line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.dxe6 fxe6 9.g4 Nc6 10.h4 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, 6.Be2 c5 7.d5 e6 8.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.Nf3 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, 6.Be2 c5 7.d5 e6 8.Nf3 exd5 9.exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.Nf3 exd5 9.exd5 *++[ECO "E77"]+[Variation "King's Indian: Four Pawns Attack, Florentine Gambit"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.Nf3 exd5 9.e5 *++[ECO "E78"]+[Variation "King's Indian: Four Pawns Attack, 7.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 *++[ECO "E78"]+[Variation "King's Indian: Four Pawns Attack, 7.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 Bg4 *++[ECO "E78"]+[Variation "King's Indian: Four Pawns Attack, 7.Nf3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 *++[ECO "E78"]+[Variation "King's Indian: Four Pawns Attack, 7.Nf3 cxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 *++[ECO "E79a"]+[Variation "King's Indian: Four Pawns Attack, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 *++[ECO "E79b"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Nxd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Nxd4 *++[ECO "E79c"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Ng4 *++[ECO "E79d"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Bg4 *++[ECO "E79e"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Bd7 *++[ECO "E79e"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Bd7 10.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Bd7 10.Qd2 *++[ECO "E79f"]+[Variation "King's Indian: Four Pawns Attack, Main Line, 9...Bd7 10.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 Bd7 10.O-O *++[ECO "E80a"]+[Variation "King's Indian: Saemisch Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 *++[ECO "E80b"]+[Variation "King's Indian: Saemisch, 5...Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 Na6 *++[ECO "E80c"]+[Variation "King's Indian: Saemisch, 5...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 Nc6 *++[ECO "E80d"]+[Variation "King's Indian: Saemisch, 5...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 Nbd7 *++[ECO "E80e"]+[Variation "King's Indian: Saemisch, 5...e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 e5 *++[ECO "E80f"]+[Variation "King's Indian: Saemisch, 5...e5 6.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 e5 6.Nge2 *++[ECO "E80g"]+[Variation "King's Indian: Saemisch, 5...e5 6.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 e5 6.d5 *++[ECO "E80h"]+[Variation "King's Indian: Saemisch, 5...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c5 *++[ECO "E80i"]+[Variation "King's Indian: Saemisch, 5...c5 Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c5 6.dxc5 dxc5 7.Qxd8+ Kxd8 *++[ECO "E80j"]+[Variation "King's Indian: Saemisch, 5...a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 a6 *++[ECO "E80k"]+[Variation "King's Indian: Saemisch, 5...a6 6.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 a6 6.Be3 *++[ECO "E80l"]+[Variation "King's Indian: Saemisch, 5...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c6 *++[ECO "E80m"]+[Variation "King's Indian: Saemisch, 5...c6 6.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c6 6.Be3 *++[ECO "E80n"]+[Variation "King's Indian: Saemisch, 5...c6 6.Be3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c6 6.Be3 a6 *++[ECO "E80o"]+[Variation "King's Indian: Saemisch, 5...c6 6.Be3 a6 7.a4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c6 6.Be3 a6 7.a4 *++[ECO "E80p"]+[Variation "King's Indian: Saemisch, 5...c6 6.Be3 a6 7.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 c6 6.Be3 a6 7.Bd3 *++[ECO "E81a"]+[Variation "King's Indian: Saemisch, 5...O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O *++[ECO "E81b"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Nge2 *++[ECO "E81c"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Nge2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Nge2 e5 *++[ECO "E81d"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Nge2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Nge2 c5 *++[ECO "E81d"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Nge2 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Nge2 c5 7.d5 *++[ECO "E81e"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 *++[ECO "E81f"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 Nc6 *++[ECO "E81g"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 a6 *++[ECO "E81h"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 *++[ECO "E81h"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 *++[ECO "E81h"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5 7.d5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 a6 *++[ECO "E81h"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5 7.d5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 h6 *++[ECO "E81i"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 *++[ECO "E81i"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Bg5 c5 7.d5 e6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 *++[ECO "E81j"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 *++[ECO "E81k"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 a6 *++[ECO "E81k"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 a6 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 a6 7.Qd2 *++[ECO "E81l"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c6 *++[ECO "E81l"]+[Variation "King's Indian: Saemisch, Byrne Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c6 7.Bd3 a6 *++[ECO "E81m"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 *++[ECO "E81m"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.d5 *++[ECO "E81n"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 7.dxc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.dxc5 *++[ECO "E81n"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.dxc5 dxc5 8.Qxd8+ *++[ECO "E81o"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 7.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.Nge2 *++[ECO "E81o"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 7.Nge2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.Nge2 Nc6 *++[ECO "E81p"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 c5 7.Nge2 Nc6 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.Nge2 Nc6 8.d5 *++[ECO "E81q"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 *++[ECO "E81r"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 *++[ECO "E81s"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7 7.Qd2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 c5 *++[ECO "E81s"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7 7.Qd2 c5 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 c5 8.d5 *++[ECO "E81t"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7 7.Qd2 c5 8.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 c5 8.Nge2 *++[ECO "E81t"]+[Variation "King's Indian: Saemisch, 5...O-O 6.Be3 Nbd7 7.Qd2 c5 8.Nge2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 c5 8.Nge2 a6 *++[ECO "E82a"]+[Variation "King's Indian: Saemisch, Fianchetto"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 *++[ECO "E82b"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Qd2 *++[ECO "E82c"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Qd2 c5 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Qd2 c5 8.d5 *++[ECO "E82d"]+[Variation "King's Indian: Saemisch, Fianchetto, Bronstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 *++[ECO "E82e"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 Nfd7 *++[ECO "E82f"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 Bb7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 Bb7 *++[ECO "E82g"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 Bb7 8.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 Bb7 8.Nge2 *++[ECO "E82g"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 Bb7 8.Nge2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 Bb7 8.Nge2 c5 *++[ECO "E82g"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 Bb7 8.Nge2 c5 9.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 Bb7 8.Nge2 c5 9.d5 e6 *++[ECO "E82h"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 a6 *++[ECO "E82i"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 a6 8.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 a6 8.Nge2 *++[ECO "E82i"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 a6 8.Nge2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 a6 8.Nge2 c5 *++[ECO "E82j"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 a6 8.Nge2 c5 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 a6 8.Nge2 c5 9.d5 *++[ECO "E82k"]+[Variation "King's Indian: Saemisch, Fianchetto, 7.Bd3 a6 8.Nge2 c5 9.e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 7.Bd3 a6 8.Nge2 c5 9.e5 *++[ECO "E83a"]+[Variation "King's Indian: Saemisch, 6...Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 *++[ECO "E83b"]+[Variation "King's Indian: Saemisch, 6...Nc6 7.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Qd2 *++[ECO "E83c"]+[Variation "King's Indian: Saemisch, 6...Nc6 7.Qd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Qd2 a6 *++[ECO "E83c"]+[Variation "King's Indian: Saemisch, 6...Nc6 7.Qd2 a6 8.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Qd2 a6 8.O-O-O *++[ECO "E83d"]+[Variation "King's Indian: Saemisch, 6...Nc6 7.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 *++[ECO "E83e"]+[Variation "King's Indian: Saemisch, Ruban Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 Rb8 *++[ECO "E83e"]+[Variation "King's Indian: Saemisch, Ruban, 8.Qd2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 Rb8 8.Qd2 Re8 *++[ECO "E83f"]+[Variation "King's Indian: Saemisch, Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 *++[ECO "E83g"]+[Variation "King's Indian: Saemisch, Panno, 8.a3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.a3 *++[ECO "E83h"]+[Variation "King's Indian: Saemisch, Panno, 8.Nc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Nc1 *++[ECO "E83i"]+[Variation "King's Indian: Saemisch, Panno, 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 *++[ECO "E83j"]+[Variation "King's Indian: Saemisch, Panno, 8.Qd2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Re8 *++[ECO "E84a"]+[Variation "King's Indian: Saemisch, Panno Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 *++[ECO "E84b"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.a3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.a3 *++[ECO "E84c"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.O-O-O *++[ECO "E84d"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.g4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.g4 *++[ECO "E84e"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Rb1 *++[ECO "E84f"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Bh6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Bh6 *++[ECO "E84g"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Nc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Nc1 *++[ECO "E84g"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Nc1 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Nc1 e5 *++[ECO "E84h"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Nc1 e5 10.Nb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Nc1 e5 10.Nb3 *++[ECO "E84i"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Nc1 e5 10.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Nc1 e5 10.d5 *++[ECO "E84j"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.Nc1 e5 10.d5 Nd4 11.Nb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.Nc1 e5 10.d5 Nd4 11.Nb3 *++[ECO "E84k"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.h4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.h4 *++[ECO "E84l"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.h4 b5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.h4 b5 *++[ECO "E84m"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.h4 h5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.h4 h5 *++[ECO "E84n"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.h4 h5 10.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.h4 h5 10.O-O-O *++[ECO "E84o"]+[Variation "King's Indian: Saemisch, Panno Main Line, 9.h4 h5 10.O-O-O b5 11.Bh6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 9.h4 h5 10.O-O-O b5 11.Bh6 *++[ECO "E85a"]+[Variation "King's Indian: Saemisch, Orthodox Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 *++[ECO "E85b"]+[Variation "King's Indian: Saemisch, Orthodox, 7.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.dxe5 *++[ECO "E85c"]+[Variation "King's Indian: Saemisch, Orthodox, Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.dxe5 dxe5 8.Qxd8 *++[ECO "E85d"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 *++[ECO "E85e"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 exd4 *++[ECO "E85f"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 Nbd7 *++[ECO "E85g"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 Nc6 *++[ECO "E85h"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 Nc6 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 Nc6 8.d5 *++[ECO "E85i"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 Nc6 8.d5 Ne7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 Nc6 8.d5 Ne7 *++[ECO "E85j"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 Nc6 8.d5 Ne7 9.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 Nc6 8.d5 Ne7 9.Qd2 *++[ECO "E86a"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 *++[ECO "E86b"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.d5 *++[ECO "E86c"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qb3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qb3 *++[ECO "E86d"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 *++[ECO "E86e"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 *++[ECO "E86f"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2 Nbd7 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.d5 *++[ECO "E86g"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O *++[ECO "E86h"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O a6 *++[ECO "E86i"]+[Variation "King's Indian: Saemisch, Orthodox, 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O a6 10.Kb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.O-O-O a6 10.Kb1 *++[ECO "E87a"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 *++[ECO "E87b"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 a5 *++[ECO "E87c"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c5 *++[ECO "E87d"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nbd7 *++[ECO "E87e"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 *++[ECO "E87f"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 *++[ECO "E87g"]+[Variation "King's Indian: Saemisch, Orthodox, Bronstein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 Qh4+ *++[ECO "E87h"]+[Variation "King's Indian: Saemisch, Orthodox, Bronstein, 9.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 Qh4+ 9.g3 *++[ECO "E87i"]+[Variation "King's Indian: Saemisch, Orthodox, Bronstein, 9.Bf2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 Qh4+ 9.Bf2 *++[ECO "E87j"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 f5 *++[ECO "E87k"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2 f5 9.O-O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 f5 9.O-O-O *++[ECO "E87l"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2 f5 9.O-O-O f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 f5 9.O-O-O f4 *++[ECO "E87m"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2 f5 9.O-O-O Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 f5 9.O-O-O Nd7 *++[ECO "E87n"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 Nh5 8.Qd2 f5 9.O-O-O Nd7 10.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 f5 9.O-O-O Nd7 10.Bd3 *++[ECO "E88a"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 *++[ECO "E88b"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c6 8.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Qd2 *++[ECO "E88c"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c6 8.Qd2 cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Qd2 cxd5 *++[ECO "E88d"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c6 8.Qd2 cxd5 9.cxd5 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Qd2 cxd5 9.cxd5 a6 *++[ECO "E88e"]+[Variation "King's Indian: Saemisch, Orthodox, 7.d5 c6 8.Qd2 cxd5 9.cxd5 a6 10.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Qd2 cxd5 9.cxd5 a6 10.Bd3 *++[ECO "E88f"]+[Variation "King's Indian: Saemisch, Orthodox, Polugayevsky"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Bd3 *++[ECO "E88g"]+[Variation "King's Indian: Saemisch, Orthodox, Polugayevsky, 8...b5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Bd3 b5 *++[ECO "E88h"]+[Variation "King's Indian: Saemisch, Orthodox, Polugayevsky, 8...cxd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Bd3 cxd5 *++[ECO "E88i"]+[Variation "King's Indian: Saemisch, Orthodox, Polugayevsky, 8...cxd5 9.cxd5 Nh5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Bd3 cxd5 9.cxd5 Nh5 *++[ECO "E89a"]+[Variation "King's Indian: Saemisch, Orthodox Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 *++[ECO "E89b"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 9...a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 a6 *++[ECO "E89c"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 9...Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Bd7 *++[ECO "E89d"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 9...Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 *++[ECO "E89e"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 10.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 10.Qd2 *++[ECO "E89f"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 10.Qd2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 10.Qd2 a6 *++[ECO "E89g"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 10.Qd2 a6 11.g4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 10.Qd2 a6 11.g4 *++[ECO "E89h"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 10.Qd2 a6 11.g4 h5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 10.Qd2 a6 11.g4 h5 *++[ECO "E89i"]+[Variation "King's Indian: Saemisch, Orthodox Main Line, 10.Qd2 a6 11.g4 h5 12.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 9.cxd5 Nbd7 10.Qd2 a6 11.g4 h5 12.h3 *++[ECO "E90a"]+[Variation "King's Indian: 5.Nf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 *++[ECO "E90a"]+[Variation "King's Indian: 5.Nf3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 Nbd7 *++[ECO "E90a"]+[Variation "King's Indian: 5.Nf3 Nbd7 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 Nbd7 6.Be2 *++[ECO "E90a"]+[Variation "King's Indian: 5.Nf3 Nbd7 6.Be2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 Nbd7 6.Be2 e5 *++[ECO "E90b"]+[Variation "King's Indian: 5.Nf3 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 Bg4 *++[ECO "E90c"]+[Variation "King's Indian: 5.Nf3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 c5 *++[ECO "E90d"]+[Variation "King's Indian: 5.Nf3 c5 6.d5 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 c5 6.d5 O-O *++[ECO "E90e"]+[Variation "King's Indian: 5.Nf3 O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O *++[ECO "E90f"]+[Variation "King's Indian: 5.Nf3 O-O 6.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Bd3 *++[ECO "E90g"]+[Variation "King's Indian: Zinnowitz Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Bg5 *++[ECO "E90g"]+[Variation "King's Indian: Zinnowitz, 6...h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Bg5 h6 *++[ECO "E90h"]+[Variation "King's Indian: Larsen Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be3 *++[ECO "E90h"]+[Variation "King's Indian: Larsen, 6...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be3 c5 *++[ECO "E90i"]+[Variation "King's Indian: Larsen, 6...e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be3 e5 *++[ECO "E90j"]+[Variation "King's Indian: Larsen, 6...e5, Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be3 e5 7.dxe5 dxe5 8.Qxd8+ *++[ECO "E90k"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 *++[ECO "E90l"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 Nbd7 *++[ECO "E90l"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 Nbd7 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 Nbd7 7.Bg5 *++[ECO "E90m"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 Na6 *++[ECO "E90m"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 Na6 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 Na6 7.Bg5 *++[ECO "E90n"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 *++[ECO "E90n"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.Be3 *++[ECO "E90o"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.dxe5 dxe5 8.Qxd8+ *++[ECO "E90p"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 *++[ECO "E90q"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 a5 *++[ECO "E90r"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7 *++[ECO "E90r"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7 8.Be3 *++[ECO "E90r"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Nbd7 8.Bg5 *++[ECO "E90s"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Na6 *++[ECO "E90s"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Na6 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Na6 8.Be3 *++[ECO "E90s"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 e5 7.d5 Na6 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 e5 7.d5 Na6 8.Bg5 *++[ECO "E90t"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 *++[ECO "E90t"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.Be3 *++[ECO "E90u"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 *++[ECO "E90v"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 *++[ECO "E90v"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 *++[ECO "E90w"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6 *++[ECO "E90w"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6 9.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6 9.O-O *++[ECO "E90w"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6 9.O-O Nc7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 Na6 9.O-O Nc7 *++[ECO "E90x"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5 *++[ECO "E90x"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5 9.exd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5 9.exd5 *++[ECO "E90y"]+[Variation "King's Indian: 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5 9.exd5 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 exd5 9.exd5 Re8 *++[ECO "E91a"]+[Variation "King's Indian: 6.Be2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 *++[ECO "E91b"]+[Variation "King's Indian: 6.Be2 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 a5 *++[ECO "E91c"]+[Variation "King's Indian: 6.Be2 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 a6 *++[ECO "E91d"]+[Variation "King's Indian: 6.Be2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c6 *++[ECO "E91e"]+[Variation "King's Indian: 6.Be2 c6 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c6 7.O-O *++[ECO "E91f"]+[Variation "King's Indian: 6.Be2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 *++[ECO "E91g"]+[Variation "King's Indian: 6.Be2 c5 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 *++[ECO "E91h"]+[Variation "King's Indian: 6.Be2 c5 7.d5 e6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 e6 *++[ECO "E91h"]+[Variation "King's Indian: 6.Be2 c5 7.d5 e6 8.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 e6 8.O-O *++[ECO "E91i"]+[Variation "King's Indian: 6.Be2 c5 7.d5 e6 8.O-O Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 e6 8.O-O Re8 *++[ECO "E91i"]+[Variation "King's Indian: 6.Be2 c5 7.d5 e6 8.O-O Re8 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 e6 8.O-O Re8 9.Nd2 *++[ECO "E91j"]+[Variation "King's Indian: 6.Be2 c5 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.O-O *++[ECO "E91k"]+[Variation "King's Indian: 6.Be2 c5 7.O-O Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.O-O Nc6 *++[ECO "E91l"]+[Variation "King's Indian: Kazakh Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 *++[ECO "E91l"]+[Variation "King's Indian: Kazakh Variation, 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 7.Bg5 *++[ECO "E91m"]+[Variation "King's Indian: Kazakh Variation, 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 7.O-O *++[ECO "E91m"]+[Variation "King's Indian: Kazakh Variation, 7.O-O c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 7.O-O c5 *++[ECO "E91n"]+[Variation "King's Indian: Kazakh Variation, 7.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 7.O-O c6 *++[ECO "E91o"]+[Variation "King's Indian: 6.Be2 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nc6 *++[ECO "E91p"]+[Variation "King's Indian: 6.Be2 Nc6 7.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nc6 7.d5 *++[ECO "E91q"]+[Variation "King's Indian: 6.Be2 Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nbd7 *++[ECO "E91q"]+[Variation "King's Indian: 6.Be2 Nbd7 7.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nbd7 7.Bg5 *++[ECO "E91r"]+[Variation "King's Indian: 6.Be2 Nbd7 7.e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nbd7 7.e5 *++[ECO "E91s"]+[Variation "King's Indian: 6.Be2 Nbd7 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nbd7 7.O-O *++[ECO "E91t"]+[Variation "King's Indian: 6.Be2 Nbd7 7.O-O c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Nbd7 7.O-O c6 *++[ECO "E91u"]+[Variation "King's Indian: 6.Be2 Bg4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Bg4 *++[ECO "E91v"]+[Variation "King's Indian: 6.Be2 Bg4 7.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Bg4 7.Be3 *++[ECO "E91w"]+[Variation "King's Indian: 6.Be2 Bg4 7.Be3 Nfd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Bg4 7.Be3 Nfd7 *++[ECO "E91x"]+[Variation "King's Indian: 6.Be2 Bg4 7.Be3 Nfd7 8.Rc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Bg4 7.Be3 Nfd7 8.Rc1 *++[ECO "E91y"]+[Variation "King's Indian: 6.Be2 Bg4 7.Be3 Nfd7 8.Ng1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Bg4 7.Be3 Nfd7 8.Ng1 *++[ECO "E92a"]+[Variation "King's Indian: 6.Be2 e5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 *++[ECO "E92b"]+[Variation "King's Indian: 6.Be2 e5 Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 *++[ECO "E92b"]+[Variation "King's Indian: 6.Be2 e5 Queenswap"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 dxe5 *++[ECO "E92c"]+[Variation "King's Indian: 6.Be2 e5 Queenswap, 9.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 dxe5 8.Qxd8 Rxd8 9.Bg5 *++[ECO "E92d"]+[Variation "King's Indian: 6.Be2 e5 Queenswap, 9.Bg5 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 dxe5 8.Qxd8 Rxd8 9.Bg5 c6 *++[ECO "E92e"]+[Variation "King's Indian: 6.Be2 e5 Queenswap, 9.Bg5 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 dxe5 8.Qxd8 Rxd8 9.Bg5 Re8 *++[ECO "E92f"]+[Variation "King's Indian: 6.Be2 e5 Queenswap, 9.Bg5 Re8 10.Nd5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 dxe5 8.Qxd8 Rxd8 9.Bg5 Re8 10.Nd5 *++[ECO "E92g"]+[Variation "King's Indian: Gligoric-Taimanov System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 *++[ECO "E92h"]+[Variation "King's Indian: Gligoric-Taimanov, 7...c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 c6 *++[ECO "E92i"]+[Variation "King's Indian: Gligoric-Taimanov, 7...exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 exd4 *++[ECO "E92j"]+[Variation "King's Indian: Gligoric-Taimanov, 7...Qe7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 Qe7 *++[ECO "E92k"]+[Variation "King's Indian: Gligoric-Taimanov, 7...Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 Ng4 *++[ECO "E92k"]+[Variation "King's Indian: Gligoric-Taimanov, 7...Ng4 8.Bg5 f6 9.Bc1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 Ng4 8.Bg5 f6 9.Bc1 *++[ECO "E92l"]+[Variation "King's Indian: Gligoric-Taimanov, 7...Ng4 8.Bg5 f6 9.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 Ng4 8.Bg5 f6 9.Bh4 *++[ECO "E92m"]+[Variation "King's Indian: Gligoric-Taimanov, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 Ng4 8.Bg5 f6 9.Bh4 Nc6 *++[ECO "E92n"]+[Variation "King's Indian: Petrosian System"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 *++[ECO "E92o"]+[Variation "King's Indian: Petrosian, 7...c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 c5 *++[ECO "E92p"]+[Variation "King's Indian: Petrosian, 7...c5 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 c5 8.Bg5 *++[ECO "E92q"]+[Variation "King's Indian: Petrosian, Stein Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 *++[ECO "E92r"]+[Variation "King's Indian: Petrosian, Stein, 8.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.h3 *++[ECO "E92s"]+[Variation "King's Indian: Petrosian, Stein, 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 *++[ECO "E92s"]+[Variation "King's Indian: Petrosian, Stein, 8.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 *++[ECO "E92t"]+[Variation "King's Indian: Petrosian, Stein, 8.Bg5 h6 9.Bh4 Na6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 *++[ECO "E92u"]+[Variation "King's Indian: Petrosian, Stein, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 10.Nd2 *++[ECO "E92v"]+[Variation "King's Indian: Petrosian, Stein, Main Line, 10...Qe8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 10.Nd2 Qe8 *++[ECO "E92w"]+[Variation "King's Indian: Petrosian, Stein, Main Line, 10...Qe8 11.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 10.Nd2 Qe8 11.O-O *++[ECO "E92w"]+[Variation "King's Indian: Petrosian, Stein, Main Line, 10...Qe8 11.O-O Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 10.Nd2 Qe8 11.O-O Bd7 *++[ECO "E92x"]+[Variation "King's Indian: Petrosian, Stein, Main Line, 10...Qe8 11.O-O Nh7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 8.Bg5 h6 9.Bh4 Na6 10.Nd2 Qe8 11.O-O Nh7 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Qc2 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Be3 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Be3 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Be3 Ng4 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5 h6 9.Bh4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5 h6 9.Bh4 a6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 a6 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5 h6 9.Bh4 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 a5 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Main Line, 8.Bg5 h6 9.Bh4 g5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 g5 *++[ECO "E93"]+[Variation "King's Indian: Petrosian, Keres Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 g5 10.Bg3 Nh5 11.h4 *++[ECO "E94a"]+[Variation "King's Indian: 7.O-O"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O *++[ECO "E94b"]+[Variation "King's Indian: 7.O-O exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 *++[ECO "E94c"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 *++[ECO "E94c"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 c6 *++[ECO "E94c"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3 c6 10.Kh1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 c6 10.Kh1 *++[ECO "E94d"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6 *++[ECO "E94d"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6 10.Be3 *++[ECO "E94e"]+[Variation "King's Indian: 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6 10.Be3 Nh5 11.Qd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 Nc6 10.Be3 Nh5 11.Qd2 *++[ECO "E94f"]+[Variation "King's Indian: Donner Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O c6 *++[ECO "E94g"]+[Variation "King's Indian: Donner, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O c6 8.d5 *++[ECO "E94h"]+[Variation "King's Indian: Donner, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O c6 8.Be3 *++[ECO "E94i"]+[Variation "King's Indian: Glek Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 *++[ECO "E94j"]+[Variation "King's Indian: Glek, 8.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Re1 *++[ECO "E94k"]+[Variation "King's Indian: Glek, 8.Re1 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Re1 c6 *++[ECO "E94k"]+[Variation "King's Indian: Glek, 8.Re1 c6 9.Bf1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Re1 c6 9.Bf1 *++[ECO "E94l"]+[Variation "King's Indian: Glek, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 *++[ECO "E94m"]+[Variation "King's Indian: Glek, 8.Be3 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 *++[ECO "E94n"]+[Variation "King's Indian: Glek, 8.Be3 Ng4 9.Ng5 Qe8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 *++[ECO "E94o"]+[Variation "King's Indian: Glek, Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 10.dxe5 dxe5 *++[ECO "E94o"]+[Variation "King's Indian: Glek, Main Line, 11.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 10.dxe5 dxe5 11.h3 *++[ECO "E94o"]+[Variation "King's Indian: Glek, Main Line, 11.h3 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 10.dxe5 dxe5 11.h3 h6 *++[ECO "E94p"]+[Variation "King's Indian: 7.O-O Nbd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 *++[ECO "E94q"]+[Variation "King's Indian: 7.O-O Nbd7 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.d5 *++[ECO "E94q"]+[Variation "King's Indian: 7.O-O Nbd7 8.d5 Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.d5 Nc5 *++[ECO "E94r"]+[Variation "King's Indian: 7.O-O Nbd7 8.d5 Nc5 9.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.d5 Nc5 9.Qc2 *++[ECO "E94r"]+[Variation "King's Indian: 7.O-O Nbd7 8.d5 Nc5 9.Qc2 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.d5 Nc5 9.Qc2 a5 *++[ECO "E94s"]+[Variation "King's Indian: 7.O-O Nbd7 8.Qc2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Qc2 *++[ECO "E94s"]+[Variation "King's Indian: 7.O-O Nbd7 8.Qc2 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Qc2 Re8 *++[ECO "E94t"]+[Variation "King's Indian: 7.O-O Nbd7 8.Qc2 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Qc2 c6 *++[ECO "E94u"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 *++[ECO "E94v"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 Ng4 *++[ECO "E94w"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 Re8 *++[ECO "E94x"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 c6 *++[ECO "E94y"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3 c6 9.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 c6 9.d5 *++[ECO "E94y"]+[Variation "King's Indian: 7.O-O Nbd7 8.Be3 c6 9.d5 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 c6 9.d5 c5 *++[ECO "E95a"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 *++[ECO "E95b"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 a5 *++[ECO "E95c"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 h6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 h6 *++[ECO "E95d"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 Re8 *++[ECO "E95e"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 Re8 9.Bf1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 Re8 9.Bf1 *++[ECO "E95f"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 exd4 *++[ECO "E95g"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 exd4 9.Nxd4 Nc5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 exd4 9.Nxd4 Nc5 *++[ECO "E95h"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 *++[ECO "E95i"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Rb1 *++[ECO "E95j"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Bf1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 *++[ECO "E95k"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Bf1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 Re8 *++[ECO "E95l"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4 *++[ECO "E95m"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4 10.Nxd4 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4 10.Nxd4 Ng4 *++[ECO "E95n"]+[Variation "King's Indian: 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4 10.Nxd4 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 exd4 10.Nxd4 Re8 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.h3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.h3 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.dxe5 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.dxe5 dxe5 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.Rb1 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.Rb1 Re8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.Rb1 Re8 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.Rb1 Re8 11.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.Rb1 Re8 11.d5 *++[ECO "E96"]+[Variation "King's Indian: 7.O-O Nbd7, Old Main Line, 10.Rb1 Re8 11.d5 Nc5 12.b3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 10.Rb1 Re8 11.d5 Nc5 12.b3 *++[ECO "E97a"]+[Variation "King's Indian: Mar del Plata"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 *++[ECO "E97b"]+[Variation "King's Indian: Mar del Plata, 8.dxe5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.dxe5 *++[ECO "E97c"]+[Variation "King's Indian: Mar del Plata, 8.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.Be3 *++[ECO "E97c"]+[Variation "King's Indian: Mar del Plata, 8.Be3 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.Be3 Ng4 *++[ECO "E97c"]+[Variation "King's Indian: Mar del Plata, 8.Be3 Ng4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.Be3 Ng4 9.Bg5 f6 10.Bc1 *++[ECO "E97d"]+[Variation "King's Indian: Mar del Plata, 8.d5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 *++[ECO "E97d"]+[Variation "King's Indian: Mar del Plata, 8.d5 Ne7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 *++[ECO "E97d"]+[Variation "King's Indian: Mar del Plata, Odessa Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Bg5 *++[ECO "E97e"]+[Variation "King's Indian: Mar del Plata, 9.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Bd2 *++[ECO "E97f"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 *++[ECO "E97g"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Kh8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Kh8 *++[ECO "E97h"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Ne8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Ne8 *++[ECO "E97h"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Ne8 10.c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Ne8 10.c5 *++[ECO "E97i"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 a5 *++[ECO "E97i"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...a5 10.bxa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 a5 10.bxa5 *++[ECO "E97j"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...a5 10.Ba3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 a5 10.Ba3 *++[ECO "E97k"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...a5 10.Ba3 axb4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 a5 10.Ba3 axb4 *++[ECO "E97k"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...a5 10.Ba3 axb4 11.Bxb4 Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 a5 10.Ba3 axb4 11.Bxb4 Nd7 *++[ECO "E97l"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Nh5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 *++[ECO "E97m"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Nh5 10.c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.c5 *++[ECO "E97n"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Nh5 10.g3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.g3 *++[ECO "E97o"]+[Variation "King's Indian: Mar del Plata, Bayonet Attack, 9...Nh5 10.Re1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 *++[ECO "E97p"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 a5 *++[ECO "E97q"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 Nf4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 Nf4 *++[ECO "E97q"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 Nf4 11.Bf1 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 Nf4 11.Bf1 a5 *++[ECO "E97q"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 Nf4 11.Bf1 a5 12.bxa5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 Nf4 11.Bf1 a5 12.bxa5 *++[ECO "E97r"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 f5 *++[ECO "E97s"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 f5 11.Ng5 Nf6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 f5 11.Ng5 Nf6 *++[ECO "E97s"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 f5 11.Ng5 Nf6 12.Bf3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 f5 11.Ng5 Nf6 12.Bf3 *++[ECO "E97s"]+[Variation "King's Indian: Mar del Plata, Bayonet, 9...Nh5 10.Re1 f5 11.Ng5 Nf6 12.Bf3 c6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 Nh5 10.Re1 f5 11.Ng5 Nf6 12.Bf3 c6 *++[ECO "E97t"]+[Variation "King's Indian: Mar del Plata, 9.Nd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 *++[ECO "E97u"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 Ne8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 Ne8 *++[ECO "E97u"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 Ne8 10.b4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 Ne8 10.b4 *++[ECO "E97v"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 Nd7 *++[ECO "E97v"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 Nd7 10.b4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 Nd7 10.b4 *++[ECO "E97w"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 c5 *++[ECO "E97x"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 *++[ECO "E97x"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.Rb1 *++[ECO "E97y"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.a3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 *++[ECO "E97y"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.a3 Bd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 Bd7 *++[ECO "E97z"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.a3 Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 Nd7 *++[ECO "E97z"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.a3 Nd7 11.Rb1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 Nd7 11.Rb1 *++[ECO "E97z"]+[Variation "King's Indian: Mar del Plata, 9.Nd2 a5 10.a3 Nd7 11.Rb1 f5 12.b4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 Nd7 11.Rb1 f5 12.b4 *++[ECO "E98a"]+[Variation "King's Indian: Mar del Plata, 9.Ne1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 *++[ECO "E98b"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 c5 *++[ECO "E98c"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 *++[ECO "E98d"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8 10.Nd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 10.Nd3 *++[ECO "E98d"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8 10.Nd3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 10.Nd3 f5 *++[ECO "E98e"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 10.Be3 *++[ECO "E98f"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8 10.Be3 f5 11.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 10.Be3 f5 11.f3 *++[ECO "E98g"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Ne8 10.Be3 f5 11.f3 f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Ne8 10.Be3 f5 11.f3 f4 *++[ECO "E98h"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 *++[ECO "E98i"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Kh1"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Kh1 *++[ECO "E98j"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Be3 *++[ECO "E98k"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Be3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Be3 f5 *++[ECO "E98l"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Nd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 *++[ECO "E98m"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Nd3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 f5 *++[ECO "E98n"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Nd3 f5 11.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 *++[ECO "E98o"]+[Variation "King's Indian: Mar del Plata, Fischer Variation"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 c5 *++[ECO "E98p"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 Kh8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 Kh8 *++[ECO "E98q"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 Nf6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Nd3 f5 11.Bd2 Nf6 *++[ECO "E98r"]+[Variation "King's Indian: Mar del Plata, 9.Ne1 Nd7 10.f3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3 Nf6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 Nf6 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3 Nf6 12.Bd2"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 Nf6 12.Bd2 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3 Nf6 12.Bd2 f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 Nf6 12.Bd2 f4 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3 Nf6 12.Bd2 f4 13.c5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 Nf6 12.Bd2 f4 13.c5 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Nd3 f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 f4 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Be3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Be3 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Be3 f4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Be3 f4 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Be3 f4 12.Bf2 g5"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Be3 f4 12.Bf2 g5 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Be3 f4 12.Bf2 g5 13.a4"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Be3 f4 12.Bf2 g5 13.a4 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, 10.f3 f5 11.Be3 f4 12.Bf2 g5 13.a4 Ng6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Be3 f4 12.Bf2 g5 13.a4 Ng6 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, Benko Attack"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.g4 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, Benko Attack, 11...Kh8"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.g4 Kh8 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, Benko Attack, 11...Nf6"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.g4 Nf6 *++[ECO "E99"]+[Variation "King's Indian: Mar del Plata, Benko Attack, 11...Nf6 12.Nd3"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.g4 Nf6 12.Nd3 *+
+ pgn/scid_fr.pgn view
@@ -0,0 +1,11822 @@+; Converted from 'scid_fr.eco'; <http://scid.sourceforge.net/>.++[ECO "A00"]+[Variation "attaque d’Amsterdam"]+[Result "*"]+1.e3 e5 2.c4 d6 3.Nc3 Nc6 4.b3 Nf6 *++[ECO "A00"]+[Variation "attaque Durkin"]+[Result "*"]+1.Na3 *++[ECO "A00"]+[Variation "attaque Grob"]+[Result "*"]+1.g4 *++[ECO "A00"]+[Variation "attaque Grob, attaque Spike"]+[Result "*"]+1.g4 d5 2.Bg2 c6 3.g5 *++[ECO "A00"]+[Variation "attaque Grob, contre-gambit Romford"]+[Result "*"]+1.g4 d5 2.Bg2 Bxg4 3.c4 d4 *++[ECO "A00"]+[Variation "attaque Grob, gambit Fritz"]+[Result "*"]+1.g4 d5 2.Bg2 Bxg4 3.c4 *++[ECO "A00"]+[Variation "attaque Réti (= est-indienne en premier), (avec ...e5)"]+[Result "*"]+1.g3 d5 2.Bg2 e5 3.d3 Nf6 4.Nf3 Bd6 5.O-O c6 6.Nc3 *++[ECO "A00"]+[Variation "attaque Réti (= est-indienne en premier), (avec ...e5)"]+[Result "*"]+1.g3 e5 2.Bg2 d5 3.d3 Nf6 4.Nf3 Bd6 5.O-O O-O 6.Nc3 c6 *++[ECO "A00"]+[Variation "gambit Amar (= de Paris)"]+[Result "*"]+1.Nh3 d5 2.g3 e5 3.f4 Bxh3 4.Bxh3 exf4 *++[ECO "A00"]+[Variation "ouverture Amar (= de Paris)"]+[Result "*"]+1.Nh3 *++[ECO "A00"]+[Variation "ouverture Anderssen"]+[Result "*"]+1.a3 *++[ECO "A00"]+[Variation "ouverture anglaise, fianchetto roi (cf. A20)"]+[Result "*"]+1.g3 e5 2.c4 Nf6 3.Bg2 *++[ECO "A00"]+[Variation "ouverture Anti-Borg (= Desprez)"]+[Result "*"]+1.h4 *++[ECO "A00"]+[Variation "ouverture Battambang"]+[Result "*"]+1.Nc3 e5 2.a3 *++[ECO "A00"]+[Variation "ouverture Benkö"]+[Result "*"]+1.g3 *++[ECO "A00"]+[Variation "ouverture Benkö"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 3.Nf3 *++[ECO "A00"]+[Variation "ouverture Benkö, variante Alekhine inversée"]+[Result "*"]+1.g3 e5 2.Nf3 *++[ECO "A00"]+[Variation "ouverture Clemenz (= Mead, Basman, de Klerk)"]+[Result "*"]+1.h3 *++[ECO "A00"]+[Variation "ouverture coup de marteau (= du renard, de la côtelette de porc)"]+[Result "*"]+1.f3 e5 2.Kf2 *++[ECO "A00"]+[Variation "ouverture de Novosibirsk"]+[Result "*"]+1.Nc3 c5 2.d4 cxd4 3.Qxd4 Nc6 4.Qh4 *++[ECO "A00"]+[Variation "ouverture de Saragosse"]+[Result "*"]+1.c3 *++[ECO "A00"]+[Variation "ouverture de Valence"]+[Result "*"]+1.d3 e5 2.Nd2 *++[ECO "A00"]+[Variation "ouverture du crabe"]+[Result "*"]+1.a4 e5 2.h4 *++[ECO "A00"]+[Variation "ouverture du trident (cf. A04, A36, B20)"]+[Result "*"]+1.g3 c5 *++[ECO "A00"]+[Variation "ouverture Dunst (= Sleipner, Heinrichsen)"]+[Result "*"]+1.Nc3 *++[ECO "A00"]+[Variation "ouverture Dunst (= Sleipner, Heinrichsen)"]+[Result "*"]+1.Nc3 e5 *++[ECO "A00"]+[Variation "ouverture Gedult"]+[Result "*"]+1.f3 *++[ECO "A00"]+[Variation "ouverture Lasker"]+[Result "*"]+1.g3 h5 *++[ECO "A00"]+[Variation "ouverture Mieses"]+[Result "*"]+1.d3 *++[ECO "A00"]+[Variation "ouverture Mieses"]+[Result "*"]+1.d3 e5 *++[ECO "A00"]+[Variation "ouverture Polonaise (= Sokolsky, de l’orang-outan)"]+[Result "*"]+1.b4 *++[ECO "A00"]+[Variation "ouverture Polonaise (= Sokolsky, de l’orang-outan)"]+[Result "*"]+1.b4 d5 2.Bb2 Bf5 *++[ECO "A00"]+[Variation "ouverture Polonaise (= Sokolsky, de l’orang-outan), variante tournée"]+[Result "*"]+1.b4 c6 *++[ECO "A00"]+[Variation "ouverture Polonaise (= Sokolsky, de l’orang-outan), variante de Tübingen"]+[Result "*"]+1.b4 Nh6 *++[ECO "A00"]+[Variation "ouverture Polonaise (= Sokolsky, de l’orang-outan), variante d’échange"]+[Result "*"]+1.b4 e5 2.Bb2 Bxb4 3.Bxe5 Nf6 4.c4 O-O 5.e3 *++[ECO "A00"]+[Variation "ouverture Van't Kruijs"]+[Result "*"]+1.e3 *++[ECO "A00"]+[Variation "ouverture vénézuélienne"]+[Result "*"]+1.d3 c5 2.Nc3 Nc6 3.g3 *++[ECO "A00"]+[Variation "ouverture Ware (= du foin)"]+[Result "*"]+1.a4 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen"]+[Result "*"]+1.b3 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante anglaise"]+[Result "*"]+1.b3 c5 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante classique classical variante"]+[Result "*"]+1.b3 d5 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante hollandaise"]+[Result "*"]+1.b3 f5 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante indienne"]+[Result "*"]+1.b3 Nf6 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante moderne"]+[Result "*"]+1.b3 e5 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante polonaise"]+[Result "*"]+1.b3 b5 *++[ECO "A01"]+[Variation "attaque Nimzovitch-Larsen, variante symétrique"]+[Result "*"]+1.b3 b6 *++[ECO "A02"]+[Variation "ouverture Bird"]+[Result "*"]+1.f4 *++[ECO "A02"]+[Variation "ouverture Bird, gambit From"]+[Result "*"]+1.f4 e5 *++[ECO "A02"]+[Variation "ouverture Bird, gambit From, variante Lasker"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 g5 *++[ECO "A02"]+[Variation "ouverture Bird, gambit From, variante Lipke"]+[Result "*"]+1.f4 e5 2.fxe5 d6 3.exd6 Bxd6 4.Nf3 Nh6 5.d4 *++[ECO "A02"]+[Variation "ouverture Bird, gambit Hobbs"]+[Result "*"]+1.f4 g5 *++[ECO "A02"]+[Variation "ouverture Bird, gambit suisse"]+[Result "*"]+1.f4 f5 2.e4 fxe4 3.Nc3 Nf6 4.g4 *++[ECO "A03"]+[Variation "ouverture Bird"]+[Result "*"]+1.f4 d5 *++[ECO "A03"]+[Variation "ouverture Bird, gambit Williams"]+[Result "*"]+1.f4 d5 2.e4 *++[ECO "A03"]+[Variation "ouverture Bird, variante Lasker"]+[Result "*"]+1.f4 d5 2.Nf3 Nf6 3.e3 c5 *++[ECO "A03"]+[Variation "ouverture Mujannah"]+[Result "*"]+1.f4 d5 2.c4 *++[ECO "A04"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d3 g6 4.g3 Bg7 5.Bg2 d6 6.O-O Nf6 7.Nbd2 O-O *++[ECO "A04"]+[Variation "ouverture Réti"]+[Result "*"]+1.Nf3 *++[ECO "A04"]+[Variation "ouverture Réti"]+[Result "*"]+1.Nf3 d6 *++[ECO "A04"]+[Variation "ouverture Réti, défense hollandaise"]+[Result "*"]+1.Nf3 f5 *++[ECO "A04"]+[Variation "ouverture Réti, défense Wade"]+[Result "*"]+1.Nf3 d6 2.e4 Bg4 *++[ECO "A04"]+[Variation "ouverture Réti, gambit Herrstroem"]+[Result "*"]+1.Nf3 g5 *++[ECO "A04"]+[Variation "ouverture Réti, gambit Lisitsine retardé"]+[Result "*"]+1.Nf3 f5 2.d3 Nf6 3.e4 *++[ECO "A04"]+[Variation "ouverture Réti, gambit Pirc-Lisitsine"]+[Result "*"]+1.Nf3 f5 2.e4 *++[ECO "A04/11"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée (cf. A39)"]+[Result "*"]+1.Nf3 c5 2.g3 Nc6 3.Bg2 g6 4.O-O Bg7 5.d3 d6 6.e4 e5 7.c3 Nge7 8.a3 O-O 9.b4 b6 10.Bb2 h6 11.Nbd2 *++[ECO "A04/11"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d3 e6 4.g3 g6 5.Bg2 Bg7 6.O-O Nge7 7.c3 O-O 8.Re1 d6 9.a3 e5 *++[ECO "A04/12"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée (cf. B50/1)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.g3 g6 4.Bg2 Bg7 5.O-O d6 6.d3 e6 7.Re1 Nge7 8.Nbd2 O-O 9.h4 d5 *++[ECO "A04/16"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée (cf. A05/8, B20/1, B30/1)"]+[Result "*"]+1.Nf3 d6 2.e4 Nf6 3.d3 c5 4.g3 Nc6 5.Bg2 g6 6.O-O Bg7 7.c3 O-O 8.Nbd2 Rb8 *++[ECO "A04/16"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.g3 Nf6 4.d3 g6 5.Bg2 Bg7 6.O-O Nc6 7.c3 O-O 8.Re1 Bd7 9.Nbd2 *++[ECO "A05"]+[Variation "attaque Réti (= est-indienne en premier)"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 *++[ECO "A05"]+[Variation "attaque Réti (= est-indienne en premier), variante Réti-Smyslov"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.b4 *++[ECO "A05"]+[Variation "attaque Réti (= est-indienne en premier), variante Spassky"]+[Result "*"]+1.Nf3 Nf6 2.g3 b5 *++[ECO "A05"]+[Variation "ouverture Réti"]+[Result "*"]+1.Nf3 Nf6 *++[ECO "A05/08"]+[Variation "attaque Réti (= est-indienne en premier), variante néo-sicilienne fermée (cf. A04/16, B20/1, B30/1)"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.Bg2 Bg7 4.O-O O-O 5.d3 d6 6.e4 c5 7.Nbd2 Nc6 8.c3 Ne8 *++[ECO "A06"]+[Variation "ouverture Réti"]+[Result "*"]+1.Nf3 d5 *++[ECO "A06"]+[Variation "ouverture Réti, gambit Tennison (= Lemberg, Zukertort)"]+[Result "*"]+1.Nf3 d5 2.e4 *++[ECO "A06"]+[Variation "ouverture Réti, variante vieille indienne"]+[Result "*"]+1.Nf3 d5 2.d3 *++[ECO "A06"]+[Variation "ouverture Santasiere"]+[Result "*"]+1.Nf3 d5 2.b4 *++[ECO "A06/02"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen (avec ...Ff5)"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 Bf5 4.g3 e6 5.Bg2 h6 6.O-O Be7 7.d3 O-O 8.Nbd2 Bh7 *++[ECO "A06/11"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 e6 4.c4 c5 5.e3 Nc6 *++[ECO "A06/11"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen"]+[Result "*"]+1.Nf3 d5 2.b3 c5 3.e3 Nf6 4.Bb2 e6 5.c4 Nc6 6.cxd5 exd5 7.Bb5 *++[ECO "A06/13"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 e6 4.e3 Bd6 5.Be2 Nbd7 6.d4 O-O 7.O-O *++[ECO "A06/14"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen (avec ...g6)"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 g6 4.e3 Bg7 5.Be2 O-O 6.O-O c5 7.c4 *++[ECO "A06/15"]+[Variation "ouverture Réti – attaque Nimzovitch-Larsen (avec ...Fg4)"]+[Result "*"]+1.Nf3 d5 2.b3 Bg4 3.Bb2 Nf6 4.e3 Nbd7 5.Be2 e6 6.O-O Bd6 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier)"]+[Result "*"]+1.Nf3 d5 2.g3 g6 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier)"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 3.Nf3 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), (avec ...c5)"]+[Result "*"]+1.Nf3 d5 2.g3 c5 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), (avec ...c5)"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 3.Nf3 g6 4.O-O Bg7 5.d3 O-O 6.Nc3 c5 7.Rb1 Nc6 8.a3 a5 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), (avec ...e5)"]+[Result "*"]+1.g3 e5 2.Bg2 d5 3.d3 Nc6 4.Nf3 Bg4 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), système Barcza"]+[Result "*"]+1.Nf3 d5 2.g3 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), système Pachman"]+[Result "*"]+1.Nf3 d5 2.g3 g6 3.Bg2 Bg7 4.O-O e5 5.d3 Ne7 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), varainte Kérès"]+[Result "*"]+1.Nf3 d5 2.g3 Bg4 3.Bg2 Nd7 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), variante de l’os de hareng"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.b3 Bf5 5.Bb2 e6 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), variante Petrossian"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 3.Nf3 c6 4.O-O Bf5 5.d3 e6 6.Nbd2 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), variante yougoslave"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 *++[ECO "A07"]+[Variation "attaque Réti (= est-indienne en premier), variante yougoslave"]+[Result "*"]+1.g3 d5 2.Bg2 Nf6 3.Nf3 c6 4.d3 Bg4 5.O-O Nbd7 6.Nbd2 e6 7.h3 Bh5 8.b3 *++[ECO "A07/04"]+[Variation "attaque Réti (= est-indienne en premier), variante yougoslave"]+[Result "*"]+1.g3 d5 2.Bg2 c6 3.Nf3 Bg4 4.d3 Nd7 5.Nbd2 e6 6.O-O Bd6 7.b3 *++[ECO "A08"]+[Variation "attaque Réti (= est-indienne en premier)"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 *++[ECO "A08"]+[Variation "attaque Réti (= est-indienne en premier)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 4.g3 d5 5.Nbd2 Nf6 6.Bg2 Be7 7.O-O *++[ECO "A08/10"]+[Variation "attaque Réti (= est-indienne en premier), variante française"]+[Result "*"]+1.Nf3 d5 2.g3 c5 3.Bg2 Nc6 4.O-O e6 5.d3 Nf6 6.Nbd2 Be7 7.e4 O-O 8.Re1 b5 9.e5 Nd7 10.Nf1 b4 *++[ECO "A09"]+[Variation "gambit Réti"]+[Result "*"]+1.Nf3 d5 2.c4 *++[ECO "A09"]+[Variation "gambit Réti accepté"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 *++[ECO "A09"]+[Variation "gambit Réti accepté, variante Kérès"]+[Result "*"]+1.Nf3 d5 2.c4 dxc4 3.e3 Be6 *++[ECO "A09"]+[Variation "gambit Réti, variante d’avance"]+[Result "*"]+1.Nf3 d5 2.c4 d4 *++[ECO "A10"]+[Variation "ouverture anglaise (cf. A21)"]+[Result "*"]+1.c4 g6 2.Nc3 Bg7 3.g3 *++[ECO "A10"]+[Variation "ouverture anglaise (cf. B06)"]+[Result "*"]+1.c4 g6 2.d4 d6 *++[ECO "A10"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 *++[ECO "A10"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 g6 *++[ECO "A10"]+[Variation "ouverture anglaise, défense Adorjan"]+[Result "*"]+1.c4 g6 2.e4 e5 *++[ECO "A10"]+[Variation "ouverture anglaise, gambit Jänisch"]+[Result "*"]+1.c4 b5 *++[ECO "A10/08"]+[Variation "ouverture anglaise – défense hollandaise (cf. A26/03, A21/11)"]+[Result "*"]+1.c4 f5 2.Nc3 Nf6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 Nc6 7.Nge2 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 g6 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.Qc2 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.e3 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 3.b3 Bg7 4.Bb2 O-O 5.g3 c6 6.Bg2 d5 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.Nf3 Nf6 2.g3 d5 3.Bg2 g6 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.c4 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 c6 4.O-O Bg4 5.c4 *++[ECO "A11"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.Nf3 d5 2.g3 Nf6 3.Bg2 Bf5 *++[ECO "A12"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 *++[ECO "A12"]+[Variation "ouverture anglaise, système défensif Caro-Kann"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 *++[ECO "A12"]+[Variation "ouverture anglaise, système défensif Caro-Kann, variante Bogolioubof"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Bg4 *++[ECO "A12"]+[Variation "ouverture anglaise, système défensif de Londres (= New-York)"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bf5 *++[ECO "A12"]+[Variation "ouverture anglaise, système défensif de Londres (= New-York)"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 Bf5 *++[ECO "A12"]+[Variation "ouverture anglaise, variante Capablanca"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 Bg4 *++[ECO "A12"]+[Variation "ouverture anglaise, variante de Bled"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.Bb2 g6 *++[ECO "A12"]+[Variation "ouverture anglaise, variante de Bled"]+[Result "*"]+1.Nf3 d5 2.b3 Nf6 3.Bb2 g6 4.e3 Bg7 5.c4 c6 6.d4 O-O 7.Be2 Re8 *++[ECO "A12/18"]+[Variation "ouverture anglaise, système défensif Torre (avec 4...Fg4, cf. A07)"]+[Result "*"]+1.c4 c6 2.Nf3 d5 3.b3 Nf6 4.g3 Bg4 5.Bg2 e6 6.Bb2 Nbd7 7.O-O Bd6 8.d3 O-O 9.Nbd2 Qe7 10.a3 a5 11.Qc2 e5 12.e4 dxe4 13.dxe4 Rfd8 14.h3 Bh5 15.Nh4 Bg6 *++[ECO "A13"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 e6 *++[ECO "A13"]+[Variation "ouverture anglaise, défense Kurajica (cf. E03)"]+[Result "*"]+1.c4 e6 2.g3 d5 3.Bg2 c6 4.Qc2 dxc4 5.Qxc4 b5 6.Qc2 Bb7 *++[ECO "A13"]+[Variation "ouverture anglaise, défense Kurajica"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 c6 *++[ECO "A13"]+[Variation "ouverture anglaise, gambit Romanichine"]+[Result "*"]+1.c4 e6 2.Nf3 Nf6 3.g3 a6 4.Bg2 b5 *++[ECO "A13"]+[Variation "ouverture anglaise, système Wimpey"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.b3 Nf6 4.Bb2 c5 5.e3 *++[ECO "A13"]+[Variation "ouverture anglaise, variante Agincourt"]+[Result "*"]+1.c4 e6 2.Nf3 d5 *++[ECO "A13"]+[Variation "ouverture anglaise, variante Agincourt"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 *++[ECO "A13"]+[Variation "ouverture anglaise, variante néo-catalane (avec 4...dxc4)"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 dxc4 5.Qa4+ Nbd7 *++[ECO "A13"]+[Variation "ouverture anglaise, variante néo-catalane (avec 4...dxc4, cf. E03)"]+[Result "*"]+1.c4 e6 2.g3 d5 3.Bg2 Nf6 4.Nf3 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.d4 a6 8.Qc2 cxd4 *++[ECO "A13"]+[Variation "ouverture anglaise, variante néo-catalane"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 *++[ECO "A13"]+[Variation "ouverture anglaise, variante néo-Tarrasch (cf. D41)"]+[Result "*"]+1.c4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 d5 5.O-O Nc6 6.d4 Be7 7.cxd5 Nxd5 *++[ECO "A14"]+[Variation "ouverture anglaise, variante néo-catalane, gambit refusé"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O *++[ECO "A14"]+[Variation "ouverture anglaise, variante symétrique, défense Kérès"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.g3 Nf6 4.Bg2 Be7 5.O-O c5 6.cxd5 Nxd5 7.Nc3 Nc6 *++[ECO "A14"]+[Variation "ouverture anglaise, variante symétrique, système hérisson (avec g3, ...e6, b3, cf. A14)"]+[Result "*"]+1.c4 e6 2.Nf3 d5 3.b3 Nf6 4.g3 c5 5.Bg2 Be7 6.O-O O-O 7.Bb2 b6 8.e3 Bb7 9.Nc3 *++[ECO "A14/11"]+[Variation "ouverture anglaise, variante symétrique, système hérisson (cf. A30)"]+[Result "*"]+1.Nf3 Nf6 2.c4 c5 3.g3 b6 4.Bg2 Bb7 5.b3 e6 6.O-O Be7 7.Bb2 O-O 8.Nc3 d5 9.e3 *++[ECO "A15"]+[Variation "ouverture anglaise (cf. A11)"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 3.b3 Bg7 4.Bb2 O-O 5.g3 c6 6.Bg2 d5 *++[ECO "A15"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 Nf6 2.Nf3 *++[ECO "A15"]+[Variation "ouverture anglaise, défense anglo-indienne"]+[Result "*"]+1.c4 Nf6 *++[ECO "A15"]+[Variation "ouverture anglaise, système orang-outan"]+[Result "*"]+1.c4 Nf6 2.b4 *++[ECO "A15"]+[Variation "ouverture anglaise, variante de Brême (cf. A24)"]+[Result "*"]+1.Nf3 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d6 6.Nc3 e5 7.d3 c6 8.Rb1 a5 *++[ECO "A16"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 Nf6 2.Nc3 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld - Brême (cf. A24)"]+[Result "*"]+1.Nf3 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d6 6.Nc3 e5 7.d3 c6 8.Rb1 a5 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld (avec ...g6 5.e3)"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.e3 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld (sans...d5, cf. A26)"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.d3 d6 6.Rb1 Nc6 7.Nf3 e5 8.O-O a5 9.a3 h6 10.b4 axb4 11.axb4 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld, défense Smyslov"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nxc3 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld, défense tchèque"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.g3 g6 5.Bg2 Nb6 *++[ECO "A16"]+[Variation "ouverture anglaise, système anglo-Grünfeld, variante Kortchnoï"]+[Result "*"]+1.c4 Nf6 2.Nc3 d5 3.cxd5 Nxd5 4.Nf3 g6 5.g3 Bg7 6.Bg2 e5 *++[ECO "A17"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 *++[ECO "A17"]+[Variation "ouverture anglaise, système Nimzo-anglais"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 Bb4 *++[ECO "A17"]+[Variation "ouverture anglaise, système ouest-indien"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 *++[ECO "A17"]+[Variation "ouverture anglaise, système ouest-indien, variante Romanichine"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.e4 Bb7 5.Bd3 *++[ECO "A17/02"]+[Variation "ouverture anglaise, système ouest-indien (d4 retardé)"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Re1 *++[ECO "A18"]+[Variation "ouverture anglaise, variante Mikenas-Carls"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 *++[ECO "A18"]+[Variation "ouverture anglaise, variante Mikenas-Carls, sous-variante Flohr"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 d5 4.e5 *++[ECO "A18"]+[Variation "ouverture anglaise, variante Mikenas-Carls, sous-variante Kevitz"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 Nc6 *++[ECO "A19"]+[Variation "ouverture anglaise, variante Mikenas-Carls, sous-variante sicilienne"]+[Result "*"]+1.c4 Nf6 2.Nc3 e6 3.e4 c5 *++[ECO "A20"]+[Variation "ouverture anglaise (cf. A00)"]+[Result "*"]+1.c4 e5 2.g3 *++[ECO "A20"]+[Variation "ouverture anglaise, variante Nimzovitch"]+[Result "*"]+1.c4 e5 2.Nf3 *++[ECO "A20"]+[Variation "ouverture anglaise, variante Nimzovitch moderne (cf. A00)"]+[Result "*"]+1.c4 e5 2.g3 Nf6 3.Bg2 d5 4.cxd5 Nxd5 5.Nf3 Nc6 6.O-O *++[ECO "A20"]+[Variation "ouverture anglaise, variante Nimzovitch, sous-variante Flohr"]+[Result "*"]+1.c4 e5 2.Nf3 e4 *++[ECO "A20/04"]+[Variation "ouverture anglaise, ligne piège"]+[Result "*"]+1.g3 e5 2.c4 Nf6 3.Bg2 c6 4.d4 exd4 5.Qxd4 d5 6.Nf3 Be7 7.cxd5 cxd5 8.O-O Nc6 9.Qa4 O-O 10.Nc3 *++[ECO "A21"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 e5 2.Nc3 *++[ECO "A21"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 *++[ECO "A21"]+[Variation "ouverture anglaise, contre-attaque Kramnik-Shirov"]+[Result "*"]+1.c4 e5 2.Nc3 Bb4 *++[ECO "A21"]+[Variation "ouverture anglaise, défense Smyslov"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.Nf3 Bg4 *++[ECO "A21"]+[Variation "ouverture anglaise, défense Troeger"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.g3 Be6 4.Bg2 Nc6 *++[ECO "A21"]+[Variation "ouverture anglaise, système vieille indienne (cf. A26)"]+[Result "*"]+1.d4 d6 2.c4 e5 3.Nf3 e4 4.Ng5 f5 5.Nc3 c6 6.Nh3 Be7 7.g3 *++[ECO "A21"]+[Variation "ouverture anglaise, variante Kérès"]+[Result "*"]+1.c4 e5 2.Nc3 d6 3.g3 c6 *++[ECO "A21/12"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 g6 2.Nc3 Bg7 3.g3 e5 4.Bg2 d6 5.d3 f5 6.Nf3 Nf6 7.O-O *++[ECO "A22"]+[Variation "ouverture anglaise"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 *++[ECO "A22"]+[Variation "ouverture anglaise, gambit Bellon"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 e4 4.Ng5 b5 *++[ECO "A22"]+[Variation "ouverture anglaise, système de Brême"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 *++[ECO "A22"]+[Variation "ouverture anglaise, système de Brême, dragon inversé"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 *++[ECO "A22"]+[Variation "ouverture anglaise, système de Brême, variante Smyslov"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 Bb4 *++[ECO "A23"]+[Variation "ouverture anglaise, système de Brême, variante Kérès"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 c6 *++[ECO "A24"]+[Variation "ouverture anglaise, système de Brême (avec ...g6)"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 g6 *++[ECO "A24"]+[Variation "ouverture anglaise, système de Brême, ligne moderne (cf. A16)"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.d3 d6 6.Rb1 Nc6 7.Nf3 e5 8.O-O a5 9.a3 h6 *++[ECO "A24"]+[Variation "ouverture anglaise, système de Brême, ligne moderne"]+[Result "*"]+1.Nf3 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d6 6.Nc3 e5 7.d3 c6 8.Rb1 a5 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé (avec 5.Tb1)"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Rb1 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé (avec 5.Tb1), variante Taimanov"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Rb1 Nh6 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé (sans ...d6)"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé, variante Hort"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 Be6 *++[ECO "A25"]+[Variation "ouverture anglaise, système fermé, variante Taimanov"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 d6 6.Nge2 Nh6 *++[ECO "A25"]+[Variation "ouverture anglaise, variante sicilienne inversée"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 *++[ECO "A26"]+[Variation "ouverture anglaise, système Botvinnik"]+[Result "*"]+1.c4 g6 2.g3 Bg7 3.Bg2 Nf6 4.Nc3 O-O 5.e4 d6 6.Nge2 Nc6 7.d3 e5 8.O-O *++[ECO "A26"]+[Variation "ouverture anglaise, système Botvinnik (avec ...f5)"]+[Result "*"]+1.c4 e5 2.g3 Nc6 3.Bg2 g6 4.Nc3 Bg7 5.d3 f5 *++[ECO "A26"]+[Variation "ouverture anglaise, système Botvinnik"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.e4 *++[ECO "A26"]+[Variation "ouverture anglaise, système fermé"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 *++[ECO "A26"]+[Variation "ouverture anglaise, système fermé, ligne moderne (cf. A16)"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.d3 d6 *++[ECO "A26"]+[Variation "ouverture anglaise, système fermé, ligne moderne"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 Nc6 4.g3 g6 5.Bg2 Bg7 6.O-O O-O 7.d3 d6 *++[ECO "A26/07"]+[Variation "ouverture anglaise, système fermé (avec ...f5)"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 g6 4.g3 Bg7 5.Bg2 d6 6.d3 f5 7.O-O Nf6 8.Rb1 O-O 9.b4 h6 *++[ECO "A26/09"]+[Variation "ouverture anglaise, système fermé, formation vieille indienne"]+[Result "*"]+1.d4 d6 2.c4 e5 3.Nf3 e4 4.Ng5 f5 5.Nc3 c6 6.Nh3 Be7 7.g3 *++[ECO "A26/11"]+[Variation "ouverture anglaise, système fermé, ligne moderne (cf. A16/02)"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.d3 d6 6.Rb1 Nc6 7.Nf3 e5 8.O-O a5 9.a3 h6 10.b4 axb4 11.axb4 *++[ECO "A26/11"]+[Variation "ouverture anglaise, système fermé, ligne moderne (cf. A16/02)"]+[Result "*"]+1.c4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.Nc3 d6 6.O-O e5 7.d3 Nc6 8.Rb1 a5 *++[ECO "A27"]+[Variation "ouverture anglaise, système des trois cavaliers"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, (avec 4.e3)"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, variante Capablanca"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d3 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, variante Marini"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.a3 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, variante Nimzovitch"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e4 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, variante Romanichine"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 5.Qc2 Bxc3 *++[ECO "A28"]+[Variation "ouverture anglaise, système des quatre cavaliers, variante Stean"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.e3 Bb4 5.Qc2 O-O 6.Nd5 Re8 7.Qf5 *++[ECO "A28"]+[Variation "ouverture anglaise, variante Bradley Beach"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 e4 *++[ECO "A28"]+[Variation "ouverture anglaise, variante Nenarokov"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.d4 exd4 5.Nxd4 Bb4 6.Bg5 h6 7.Bh4 Bxc3+ 8.bxc3 Ne5 *++[ECO "A29"]+[Variation "ouverture anglaise, système des quatre cavaliers, fianchetto roi"]+[Result "*"]+1.c4 e5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 Bb4 5.Bg2 O-O 6.O-O e4 *++[ECO "A29/06"]+[Variation "ouverture anglaise, (avec ...d5), dragon inversé"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 Nb6 6.Nf3 Nc6 7.O-O Be7 8.Rb1 *++[ECO "A29/19"]+[Variation "ouverture anglaise, système des quatre cavaliers, fianchetto roi"]+[Result "*"]+1.c4 e5 2.Nc3 Nf6 3.Nf3 Nc6 4.g3 Bb4 5.Bg2 O-O 6.O-O e4 7.Ne1 Bxc3 8.dxc3 h6 9.Nc2 Re8 10.Ne3 d6 *++[ECO "A30"]+[Variation "ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 *++[ECO "A30"]+[Variation "ouverture anglaise, variante symétrique, système hérisson"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 *++[ECO "A30"]+[Variation "ouverture anglaise, variante symétrique, système hérisson, formation flexible"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.g3 b6 4.Bg2 Bb7 5.O-O e6 6.Nc3 Be7 7.d4 cxd4 8.Qxd4 d6 9.Rd1 a6 10.b3 Nbd7 *++[ECO "A30"]+[Variation "ouverture anglaise, variante symétrique, système hérisson, ligne naturelle (cf. A14)"]+[Result "*"]+1.Nf3 Nf6 2.c4 c5 3.g3 b6 4.Bg2 Bb7 5.b3 e6 6.O-O Be7 7.Bb2 O-O 8.Nc3 d6 *++[ECO "A31"]+[Variation "ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 *++[ECO "A31"]+[Variation "ouverture anglaise, variante symétrique, formation défense Benoni"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 *++[ECO "A32"]+[Variation "ouverture anglaise, ligne moderne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 c5 4.Nf3 cxd4 5.Nxd4 Qc7 6.Nc3 a6 *++[ECO "A32"]+[Variation "ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 *++[ECO "A32"]+[Variation "ouverture anglaise, variante symétrique, ligne moderne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.g3 O-O 6.Bg2 cxd4 *++[ECO "A33"]+[Variation "ouverture anglaise, variante symétrique (cf. E22)"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 *++[ECO "A33"]+[Variation "ouverture anglaise, variante symétrique, sous-variante Geller"]+[Result "*"]+1.c4 c5 2.Nf3 Nf6 3.d4 cxd4 4.Nxd4 e6 5.Nc3 Nc6 6.g3 Qb6 *++[ECO "A34"]+[Variation "ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 *++[ECO "A34"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 *++[ECO "A34"]+[Variation "Ouverture anglaise, variante symétrique, système des trois cavaliers"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 d5 4.cxd5 Nxd5 *++[ECO "A34"]+[Variation "Ouverture anglaise, variante symétrique, système Rubinstein"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.g3 d5 4.cxd5 Nxd5 5.Bg2 Nc7 *++[ECO "A34/27"]+[Variation "Ouverture anglaise, variante symétrique (avec ...Cc6, g3)"]+[Result "*"]+1.c4 c5 2.Nc3 Nf6 3.Nf3 Nc6 4.g3 d5 5.cxd5 Nxd5 6.Bg2 Nc7 7.O-O e5 8.d3 Be7 *++[ECO "A35"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 *++[ECO "A35"]+[Variation "Ouverture anglaise, variante symétrique, système des quatre cavaliers"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 *++[ECO "A36"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 *++[ECO "A36"]+[Variation "Ouverture anglaise, variante symétrique, système Botvinnik"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e4 *++[ECO "A36"]+[Variation "Ouverture anglaise, variante symétrique, système Botvinnik inversé"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.e3 e5 *++[ECO "A36"]+[Variation "Ouverture anglaise, variante ultra-symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 *++[ECO "A36/18"]+[Variation "Ouverture anglaise, variante symétrique, système Botvinnik moderne"]+[Result "*"]+1.c4 Nf6 2.Nc3 g6 3.g3 Bg7 4.Bg2 O-O 5.e4 c5 6.Nge2 Nc6 7.O-O d6 8.d3 Rb8 9.Rb1 b6 10.a3 *++[ECO "A37"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 *++[ECO "A37"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.Nf3 c5 2.g3 g6 3.c4 Bg7 4.Bg2 Nc6 5.Nc3 e6 6.O-O Nge7 7.d3 O-O 8.Bd2 d5 9.a3 b6 10.Rb1 Bb7 11.b4 cxb4 12.axb4 dxc4 13.dxc4 *++[ECO "A37"]+[Variation "Ouverture anglaise, variante symétrique, système Botvinnik inversé"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 e5 *++[ECO "A38"]+[Variation "Ouverture anglaise, variante symétrique"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 *++[ECO "A38"]+[Variation "Ouverture anglaise, variante symétrique, ligne principale (avec b3)"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.b3 *++[ECO "A38"]+[Variation "Ouverture anglaise, variante symétrique, ligne principale (avec d3)"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d3 *++[ECO "A39"]+[Variation "Ouverture anglaise, variante symétrique, ligne principale (avec d4)"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 *++[ECO "A39/02"]+[Variation "Ouverture anglaise, variante symétrique, ligne principale (avec d4)"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Qb6 9.Nc2 d6 *++[ECO "A39/10"]+[Variation "Ouverture anglaise, variante symétrique, ligne moderne"]+[Result "*"]+1.Nf3 c5 2.g3 Nc6 3.Bg2 g6 4.O-O Bg7 5.c4 d6 6.Nc3 Nf6 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 O-O 10.Qd3 Rb8 *++[ECO "A39/10"]+[Variation "Ouverture anglaise, variante symétrique, ligne principale, échange des cavaliers"]+[Result "*"]+1.c4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nf3 Nf6 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4 9.Qxd4 d6 10.Qd3 Rb8 *++[ECO "A40"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 *++[ECO "A40"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 e6 *++[ECO "A40"]+[Variation "défence moderne"]+[Result "*"]+1.d4 g6 *++[ECO "A40"]+[Variation "défense anglaise"]+[Result "*"]+1.d4 b6 *++[ECO "A40"]+[Variation "défense de l’hallebardier"]+[Result "*"]+1.d4 g6 2.c4 Bg7 3.Nc3 c5 4.d5 Bxc3+ 5.bxc3 f5 *++[ECO "A40"]+[Variation "défense franco-indienne (= Kérès)"]+[Result "*"]+1.d4 e6 2.c4 Bb4+ *++[ECO "A40"]+[Variation "défense Kérès"]+[Result "*"]+1.d4 e6 2.c4 b6 *++[ECO "A40"]+[Variation "défense Lundin (= Kevitz - Mikenas)"]+[Result "*"]+1.d4 Nc6 *++[ECO "A40"]+[Variation "défense polonaise"]+[Result "*"]+1.d4 b5 *++[ECO "A40"]+[Variation "gambit Englund (= Charlick)"]+[Result "*"]+1.d4 e5 *++[ECO "A40"]+[Variation "gambit Englund (= Charlick)"]+[Result "*"]+1.d4 e5 2.dxe5 Nc6 3.Nf3 Qe7 4.Qd5 f6 5.exf6 Nxf6 *++[ECO "A41"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 d6 *++[ECO "A41"]+[Variation "défense moderne"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 *++[ECO "A41"]+[Variation "défense Robatsch, variante Rossolimo"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.c4 Bg4 *++[ECO "A41"]+[Variation "défense vieille indienne (avec 4.Cg5)"]+[Result "*"]+1.d4 d6 2.c4 e5 3.Nf3 e4 4.Ng5 f5 5.g3 Be7 6.Nh3 *++[ECO "A41"]+[Variation "défense vieille indienne"]+[Result "*"]+1.d4 d6 2.c4 *++[ECO "A41"]+[Variation "défense vieille indienne, variante d’échange"]+[Result "*"]+1.d4 d6 2.c4 e5 3.dxe5 dxe5 4.Qxd8+ Kxd8 5.Nc3 c6 6.Nf3 f6 7.g3 Be6 *++[ECO "A41"]+[Variation "défense vieille indienne, variante Tartakover (= Wade)"]+[Result "*"]+1.d4 d6 2.Nf3 Bg4 *++[ECO "A42"]+[Variation "défense du Ptérodactyle"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 c5 5.Nf3 Qa5 *++[ECO "A42"]+[Variation "défense moderne, système Averbakh"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 *++[ECO "A42"]+[Variation "défense moderne, système Averbakh, variante du cavalier sur la bande"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 f5 *++[ECO "A42"]+[Variation "défense moderne, système Averbakh, variante Kotov"]+[Result "*"]+1.d4 d6 2.c4 g6 3.Nc3 Bg7 4.e4 Nc6 *++[ECO "A43"]+[Variation "défense du faucon (= du hibou)"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 c4 *++[ECO "A43"]+[Variation "défense vieille défense Benoni"]+[Result "*"]+1.d4 c5 *++[ECO "A43"]+[Variation "défense vieille défense Benoni"]+[Result "*"]+1.d4 c5 2.d5 Nf6 *++[ECO "A43"]+[Variation "défense vieille défense Benoni"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nf3 *++[ECO "A43"]+[Variation "défense vieille défense Benoni"]+[Result "*"]+1.d4 c5 2.d5 d6 *++[ECO "A43"]+[Variation "défense vieille défense Benoni, formation Mujannah"]+[Result "*"]+1.d4 c5 2.d5 f5 *++[ECO "A43"]+[Variation "défense vieille défense Benoni, système Franco-défense Benoni"]+[Result "*"]+1.d4 c5 2.d5 e6 3.e4 *++[ECO "A43"]+[Variation "défense vieille défense Benoni, système Schmid"]+[Result "*"]+1.d4 c5 2.d5 d6 3.Nc3 g6 *++[ECO "A43"]+[Variation "défense Woozle"]+[Result "*"]+1.d4 c5 2.d5 Nf6 3.Nc3 Qa5 *++[ECO "A44"]+[Variation "défense semi-défense Benoni, variante de blocage"]+[Result "*"]+1.d4 c5 2.d5 e5 3.e4 d6 *++[ECO "A44"]+[Variation "défense vieille défense Benoni"]+[Result "*"]+1.d4 c5 2.d5 e5 *++[ECO "A45"]+[Variation "attaque Gedult"]+[Result "*"]+1.d4 Nf6 2.f3 d5 3.g4 *++[ECO "A45"]+[Variation "attaque Paleface"]+[Result "*"]+1.d4 Nf6 2.f3 *++[ECO "A45"]+[Variation "attaque Trompovsky (= Ruth, Opovcensky)"]+[Result "*"]+1.d4 Nf6 2.Bg5 *++[ECO "A45"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 *++[ECO "A45"]+[Variation "gambit Blackmar-Diemer"]+[Result "*"]+1.d4 Nf6 2.f3 d5 3.e4 *++[ECO "A45"]+[Variation "gambit Bronstein"]+[Result "*"]+1.d4 Nf6 2.g4 *++[ECO "A45"]+[Variation "ouverture du canard"]+[Result "*"]+1.d4 Nf6 2.f4 *++[ECO "A45/01"]+[Variation "gambit Spike (= Gibbins - Wiedenhagen)"]+[Result "*"]+1.d4 Nf6 2.g4 Nxg4 3.e4 d6 4.Be2 Nf6 5.Nc3 *++[ECO "A45/02"]+[Variation "début du pion dame (cf. B07)"]+[Result "*"]+1.d4 Nf6 2.g3 c5 3.d5 b5 4.Bg2 Bb7 *++[ECO "A45/02"]+[Variation "début du pion dame (cf. B07)"]+[Result "*"]+1.d4 Nf6 2.g3 d5 3.Bg2 Bf5 4.Nf3 e6 5.O-O *++[ECO "A45/02"]+[Variation "début du pion dame (cf. B07)"]+[Result "*"]+1.d4 Nf6 2.g3 d6 3.Bg2 g6 4.e4 Bg7 5.Ne2 O-O 6.O-O e5 7.h3 *++[ECO "A45/02"]+[Variation "début du pion dame (cf. B07)"]+[Result "*"]+1.d4 Nf6 2.g3 g6 3.Bg2 Bg7 4.e4 d6 5.Ne2 O-O 6.O-O e5 *++[ECO "A45/06"]+[Variation "attaque Torre (cf. A46)"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 h6 4.Bxf6 Qxf6 5.e4 d6 6.Nc3 Nd7 7.Qd2 *++[ECO "A46"]+[Variation "attaque Torre"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 *++[ECO "A46"]+[Variation "attaque Torre, gambit Wagner"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bg5 c5 4.e4 *++[ECO "A46"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 2.Nf3 *++[ECO "A46"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 *++[ECO "A46"]+[Variation "début du pion dame, système Andersson"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 cxd4 5.Nxd4 a6 6.O-O Qc7 7.Nb3 *++[ECO "A46"]+[Variation "début du pion dame, système Youssoupof - Rubinstein"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.e3 *++[ECO "A46"]+[Variation "début du pion dame, variante Lasker"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.g3 *++[ECO "A46"]+[Variation "défense Döry"]+[Result "*"]+1.d4 Nf6 2.Nf3 Ne4 *++[ECO "A47"]+[Variation "défense ouest-indienne"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 *++[ECO "A47"]+[Variation "défense ouest-indienne, système de Marienbad"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 c5 *++[ECO "A47"]+[Variation "défense ouest-indienne, système de Marienbad, variante Berg"]+[Result "*"]+1.d4 Nf6 2.Nf3 b6 3.g3 Bb7 4.Bg2 c5 5.c4 cxd4 6.Qxd4 *++[ECO "A48"]+[Variation "défense est-indienne"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 *++[ECO "A48"]+[Variation "défense est-indienne, attaque Torre"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 *++[ECO "A48"]+[Variation "défense est-indienne, système de Londres"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bf4 *++[ECO "A48/10"]+[Variation "défense est-indienne, attaque Torre"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Bg5 Bg7 4.Nbd2 d5 5.Bxf6 *++[ECO "A49"]+[Variation "défense est-indienne (sans c4)"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 *++[ECO "A49"]+[Variation "défense est-indienne, attaque Nimzovitch-Larsen (cf. A05)"]+[Result "*"]+1.Nf3 Nf6 2.g3 g6 3.b3 Bg7 4.Bb2 O-O 5.Bg2 d6 6.d4 *++[ECO "A49/08"]+[Variation "défense est-indienne, fianchetto roi (sans c4, 6.Cc3) (cf. D02)"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d6 6.Nc3 Nbd7 7.e4 e5 8.h3 Re8 9.Re1 *++[ECO "A49/10"]+[Variation "défense est-indienne, attaque Nimzovitch-Larsen (cf. A01)"]+[Result "*"]+1.Nf3 Nf6 2.b3 g6 3.Bb2 Bg7 4.g3 O-O 5.Bg2 d6 6.d4 Nbd7 7.O-O e5 *++[ECO "A49/10"]+[Variation "défense est-indienne, attaque Nimzovitch-Larsen (cf. A06)"]+[Result "*"]+1.Nf3 Nf6 2.b3 d6 3.d4 g6 4.Bb2 Bg7 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 *++[ECO "A50"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 2.c4 *++[ECO "A50"]+[Variation "défense Kevitz-Trajkovitch"]+[Result "*"]+1.d4 Nf6 2.c4 Nc6 *++[ECO "A50"]+[Variation "défense ouest-indienne accélérée"]+[Result "*"]+1.d4 Nf6 2.c4 b6 *++[ECO "A51"]+[Variation "gambit de Budapest Fajarovicz, variante Steiner"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 4.Qc2 *++[ECO "A51"]+[Variation "gambit de gambit de Budapest refusé"]+[Result "*"]+1.d4 Nf6 2.c4 e5 *++[ECO "A51"]+[Variation "gambit de gambit de Budapest, variante Fajarovicz"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ne4 *++[ECO "A52"]+[Variation "gambit de Budapest"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 *++[ECO "A52"]+[Variation "gambit de Budapest, variante Adler"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Nf3 *++[ECO "A52"]+[Variation "gambit de Budapest, variante Alekhine"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 *++[ECO "A52"]+[Variation "gambit de Budapest, variante Alekhine, gambit Balogh"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 d6 *++[ECO "A52"]+[Variation "gambit de Budapest, variante Alekhine, sous-variante Abonyi"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.e4 Nxe5 5.f4 Nec6 *++[ECO "A52"]+[Variation "gambit de Budapest, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e5 3.dxe5 Ng4 4.Bf4 *++[ECO "A53"]+[Variation "défense vieille indienne (avec Fg4)"]+[Result "*"]+1.d4 Nf6 2.Nf3 d6 3.c4 Bg4 4.Nc3 *++[ECO "A53"]+[Variation "défense vieille indienne"]+[Result "*"]+1.d4 Nf6 2.c4 d6 *++[ECO "A53"]+[Variation "défense vieille indienne, variante Janovski"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 Bf5 *++[ECO "A53/13"]+[Variation "défense vieille indienne, variante Steiner - Wade (cf. A54)"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.d5 Be7 5.e4 O-O 6.Bd3 Ne8 *++[ECO "A54"]+[Variation "défense vieille indienne, variante Dus - Khotimirsky"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.e3 Nbd7 5.Bd3 *++[ECO "A54"]+[Variation "défense vieille indienne, variante ukrainienne (4.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 *++[ECO "A54"]+[Variation "défense vieille indienne, variante ukrainienne"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 *++[ECO "A55"]+[Variation "défense vieille indienne, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 d6 3.Nc3 e5 4.Nf3 Nbd7 5.e4 *++[ECO "A56"]+[Variation "défense Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 c5 *++[ECO "A56"]+[Variation "défense Benoni, système Hromodka"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 d6 *++[ECO "A56"]+[Variation "défense Benoni, variante tchèque"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 *++[ECO "A56"]+[Variation "défense Benoni, variante tchèque, système est-indien"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e5 4.Nc3 d6 5.e4 g6 *++[ECO "A56"]+[Variation "défense du vautour"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 Ne4 *++[ECO "A57"]+[Variation "gambit Benkö (= de la Volga)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 *++[ECO "A57"]+[Variation "gambit Benkö à moitié accepté"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 *++[ECO "A57"]+[Variation "gambit Benkö, attaque Nescafé frappé"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 axb5 6.e4 b4 7.Nb5 d6 8.Bc4 *++[ECO "A57"]+[Variation "gambit Benkö, système Zaitsev"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.Nc3 *++[ECO "A57/06"]+[Variation "gambit Benkö (4.Nf3)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.Nf3 Bb7 *++[ECO "A58"]+[Variation "gambit Benkö (avec Cd2)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.Nd2 *++[ECO "A58"]+[Variation "gambit Benkö accepté"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 *++[ECO "A58"]+[Variation "gambit Benkö, variante du fianchetto roi"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.Nf3 g6 8.g3 *++[ECO "A59"]+[Variation "gambit Benkö (7.e4)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 *++[ECO "A59"]+[Variation "gambit Benkö (avec Ce2)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.Nge2 *++[ECO "A59"]+[Variation "gambit Benkö, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6 5.bxa6 Bxa6 6.Nc3 d6 7.e4 Bxf1 8.Kxf1 g6 9.g3 Bg7 10.Kg2 O-O 11.Nf3 *++[ECO "A60"]+[Variation "défense Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 *++[ECO "A61"]+[Variation "défense Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 *++[ECO "A61"]+[Variation "défense Benoni, variante du fianchetto roi"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 *++[ECO "A61"]+[Variation "défense Benoni, variante Nimzovitch (tour du Cavalier)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Nd2 *++[ECO "A61"]+[Variation "défense Benoni, variante Uhlmann"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.Bg5 *++[ECO "A62"]+[Variation "défense Benoni, variante du fianchetto roi"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O *++[ECO "A63"]+[Variation "défense Benoni, variante du fianchetto roi (9...Cbd7)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 *++[ECO "A64"]+[Variation "défense Benoni, variante du fianchetto roi (11...Te8)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.Nf3 g6 7.g3 Bg7 8.Bg2 O-O 9.O-O Nbd7 10.Nd2 a6 11.a4 Re8 *++[ECO "A65"]+[Variation "défense Benoni (6.e4)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 *++[ECO "A65"]+[Variation "défense Benoni (7.Ff4, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bf4 *++[ECO "A65"]+[Variation "défense Benoni, (avec g3, cf. A32)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.g3 Bg7 8.Bg2 O-O 9.Nge2 Nbd7 10.O-O a6 11.a4 *++[ECO "A65"]+[Variation "défense Benoni, formation Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f3 *++[ECO "A65/03"]+[Variation "défense Benoni (avec Fd3, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.h3 O-O 9.Nf3 a6 10.a4 Re8 11.O-O Nbd7 12.Re1 Qc7 13.Bf4 *++[ECO "A65/03"]+[Variation "défense Benoni (avec Fd3, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bg5 Bg7 8.Bd3 O-O 9.h3 *++[ECO "A65/03"]+[Variation "défense Benoni (avec Fd3, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.h3 Bg7 8.Bd3 O-O 9.Nf3 a6 10.a4 Re8 11.O-O Nbd7 12.Bf4 Qc7 13.Re1 Nh5 14.Bh2 Ne5 15.Be2 *++[ECO "A65/04"]+[Variation "défense Benoni, variante Kramer - Sämisch (cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nge2 Bg7 8.Ng3 O-O 9.Be2 a6 10.a4 *++[ECO "A65/06"]+[Variation "défense Benoni, variante moderne (cf. E70)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.d5 e6 8.Qd2 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 a6 10.a4 h6 11.Be3 Re8 12.Nge2 h5 13.Nc1 Nbd7 14.Nd3 Ne5 15.Nf2 Nh7 16.Be2 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 Bd7 10.Bd3 Na6 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 h6 10.Be3 a6 11.a4 Re8 12.Nge2 h5 13.Nc1 Nbd7 14.Nd3 Ne5 15.Nf2 Nh7 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 Na6 10.Nge2 Rb8 11.Ng3 Bd7 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 Nbd7 10.Nh3 a6 11.a4 Qa5 *++[ECO "A65/07"]+[Variation "défense Benoni, formation Sämisch ( cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.cxd5 Re8 10.Nge2 a6 11.a4 Nbd7 12.Nd1 Ne5 13.Nec3 Qa5 14.Ra3 *++[ECO "A65/07"]+[Variation "défense Benoni, variante moderne (cf. E81)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 Bg7 5.e4 d6 6.f3 O-O 7.Bg5 e6 *++[ECO "A65/17"]+[Variation "défense Benoni (avec Fd3, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 a6 8.a4 Bg7 9.Nge2 O-O 10.O-O Qc7 11.h3 Nbd7 12.f4 Re8 13.Ng3 c4 14.Bc2 Rb8 *++[ECO "A65/17"]+[Variation "défense Benoni (avec Fd3, cf. A66)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Bd3 Bg7 8.Nge2 O-O 9.O-O a6 10.a4 Re8 11.h3 Nbd7 12.Ng3 Qc7 13.f4 c4 14.Bc2 *++[ECO "A66"]+[Variation "défense Benoni, variante marée de pions"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 *++[ECO "A66"]+[Variation "défense Benoni, variante Mikenas"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.e5 *++[ECO "A67"]+[Variation "défense Benoni, variante Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Bb5+ Nfd7 9.a4 *++[ECO "A68"]+[Variation "défense Benoni, attaque des quatre pions (cf. A69)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 *++[ECO "A68/03"]+[Variation "défense Benoni, attaque des quatre pions"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 d6 5.e4 Bg7 6.f4 O-O 7.Nf3 e6 8.Bd3 exd5 9.cxd5 *++[ECO "A69"]+[Variation "défense Benoni, attaque des quatre pions, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.f4 Bg7 8.Nf3 O-O 9.Be2 Re8 *++[ECO "A70"]+[Variation "défense Benoni, variante classique (avec e4, Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 *++[ECO "A70"]+[Variation "défense Benoni, variante classique (sans 9.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 *++[ECO "A71"]+[Variation "défense Benoni, variante classique (8.Fg5)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Bg5 *++[ECO "A72"]+[Variation "défense Benoni, variante classique (sans 9.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O *++[ECO "A73"]+[Variation "défense Benoni, variante classique (9.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O *++[ECO "A74"]+[Variation "défense Benoni, variante classique (9...a6 10.a4)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 *++[ECO "A75"]+[Variation "défense Benoni, variante classique (avec ...a6, ...Fg4)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O a6 10.a4 Bg4 *++[ECO "A76"]+[Variation "défense Benoni, variante classique (9...Te8)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 *++[ECO "A77"]+[Variation "défense Benoni, variante classique (9...Te8 10.Cd2)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 *++[ECO "A78"]+[Variation "défense Benoni, variante classique (avec ...Te8, ...Ca6)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 *++[ECO "A79"]+[Variation "défense Benoni, variante classique (11.f3)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.Be2 O-O 9.O-O Re8 10.Nd2 Na6 11.f3 *++[ECO "A80"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 *++[ECO "A80"]+[Variation "défense hollandaise, attaque Kortchnoï"]+[Result "*"]+1.d4 f5 2.h3 *++[ECO "A80"]+[Variation "défense hollandaise, gambit Krejcik"]+[Result "*"]+1.d4 f5 2.g4 *++[ECO "A80"]+[Variation "défense hollandaise, gambit Spielmann"]+[Result "*"]+1.d4 f5 2.Nc3 Nf6 3.g4 *++[ECO "A80"]+[Variation "défense hollandaise, gambit von Pretzel"]+[Result "*"]+1.d4 f5 2.Qd3 e6 3.g4 *++[ECO "A80"]+[Variation "défense hollandaise, variante 2.Fg5"]+[Result "*"]+1.d4 f5 2.Bg5 *++[ECO "A80"]+[Variation "défense hollandaise, variante de Manhattan (= Alapine - Ulvestad)"]+[Result "*"]+1.d4 f5 2.Qd3 *++[ECO "A81"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.g3 *++[ECO "A81"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 g6 *++[ECO "A81"]+[Variation "défense hollandaise, système de Leningrad, variante Basman"]+[Result "*"]+1.d4 f5 2.g3 g6 3.Bg2 Bg7 4.Nf3 c6 5.O-O Nh6 *++[ECO "A81"]+[Variation "défense hollandaise, système de Leningrad, variante de Karlsbad"]+[Result "*"]+1.d4 f5 2.g3 g6 3.Bg2 Bg7 4.Nh3 *++[ECO "A81"]+[Variation "défense hollandaise, variante Blackburne"]+[Result "*"]+1.d4 f5 2.g3 Nf6 3.Bg2 e6 4.Nh3 *++[ECO "A82"]+[Variation "défense hollandaise, gambit Staunton"]+[Result "*"]+1.d4 f5 2.e4 *++[ECO "A82"]+[Variation "défense hollandaise, gambit Staunton"]+[Result "*"]+1.d4 f5 2.e4 fxe4 *++[ECO "A82"]+[Variation "défense hollandaise, gambit Staunton, variante Tartakover"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.g4 *++[ECO "A82"]+[Variation "défense hollandaise, variante Balogh"]+[Result "*"]+1.d4 f5 2.e4 d6 *++[ECO "A83"]+[Variation "défense hollandaise, gambit Staunton, ligne de Staunton"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 *++[ECO "A83"]+[Variation "défense hollandaise, gambit Staunton, variante Alekhine"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 g6 5.h4 *++[ECO "A83"]+[Variation "défense hollandaise, gambit Staunton, variante Lasker"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 g6 5.f3 *++[ECO "A83"]+[Variation "défense hollandaise, gambit Staunton, variante Nimzovitch"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 b6 *++[ECO "A83"]+[Variation "défense hollandaise, gambit Staunton, variante Tchigorine"]+[Result "*"]+1.d4 f5 2.e4 fxe4 3.Nc3 Nf6 4.Bg5 c6 *++[ECO "A84"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 *++[ECO "A84"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 Nf6 *++[ECO "A84"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 e6 *++[ECO "A84"]+[Variation "défense hollandaise, gambit Staunton différé"]+[Result "*"]+1.d4 f5 2.c4 e6 3.e4 *++[ECO "A84"]+[Variation "défense hollandaise, variante Bladel"]+[Result "*"]+1.d4 f5 2.c4 g6 3.Nc3 Nh6 *++[ECO "A84"]+[Variation "défense hollandaise, variante Rubinstein"]+[Result "*"]+1.d4 f5 2.c4 e6 3.Nc3 *++[ECO "A85"]+[Variation "défense hollandaise (avec c4 & Cc3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.Nc3 *++[ECO "A86"]+[Variation "défense hollandaise (avec c4 & g3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 *++[ECO "A86"]+[Variation "défense hollandaise, système Hort - Antoshin"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 d6 4.Bg2 c6 5.Nc3 Qc7 *++[ECO "A86"]+[Variation "défense hollandaise, variante de Leningrad"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 *++[ECO "A87"]+[Variation "défense hollandaise, variante de Leningrad, sous-variante principale"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 *++[ECO "A87/09"]+[Variation "défense hollandaise, variante de Leningrad, sous-variante principale (7...De8, cf. A88)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 *++[ECO "A88"]+[Variation "défense hollandaise, variante de Leningrad, sous-variante principale (avec c6)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 c6 *++[ECO "A89"]+[Variation "défense hollandaise, variante de Leningrad, sous-variante principale (avec Cc6)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 g6 4.Bg2 Bg7 5.Nf3 O-O 6.O-O d6 7.Nc3 Nc6 *++[ECO "A90"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 *++[ECO "A90"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 e6 3.g3 Nf6 4.Bg2 *++[ECO "A90"]+[Variation "défense hollandaise, variante Nimzo-indienne"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ *++[ECO "A90"]+[Variation "défense hollandaise, variante Nimzo-indienne, sous-variante Alekhine"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Bb4+ 5.Bd2 Be7 *++[ECO "A91"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 *++[ECO "A92"]+[Variation "défense hollandaise"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O *++[ECO "A92"]+[Variation "défense hollandaise, variante Alekhine"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O Ne4 *++[ECO "A92"]+[Variation "défense hollandaise, variante Stonewall (avec Cc3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 *++[ECO "A92"]+[Variation "défense hollandaise, variante Stonewall"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 *++[ECO "A93"]+[Variation "défense hollandaise, variante Stonewall, sous-variante Botvinnik"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 *++[ECO "A94"]+[Variation "défense hollandaise, variante Stonewall (avec Fa3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.b3 c6 8.Ba3 Bxa3 9.Nxa3 Qe7 10.Qc1 *++[ECO "A95"]+[Variation "défense hollandaise, variante Stonewall (avec Cc3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 *++[ECO "A95"]+[Variation "défense hollandaise, variante Stonewall, sous-variante Chekhover"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d5 7.Nc3 c6 8.Qc2 Qe8 9.Bg5 *++[ECO "A96"]+[Variation "défense hollandaise, variante classique"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 *++[ECO "A97"]+[Variation "défense hollandaise, variante Ilyin-Genevsky"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 *++[ECO "A97"]+[Variation "défense hollandaise, variante Ilyin-Genevsky, sous-variante Winter"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Re1 *++[ECO "A98"]+[Variation "défense hollandaise, variante Ilyin-Genevsky (avec Dc2)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.Qc2 *++[ECO "A99"]+[Variation "défense hollandaise, variante Ilyin-Genevsky (avec b3)"]+[Result "*"]+1.d4 f5 2.c4 Nf6 3.g3 e6 4.Bg2 Be7 5.Nf3 O-O 6.O-O d6 7.Nc3 Qe8 8.b3 *++[ECO "B00"]+[Variation "attaque Grob inversée (= Borg, défense Basman, macho Grob)"]+[Result "*"]+1.e4 g5 *++[ECO "B00"]+[Variation "contre-attaque du Colorado"]+[Result "*"]+1.e4 Nc6 2.Nf3 f5 *++[ECO "B00"]+[Variation "début du pion roi"]+[Result "*"]+1.e4 *++[ECO "B00"]+[Variation "défense Barnes"]+[Result "*"]+1.e4 f6 *++[ECO "B00"]+[Variation "défense de l’hippopotame"]+[Result "*"]+1.e4 Nh6 2.d4 g6 3.c4 f6 *++[ECO "B00"]+[Variation "défense du Guatemala"]+[Result "*"]+1.e4 b6 2.d4 Ba6 *++[ECO "B00"]+[Variation "défense du lemming"]+[Result "*"]+1.e4 Na6 *++[ECO "B00"]+[Variation "défense du pied de maïs"]+[Result "*"]+1.e4 a5 *++[ECO "B00"]+[Variation "défense du renard"]+[Result "*"]+1.e4 f6 2.d4 Kf7 *++[ECO "B00"]+[Variation "défense Fred"]+[Result "*"]+1.e4 f5 *++[ECO "B00"]+[Variation "défense Karr"]+[Result "*"]+1.e4 h6 *++[ECO "B00"]+[Variation "défense néo-Mongoloïde"]+[Result "*"]+1.e4 Nc6 2.d4 f6 *++[ECO "B00"]+[Variation "défense Nimzovitch"]+[Result "*"]+1.e4 Nc6 *++[ECO "B00"]+[Variation "défense Nimzovitch"]+[Result "*"]+1.e4 Nc6 2.Nf3 *++[ECO "B00"]+[Variation "défense Nimzovitch"]+[Result "*"]+1.e4 Nc6 2.d4 *++[ECO "B00"]+[Variation "défense Nimzovitch, gambit Marshall"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.exd5 Qxd5 4.Nc3 *++[ECO "B00"]+[Variation "défense Nimzovitch, gambit Wheeler"]+[Result "*"]+1.e4 Nc6 2.b4 Nxb4 3.c3 Nc6 4.d4 *++[ECO "B00"]+[Variation "défense Nimzovitch, variante Bogolioubof"]+[Result "*"]+1.e4 Nc6 2.d4 d5 3.Nc3 *++[ECO "B00"]+[Variation "défense Owen"]+[Result "*"]+1.e4 b6 *++[ECO "B00"]+[Variation "défense St.-Georges (= Baker)"]+[Result "*"]+1.e4 a6 *++[ECO "B01"]+[Variation "défense scandinave"]+[Result "*"]+1.e4 d5 *++[ECO "B01"]+[Variation "défense scandinave"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 *++[ECO "B01"]+[Variation "défense scandinave"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 *++[ECO "B01"]+[Variation "défense scandinave"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bf5 *++[ECO "B01"]+[Variation "défense scandinave, contre-attaque (e4/d4)"]+[Result "*"]+1.e4 d5 2.d4 dxe4 3.Nc3 Nf6 4.f3 exf3 5.Nxf3 *++[ECO "B01"]+[Variation "défense scandinave, contre-attaque Anderssen"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 *++[ECO "B01"]+[Variation "défense scandinave, contre-attaque Anderssen, attaque orthodoxe"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.dxe5 Bb4 6.Bd2 Nc6 7.Nf3 *++[ECO "B01"]+[Variation "défense scandinave, contre-attaque Anderssen, système de Göteborg"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.Nf3 *++[ECO "B01"]+[Variation "défense scandinave, contre-attaque Anderssen, variante Collijn"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 e5 5.Nf3 Bg4 *++[ECO "B01"]+[Variation "défense scandinave, gambit islandais"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 c6 *++[ECO "B01"]+[Variation "défense scandinave, gambit islandais"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.c4 e6 *++[ECO "B01"]+[Variation "défense scandinave, gambit Mieses-Kotrvc"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.b4 *++[ECO "B01"]+[Variation "défense scandinave, variante de Kiel"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 4.c4 Nb4 *++[ECO "B01"]+[Variation "défense scandinave, variante Grünfeld"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bf5 6.Ne5 c6 7.g4 *++[ECO "B01"]+[Variation "défense scandinave, variante Lasker"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5 4.d4 Nf6 5.Nf3 Bg4 6.h3 *++[ECO "B01"]+[Variation "défense scandinave, variante Marshall"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 Nxd5 *++[ECO "B01"]+[Variation "défense scandinave, variante Pytel - Wade"]+[Result "*"]+1.e4 d5 2.exd5 Qxd5 3.Nc3 Qd6 *++[ECO "B01"]+[Variation "défense scandinave, variante Richter"]+[Result "*"]+1.e4 d5 2.exd5 Nf6 3.d4 g6 *++[ECO "B02"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 *++[ECO "B02"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 *++[ECO "B02"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 *++[ECO "B02"]+[Variation "défense Alekhine, attaque des deux pions (= Lasker)"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 *++[ECO "B02"]+[Variation "défense Alekhine, attaque des deux pions, variante Mikenas"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 Nd5 5.Bc4 e6 6.Nc3 d6 *++[ECO "B02"]+[Variation "défense Alekhine, attaque Sämisch"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Nc3 *++[ECO "B02"]+[Variation "défense Alekhine, variante de Brooklyn"]+[Result "*"]+1.e4 Nf6 2.e5 Ng8 *++[ECO "B02"]+[Variation "défense Alekhine, variante Kmoch"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.Bc4 Nb6 4.Bb3 c5 5.d3 *++[ECO "B02"]+[Variation "défense Alekhine, variante Krejcik"]+[Result "*"]+1.e4 Nf6 2.Bc4 *++[ECO "B02"]+[Variation "défense Alekhine, variante Maroczy"]+[Result "*"]+1.e4 Nf6 2.d3 *++[ECO "B02"]+[Variation "défense Alekhine, variante Mokele Mbembe (= Buecker)"]+[Result "*"]+1.e4 Nf6 2.e5 Ne4 *++[ECO "B02"]+[Variation "défense Alekhine, variante Scandinave"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 *++[ECO "B02"]+[Variation "défense Alekhine, variante Spielmann"]+[Result "*"]+1.e4 Nf6 2.Nc3 d5 3.e5 Nfd7 4.e6 *++[ECO "B02"]+[Variation "défense Alekhine, variante Steiner"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.b3 *++[ECO "B02"]+[Variation "défense Alekhine, variante Welling"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.b3 *++[ECO "B03"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 *++[ECO "B03"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 *++[ECO "B03"]+[Variation "défense Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions (6...Cc6)"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions (7.Fe3)"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 7.Be3 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante du fianchetto"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 g6 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante Ilyin-Genevsky"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 7.Nf3 Bg4 8.e6 fxe6 9.c5 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante Kortchnoï"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Bf5 7.Nc3 e6 8.Nf3 Be7 9.Be2 O-O 10.O-O f6 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante Planinc"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 g5 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante Tartakover"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 dxe5 6.fxe5 Nc6 7.Be3 Bf5 8.Nc3 e6 9.Nf3 Qd7 10.Be2 O-O-O 11.O-O Be7 *++[ECO "B03"]+[Variation "défense Alekhine, attaque des quatre pions, variante Trifunovic"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.f4 Bf5 *++[ECO "B03"]+[Variation "défense Alekhine, gambit O'Sullivan"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 b5 *++[ECO "B03"]+[Variation "défense Alekhine, variante Balogh"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Bc4 *++[ECO "B03"]+[Variation "défense Alekhine, variante d’échange"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 *++[ECO "B03"]+[Variation "défense Alekhine, variante d’échange, sous-variante Karpov"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.c4 Nb6 5.exd6 cxd6 6.Nf3 g6 7.Be2 Bg7 8.O-O O-O 9.h3 Nc6 10.Nc3 Bf5 11.Bf4 *++[ECO "B04"]+[Variation "défense Alekhine, variante moderne"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 *++[ECO "B04"]+[Variation "défense Alekhine, variante moderne, sous-variante du fianchetto"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 *++[ECO "B04"]+[Variation "défense Alekhine, variante moderne, sous-variante Kérès"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 g6 5.Bc4 Nb6 6.Bb3 Bg7 7.a4 *++[ECO "B04"]+[Variation "défense Alekhine, variante moderne, sous-variante Larsen"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 dxe5 *++[ECO "B04"]+[Variation "défense Alekhine, variante moderne, sous-variante Schmid"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Nb6 *++[ECO "B05"]+[Variation "défense Alekhine, variante moderne (4...Fg4)"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 *++[ECO "B05"]+[Variation "défense Alekhine, variante moderne, attaque Vitolins"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 Nb6 6.d5 *++[ECO "B05"]+[Variation "défense Alekhine, variante moderne, sous-variante Alekhine"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.c4 *++[ECO "B05"]+[Variation "défense Alekhine, variante moderne, sous-variante Flohr"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.Be2 c6 *++[ECO "B05"]+[Variation "défense Alekhine, variante moderne, sous-variante Panov"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3 Bg4 5.h3 *++[ECO "B06"]+[Variation "défense norvégienne"]+[Result "*"]+1.e4 g6 2.d4 Nf6 3.e5 Nh5 4.g4 Ng7 *++[ECO "B06"]+[Variation "défense Pirc (4.Fe3 Cf6)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 Nf6 *++[ECO "B06"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.f4 *++[ECO "B06"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.Bc4 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (4.Fe3 b6)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 b6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (4.Fe3 Cd7)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 Nd7 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (4.Fe3 Ch6)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 Nh6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (4.Fe3 e5)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 e5 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (avec Fg5)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Bg5 d6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne) (cf. B07, A41)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.Bd3 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne), attaque des trois pions"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.f4 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne), variante des deux cavaliers"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nf3 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne), variante des deux cavaliers, sous-variante Suttles"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nf3 c6 *++[ECO "B06"]+[Variation "défense Robatsch (= moderne), variante Gourgenidze"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 c6 4.f4 d5 5.e5 h5 *++[ECO "B06/01"]+[Variation "défense Robatsch (= moderne), variante originelle (cf. B07)"]+[Result "*"]+1.e4 g6 2.d4 d6 3.Nc3 a6 *++[ECO "B06/02"]+[Variation "défense Robatsch (= moderne), attaque des trois pions (cf. B07)"]+[Result "*"]+1.e4 g6 2.d4 d6 3.f4 Bg7 *++[ECO "B06/09"]+[Variation "défense Robatsch (= moderne) (4.Fe3 a6)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 a6 5.Qd2 b5 *++[ECO "B06/09"]+[Variation "défense Robatsch (= moderne), variante Gourgenidze (avec Fc4)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 c6 4.Bc4 d6 5.Qf3 e6 6.Nge2 Nd7 7.Bb3 Ngf6 8.O-O *++[ECO "B06/14"]+[Variation "défense Robatsch (= moderne) (4.c4, cf. A41)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.c4 Bg4 5.Be2 Nc6 *++[ECO "B06/14"]+[Variation "défense Robatsch (= moderne) (4.Fe2, cf. B07)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.Be2 *++[ECO "B06/14"]+[Variation "défense Robatsch (= moderne) (cf. B07)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.c3 Nf6 5.Qc2 *++[ECO "B06/14"]+[Variation "défense Robatsch (= moderne), système Geller (cf. B07)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.c3 Nc6 *++[ECO "B06/16"]+[Variation "défense Robatsch (= moderne) (4.Fe3 c6)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 c6 5.Qd2 b5 6.f3 Nd7 7.h4 h5 8.Nh3 *++[ECO "B06/17"]+[Variation "défense Robatsch (= moderne) (4.Fc4)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.Bc4 *++[ECO "B06/19"]+[Variation "défense Robatsch (= moderne), attaque pseudo-autrichienne (4.f4)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 c6 5.Nf3 Bg4 6.Be3 Qb6 *++[ECO "B07"]+[Variation "défense Pirc (3.Nc3 c6)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.f4 Qa5 5.Bd3 e5 6.Nf3 Nbd7 *++[ECO "B07"]+[Variation "défense Pirc (3.Fd3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Bd3 g6 4.Nf3 Bg7 5.c3 O-O 6.O-O Nc6 7.Re1 *++[ECO "B07"]+[Variation "défense Pirc (cf. B06)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nf3 d6 4.c3 Nf6 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.Nbd2 Bg7 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.a4 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.f4 g6 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.Bd3 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.g3 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 *++[ECO "B07"]+[Variation "défense Pirc"]+[Result "*"]+1.e4 g6 2.d4 d6 3.Nc3 Bg7 4.Nge2 Nf6 5.g3 O-O 6.Bg2 Nc6 7.h3 e5 8.Be3 a6 *++[ECO "B07"]+[Variation "défense Pirc 150 attaque (4...Fg7)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 Bg7 5.Qd2 Ng4 *++[ECO "B07"]+[Variation "défense Pirc, attaque à la bayonette (= Mariotti)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 Bg7 5.h4 *++[ECO "B07"]+[Variation "défense Pirc, système Holmov"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bc4 *++[ECO "B07"]+[Variation "défense Pirc, système Sveshnikov"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.g3 *++[ECO "B07"]+[Variation "défense Pirc, variante Byrne"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Bg5 *++[ECO "B07"]+[Variation "défense Pirc, variante chinoise"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be2 Bg7 5.g4 *++[ECO "B07"]+[Variation "défense Pirc, variante du pas"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.f3 e5 4.d5 Be7 *++[ECO "B07"]+[Variation "défense Pirc, variante est-indienne"]+[Result "*"]+1.d4 Nf6 2.g3 g6 3.Bg2 Bg7 4.e4 d6 5.Nc3 O-O *++[ECO "B07"]+[Variation "défense Pirc, variante Ufimtsev - Pytel (= Pribyl)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 c6 4.Nf3 Bg4 5.Be2 e6 *++[ECO "B07"]+[Variation "défense Robatsch (cf. B06)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Be3 *++[ECO "B07/19"]+[Variation "défense Pirc (5.Dd2)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Be3 c6 5.Qd2 Bg7 6.f3 Nbd7 7.h4 *++[ECO "B08"]+[Variation "défense Pirc, système classical (= deux cavaliers) (5.Fe2)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 *++[ECO "B08"]+[Variation "défense Pirc, système classical (= deux cavaliers) (5.h3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.h3 *++[ECO "B08"]+[Variation "défense Pirc, système classical (= deux cavaliers)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 *++[ECO "B08"]+[Variation "défense Pirc, système classical (= deux cavaliers)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne (6.e5)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.e5 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne (6.Fd3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Bd3 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne (6.Fe3)"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O 6.Be3 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 O-O *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne, formation dragon"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3 c5 *++[ECO "B09"]+[Variation "défense Pirc, attaque autrichienne, variante Ljubojevic"]+[Result "*"]+1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Bc4 *++[ECO "B10"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 *++[ECO "B10"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 2.Nc3 *++[ECO "B10"]+[Variation "défense Caro-Kann, attaque Hillbilly"]+[Result "*"]+1.e4 c6 2.Bc4 *++[ECO "B10"]+[Variation "défense Caro-Kann, attaque Panov"]+[Result "*"]+1.e4 c6 2.c4 *++[ECO "B10"]+[Variation "défense Caro-Kann, attaque Panov"]+[Result "*"]+1.e4 c6 2.c4 d5 *++[ECO "B10"]+[Variation "défense Caro-Kann, attaque Panov, variante Gligoric"]+[Result "*"]+1.e4 c6 2.c4 d5 3.exd5 cxd5 4.cxd5 Nf6 5.Bb5+ Nbd7 6.Nc3 a6 7.Qa4 g6 8.Nf3 Bg7 9.O-O O-O 10.Bxd7 *++[ECO "B10"]+[Variation "défense Caro-Kann, variante des deux cavaliers"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 *++[ECO "B10"]+[Variation "défense Caro-Kann, variante fermée (= Breyer)"]+[Result "*"]+1.e4 c6 2.d3 *++[ECO "B10"]+[Variation "défense Caro-Kann, variante Goldman (= Spielmann)"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Qf3 *++[ECO "B11"]+[Variation "défense Caro-Kann, variante des deux cavaliers (3...Fg4)"]+[Result "*"]+1.e4 c6 2.Nc3 d5 3.Nf3 Bg4 *++[ECO "B12"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 2.d4 *++[ECO "B12"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 2.d4 d5 *++[ECO "B12"]+[Variation "défense Caro-Kann, (3.Cd2)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 *++[ECO "B12"]+[Variation "défense Caro-Kann, variante d’avance"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 *++[ECO "B12"]+[Variation "défense Caro-Kann, variante d’Edinbourg"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 Qb6 *++[ECO "B12"]+[Variation "défense Caro-Kann, variante Tartakover"]+[Result "*"]+1.e4 c6 2.d4 d5 3.f3 *++[ECO "B12"]+[Variation "défense Caro-Masi"]+[Result "*"]+1.e4 c6 2.d4 Nf6 *++[ECO "B12"]+[Variation "défense de Bruycker"]+[Result "*"]+1.e4 c6 2.d4 Na6 3.Nc3 Nc7 *++[ECO "B12/02"]+[Variation "défense Caro-Kann (3.e5 c5)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 c5 4.dxc5 Nc6 5.Bb5 e6 6.Be3 Nge7 7.c3 Bd7 8.Bxc6 Nxc6 9.f4 g5 10.fxg5 Nxe5 11.Nf3 Nxf3+ *++[ECO "B12/16"]+[Variation "défense Caro-Kann, variante d’avance, ligne principale"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 Nd7 6.O-O Ne7 7.Nh4 Bg6 8.Nd2 c5 9.c3 Nc6 10.Nxg6 hxg6 11.Nf3 Be7 12.Be3 cxd4 13.cxd4 Qb6 14.Rb1 Rc8 *++[ECO "B12/19"]+[Variation "défense Caro-Kann, variante d’avance, sous-variante Karpov (= Seirawan)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.e5 Bf5 4.Nf3 e6 5.Be2 c5 6.O-O Nc6 7.c3 cxd4 8.cxd4 Nge7 9.a3 Be4 *++[ECO "B12/23"]+[Variation "défense Caro-Kann, système Gourgenidze (cf. B06)"]+[Result "*"]+1.e4 g6 2.d4 c6 3.Nf3 d5 4.Nbd2 Bg7 5.c3 Nh6 6.Bd3 O-O 7.O-O f6 8.Re1 Nf7 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik), variante Czerniak"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 Qa5 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik), variante Gunderam"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.c5 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik), variante Herzog"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 dxc4 7.d5 Na5 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik), variante normale"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 e6 *++[ECO "B13"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik), variante Reifir (= Spielmann)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 Nc6 6.Bg5 Qb6 *++[ECO "B13"]+[Variation "défense Caro-Kann, variante d’échange"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 *++[ECO "B13"]+[Variation "défense Caro-Kann, variante d’échange, sous-variante Rubinstein"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.Bd3 Nc6 5.c3 Nf6 6.Bf4 *++[ECO "B14"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (5...e6)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 *++[ECO "B14"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (5...g6)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 g6 *++[ECO "B14/11"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (6.Cf3 Fe7, cf. D42)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.c5 O-O 8.Bd3 b6 9.b4 a5 10.Na4 Nbd7 *++[ECO "B14/11"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (6.Cf3 Be7, cf. D42)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Be7 7.cxd5 exd5 8.Bb5+ Nc6 9.Ne5 Bd7 10.O-O O-O *++[ECO "B14/12"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (7.Fd3, cf. D42)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.Bd3 dxc4 8.Bxc4 Qc7 *++[ECO "B14/17"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (6.Cf3 Fb4)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 Nxd5 *++[ECO "B14/18"]+[Variation "défense Caro-Kann, attaque Panov (= Botvinnik) (6.Cf3 Fb4)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.cxd5 exd5 *++[ECO "B15"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 *++[ECO "B15"]+[Variation "défense Caro-Kann"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 *++[ECO "B15"]+[Variation "défense Caro-Kann, contre-attaque Gourgenidze"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 b5 *++[ECO "B15"]+[Variation "défense Caro-Kann, gambit Alekhine"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Bd3 *++[ECO "B15"]+[Variation "défense Caro-Kann, gambit Rasa-Studier"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.f3 *++[ECO "B15"]+[Variation "défense Caro-Kann, variante Forgacs"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ exf6 6.Bc4 *++[ECO "B15"]+[Variation "défense Caro-Kann, variante Tartakover (= Nimzovitch)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ exf6 *++[ECO "B15/02"]+[Variation "défense Caro-Kann, système Gourgenidze (3...g6)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.Nf3 Bg7 5.h3 Nh6 6.Bf4 f6 7.exd5 cxd5 8.Nb5 *++[ECO "B15/06"]+[Variation "défense Caro-Kann, système Gourgenidze (avec e5, f4)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 g6 4.e5 Bg7 5.f4 h5 6.Be3 Nh6 7.Nf3 Bg4 8.h3 Bxf3 9.Qxf3 h4 10.Bd3 e6 11.Bf2 Nd7 *++[ECO "B15/06"]+[Variation "défense Caro-Kann, système Gourgenidze (avec f4, e5)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 c6 4.f4 d5 5.e5 h5 6.Nf3 Bg4 7.h3 Bxf3 8.Qxf3 Qb6 *++[ECO "B15/07"]+[Variation "défense Caro-Kann, système Gourgenidze (avec f4, e5)"]+[Result "*"]+1.e4 g6 2.d4 Bg7 3.Nc3 c6 4.f4 d5 5.e5 Nh6 6.Nf3 Bg4 7.h3 *++[ECO "B16"]+[Variation "défense Caro-Kann, variante Bronstein-Larsen"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nf6 5.Nxf6+ gxf6 *++[ECO "B17"]+[Variation "défense Caro-Kann, variante Steinitz"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 e6 7.Qe2 Nb6 *++[ECO "B17/13"]+[Variation "défense Caro-Kann, variante Steinitz (8.Fd3)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nd2 dxe4 4.Nxe4 Nd7 5.Bc4 Ngf6 6.Ng5 e6 7.Qe2 Nb6 8.Bd3 *++[ECO "B18"]+[Variation "défense Caro-Kann, variante classique (6.h4)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 *++[ECO "B18"]+[Variation "défense Caro-Kann, variante classique"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 *++[ECO "B18"]+[Variation "défense Caro-Kann, variante classique, attaque Maroczy"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.f4 *++[ECO "B18"]+[Variation "défense Caro-Kann, variante classique, sous-variante Flohr"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.Nh3 *++[ECO "B19"]+[Variation "défense Caro-Kann, variante classique (7...Cd7)"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 *++[ECO "B19"]+[Variation "défense Caro-Kann, variante classique, sous-variante Spassky"]+[Result "*"]+1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bf5 5.Ng3 Bg6 6.h4 h6 7.Nf3 Nd7 8.h5 *++[ECO "B20"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 *++[ECO "B20"]+[Variation "défense sicilienne, attaque Burger"]+[Result "*"]+1.e4 c5 2.Bc4 *++[ECO "B20"]+[Variation "défense sicilienne, gambit de l’aile"]+[Result "*"]+1.e4 c5 2.b4 *++[ECO "B20"]+[Variation "défense sicilienne, gambit de l’aile, variante de Karlsbad"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 bxa3 *++[ECO "B20"]+[Variation "défense sicilienne, gambit de l’aile, variante de Marienbad"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 d5 4.exd5 Qxd5 5.Bb2 *++[ECO "B20"]+[Variation "défense sicilienne, gambit de l’aile, variante Marshall"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.a3 *++[ECO "B20"]+[Variation "défense sicilienne, gambit de l’aile, variante Santasiere"]+[Result "*"]+1.e4 c5 2.b4 cxb4 3.c4 *++[ECO "B20"]+[Variation "défense sicilienne, variante Gloria"]+[Result "*"]+1.e4 c5 2.c4 d6 3.Nc3 Nc6 4.g3 h5 *++[ECO "B20"]+[Variation "défense sicilienne, variante Kérès (2.Ce2)"]+[Result "*"]+1.e4 c5 2.Ne2 *++[ECO "B20"]+[Variation "défense sicilienne, variante Steinitz"]+[Result "*"]+1.e4 c5 2.g3 *++[ECO "B20/01"]+[Variation "défense sicilienne, attaque néo-est-indienne (A04/16, A05/8, B30/1)"]+[Result "*"]+1.e4 c5 2.d3 d6 3.Nf3 Nf6 4.g3 g6 5.Bg2 Bg7 6.O-O O-O 7.Nbd2 Nc6 8.c3 *++[ECO "B21"]+[Variation "défense sicilienne, attaque Grand Prix"]+[Result "*"]+1.e4 c5 2.f4 *++[ECO "B21"]+[Variation "défense sicilienne, gambit Smith-Morra"]+[Result "*"]+1.e4 c5 2.d4 *++[ECO "B21"]+[Variation "défense sicilienne, gambit Smith-Morra"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 *++[ECO "B21"]+[Variation "défense sicilienne, gambit Smith-Morra, variante Andreaschek"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.Nf3 e5 4.c3 *++[ECO "B21"]+[Variation "défense sicilienne, gambit Smith-Morra, variante de Chicago"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 dxc3 4.Nxc3 Nc6 5.Nf3 d6 6.Bc4 e6 7.O-O a6 8.Qe2 b5 9.Bb3 Ra7 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 Dxd5)"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 Dxd5)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.c3 d5 4.exd5 Qxd5 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 exd5)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.c3 d5 4.exd5 exd5 5.d4 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 c5 2.c3 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4 5.cxd4 e6 6.Nf3 d6 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.c3 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.c3 Nf6 4.e5 Nd5 5.d4 cxd4 6.cxd4 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee"]+[Result "*"]+1.e4 Nf6 2.e5 Nd5 3.c4 Nb6 4.c5 Nd5 5.d4 d6 6.cxd6 cxd6 7.Nf3 e6 *++[ECO "B22"]+[Variation "défense sicilienne, variante Alapinee, sous-variante Heidenfeld"]+[Result "*"]+1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.Nf3 Nc6 5.Na3 *++[ECO "B22/12"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 Dxd5)"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4 6.cxd4 Bg4 *++[ECO "B22/12"]+[Variation "défense sicilienne, variante Alapinee (...Dxd5 sans...Cf6)"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nc6 5.Nf3 cxd4 6.cxd4 e5 7.Nc3 Bb4 8.Bd2 Bxc3 9.Bxc3 e4 10.Ne5 Nxe5 11.dxe5 Ne7 12.Qa4+ Bd7 *++[ECO "B22/13"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 Dxd5)"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 cxd4 5.cxd4 Nc6 6.Nf3 Bg4 7.Be2 e6 8.O-O *++[ECO "B22/16"]+[Variation "défense sicilienne, variante Alapinee (...d5, exd5 Dxd5)"]+[Result "*"]+1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 cxd4 5.cxd4 Nc6 6.Nf3 e6 7.Nc3 *++[ECO "B22/19"]+[Variation "défense sicilienne, variante Alapinee (gambit Smith-Morra décliné)"]+[Result "*"]+1.e4 c5 2.d4 cxd4 3.c3 Nf6 4.e5 Nd5 *++[ECO "B23"]+[Variation "défense sicilienne, attaque Grand Prix"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 *++[ECO "B23"]+[Variation "défense sicilienne, attaque Grand Prix, variante Schofman"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bc4 e6 6.f5 *++[ECO "B23"]+[Variation "défense sicilienne, variante du caméléon"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Nge2 *++[ECO "B23"]+[Variation "défense sicilienne, variante fermée (2...Cc6)"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 *++[ECO "B23"]+[Variation "défense sicilienne, variante fermée"]+[Result "*"]+1.e4 c5 2.Nc3 *++[ECO "B23"]+[Variation "défense sicilienne, variante fermée, sous-variante Kortchnoï"]+[Result "*"]+1.e4 c5 2.Nc3 e6 3.g3 d5 *++[ECO "B24"]+[Variation "défense sicilienne, variante fermée"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 *++[ECO "B24"]+[Variation "défense sicilienne, variante fermée, variante Botvinnik moderne"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.Nge2 e6 6.O-O Nge7 7.d3 d6 *++[ECO "B24"]+[Variation "défense sicilienne, variante fermée, variante Smyslov"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 e6 6.Be3 Nd4 7.Nce2 *++[ECO "B25"]+[Variation "défense sicilienne, variante fermée (6.f4)"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 *++[ECO "B25"]+[Variation "défense sicilienne, variante fermée"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 *++[ECO "B25"]+[Variation "défense sicilienne, variante fermée, sous-variante Botvinnik (6.Ce2 e5)"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Nge2 e5 *++[ECO "B25"]+[Variation "défense sicilienne, variante fermée, sous-variante Botvinnik (6.f4 e5)"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.f4 e5 *++[ECO "B26"]+[Variation "défense sicilienne, variante fermée (6.Fe3)"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3 d6 6.Be3 *++[ECO "B27"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 *++[ECO "B27"]+[Variation "défense sicilienne, variante Acton"]+[Result "*"]+1.e4 c5 2.Nf3 g6 3.c4 Bh6 *++[ECO "B27"]+[Variation "défense sicilienne, variante hongroise"]+[Result "*"]+1.e4 c5 2.Nf3 g6 *++[ECO "B27"]+[Variation "défense sicilienne, variante Katalimov"]+[Result "*"]+1.e4 c5 2.Nf3 b6 *++[ECO "B27"]+[Variation "défense sicilienne, variante Quinteros"]+[Result "*"]+1.e4 c5 2.Nf3 Qc7 *++[ECO "B27"]+[Variation "défense sicilienne, variante Stiletto (= Althouse)"]+[Result "*"]+1.e4 c5 2.Nf3 Qa5 *++[ECO "B28"]+[Variation "défense sicilienne, variante O'Kelly"]+[Result "*"]+1.e4 c5 2.Nf3 a6 *++[ECO "B29"]+[Variation "défense sicilienne, variante Nimzovitch - Rubinstein"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 *++[ECO "B29"]+[Variation "défense sicilienne, variante Nimzovitch - Rubinstein, contre-gambit Rubinstein"]+[Result "*"]+1.e4 c5 2.Nf3 Nf6 3.e5 Nd5 4.Nc3 e6 5.Nxd5 exd5 6.d4 Nc6 *++[ECO "B30"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 *++[ECO "B30"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.c3 d5 4.exd5 *++[ECO "B30"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.g3 b6 4.Bg2 *++[ECO "B30"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.Nc3 Nc6 4.Bb5 Nd4 5.O-O a6 6.Bd3 Ne7 7.Nxd4 cxd4 8.Ne2 Nc6 *++[ECO "B30"]+[Variation "défense sicilienne, attaque les noirs gagnent"]+[Result "*"]+1.e4 c5 2.Nc3 Nc6 3.Nf3 e5 4.Bc4 d6 5.d3 Be7 6.Nd5 Nf6 7.c3 O-O 8.O-O Be6 9.Qe2 *++[ECO "B30"]+[Variation "défense sicilienne, attaque Nimzovitch - Rossolimo (sans ...d6)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 *++[ECO "B30"]+[Variation "défense sicilienne, attaque Nimzovitch - Rossolimo, variante Zagrebelny"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.O-O Nge7 5.Nc3 a6 6.Bxc6 Nxc6 7.d4 cxd4 8.Nxd4 Qc7 9.Nxc6 *++[ECO "B30/01"]+[Variation "défense sicilienne, attaque néo-Réti-indienne en premier (A04/16, A05/8, B20/1)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d3 g6 4.g3 Bg7 5.Bg2 d6 6.c3 Nf6 7.Nbd2 O-O 8.O-O *++[ECO "B31"]+[Variation "défense sicilienne, attaque Nimzovitch - Rossolimo (avec ...g6, sans ...d6)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 *++[ECO "B31"]+[Variation "défense sicilienne, attaque Nimzovitch - Rossolimo, variante Gourgenidze"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 g6 4.O-O Bg7 5.Re1 e5 6.b4 *++[ECO "B32"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 *++[ECO "B32"]+[Variation "défense sicilienne, variante Flohr (= Lady Godiva)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Qc7 *++[ECO "B32"]+[Variation "défense sicilienne, variante Labourdonnais - Loewenthal (= Kalishnikov)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 *++[ECO "B32"]+[Variation "défense sicilienne, variante Labourdonnais - Loewenthal"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 *++[ECO "B32"]+[Variation "défense sicilienne, variante Nimzovitch"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 d5 *++[ECO "B32/10"]+[Variation "défense sicilienne, variante Kalishnikov, système néo-Sveshnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.N1c3 a6 7.Na3 b5 8.Nd5 Nge7 9.c4 Nd4 10.cxb5 Nxd5 11.exd5 Bd7 12.Be3 *++[ECO "B32/13"]+[Variation "défense sicilienne, variante Kalishnikov, système néo-Sveshnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5 5.Nb5 d6 6.c4 Be7 7.N1c3 a6 8.Na3 h6 9.Be2 Be6 10.O-O Bg5 11.Nc2 Nf6 12.Qd3 *++[ECO "B33"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B33"]+[Variation "défense sicilienne, variante Pelikan (= Lasker - Sveshnikov)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 *++[ECO "B33"]+[Variation "défense sicilienne, variante Pelikan, sous-variante Bird"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 Be6 *++[ECO "B33"]+[Variation "défense sicilienne, variante Pelikan, sous-variante Chelyabinsk"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 *++[ECO "B33"]+[Variation "défense sicilienne, variante Sveshnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 *++[ECO "B33/09"]+[Variation "défense sicilienne, variante Sveshnikov (avec a4, cf. B32)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.a4 a6 8.Na3 Be6 9.Bg5 Rc8 10.Bc4 Be7 11.Bxf6 Bxf6 12.Nd5 Bg5 13.O-O O-O 14.c3 Kh8 15.Qe2 *++[ECO "B33/17"]+[Variation "défense sicilienne, variante Sveshnikov (5...e6, cf. B45, B33/42)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Ndb5 d6 7.Bf4 e5 8.Bg5 a6 9.Na3 *++[ECO "B33/17"]+[Variation "défense sicilienne, variante Sveshnikov, sous-variante Kramnik (12...e4)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 Bg7 11.g3 f5 12.exf5 e4 *++[ECO "B33/42"]+[Variation "défense sicilienne, variante Sveshnikov"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5 9.Bxf6 gxf6 10.Nd5 f5 11.Bd3 Be6 12.Qh5 Bg7 13.O-O f4 14.c4 bxc4 15.Bxc4 O-O 16.Rac1 Rb8 17.b3 Qd7 18.Rfd1 Kh8 19.Qh4 *++[ECO "B34"]+[Variation "défense sicilienne, système dragon accéléré, variante d’échange"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nxc6 *++[ECO "B34"]+[Variation "défense sicilienne, système dragon accéléré, variante moderne"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Nb3 *++[ECO "B35"]+[Variation "défense sicilienne, système dragon accéléré, variante moderne (avec Fc4)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.Nc3 Bg7 6.Be3 Nf6 7.Bc4 *++[ECO "B36"]+[Variation "défense sicilienne, système dragon accéléré, variante Gourgenidze"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Nf6 6.Nc3 Nxd4 7.Qxd4 d6 *++[ECO "B36"]+[Variation "défense sicilienne, système dragon accéléré, variante Maroczy"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 *++[ECO "B37"]+[Variation "défense sicilienne, système dragon accéléré, variante Maroczy (5...Fg7)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 *++[ECO "B37"]+[Variation "défense sicilienne, système dragon accéléré, variante Simaguine"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Nc2 d6 7.Be2 Nh6 *++[ECO "B38"]+[Variation "défense sicilienne, système dragon accéléré, variante Maroczy (6.Fe3)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 *++[ECO "B39"]+[Variation "défense sicilienne, système dragon accéléré, variante Breyer"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6 5.c4 Bg7 6.Be3 Nf6 7.Nc3 Ng4 *++[ECO "B40"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 e6 *++[ECO "B40"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 *++[ECO "B40"]+[Variation "défense sicilienne, système indien en premier (cf. A08)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 *++[ECO "B40"]+[Variation "défense sicilienne, système Réti, variante double fianchetto"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 4.g3 g6 *++[ECO "B40"]+[Variation "défense sicilienne, système Réti, variante fianchetto roi (...d5, Cbd2)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 4.g3 d5 5.Nbd2 *++[ECO "B40"]+[Variation "défense sicilienne, système Réti, variante fianchetto roi (...d5, De2)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 4.g3 d5 5.Qe2 *++[ECO "B40"]+[Variation "défense sicilienne, système Réti, variante fianchetto roi"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d3 Nc6 4.g3 d6 5.Bg2 *++[ECO "B40"]+[Variation "défense sicilienne, variante Anderssen"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 *++[ECO "B40"]+[Variation "défense sicilienne, variante de clouage"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 *++[ECO "B40"]+[Variation "défense sicilienne, variante de clouage, sous-variante Jaffe"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 6.Bd3 e5 *++[ECO "B40"]+[Variation "défense sicilienne, variante de clouage, sous-variante Koch"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Bb4 6.e5 *++[ECO "B40"]+[Variation "défense sicilienne, variante Marshall"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 d5 *++[ECO "B40/02"]+[Variation "défense sicilienne, variante Alapinee, système français (avec c3, e5, ...d4)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.c3 d5 4.e5 d4 5.Bd3 Nc6 6.O-O Nge7 *++[ECO "B40/03"]+[Variation "défense sicilienne, système Réti, variante fianchetto roi (avec ...e6, Cc3, ...a6)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.Nc3 a6 4.g3 b5 5.Bg2 Bb7 6.d3 d6 7.O-O *++[ECO "B41"]+[Variation "défense sicilienne, variante Kan"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 *++[ECO "B41"]+[Variation "défense sicilienne, variante Kan, système Maroczy (= Bronstein)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 Nf6 6.Nc3 Bb4 7.Bd3 Nc6 8.Bc2 *++[ECO "B41"]+[Variation "défense sicilienne, variante Kan, système Maroczy (= Réti)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.c4 *++[ECO "B42"]+[Variation "défense sicilienne, variante Kan (5.Fd3)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 *++[ECO "B42"]+[Variation "défense sicilienne, variante Kan, sous-variante du fromage suisse"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 g6 *++[ECO "B42"]+[Variation "défense sicilienne, variante Kan, sous-variante Gipslis"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Nf6 6.O-O d6 7.c4 g6 *++[ECO "B42"]+[Variation "défense sicilienne, variante Kan, sous-variante Polugaievsky"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3 Bc5 *++[ECO "B43"]+[Variation "défense sicilienne, variante Kan (5.Cc3)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Nc3 *++[ECO "B44"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 *++[ECO "B44"]+[Variation "défense sicilienne, variante Szen (= anti-Taimanov)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 *++[ECO "B44"]+[Variation "défense sicilienne, variante Szen, gambit Dely - Kasparov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 d5 *++[ECO "B44"]+[Variation "défense sicilienne, variante Szen, sous-variante du hérisson"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nb5 d6 6.c4 Nf6 7.N1c3 a6 8.Na3 Be7 9.Be2 O-O 10.O-O b6 *++[ECO "B45"]+[Variation "défense sicilienne, variante Taimanov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 *++[ECO "B45"]+[Variation "défense sicilienne, variante Taimanov, attaque américaine"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Nf6 6.Ndb5 Bb4 7.Nd6+ *++[ECO "B46"]+[Variation "défense sicilienne, variante Taimanov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 a6 *++[ECO "B47"]+[Variation "défense sicilienne, variante Taimanov, sous-variante Bastrikov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 *++[ECO "B47/12"]+[Variation "défense sicilienne, variante Taimanov, sous-variante Flohr (cf. B49)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Kh1 Nxd4 9.Qxd4 Bc5 10.Qd3 h5 11.f4 Ng4 12.e5 d6 *++[ECO "B48"]+[Variation "défense sicilienne, variante Taimanov (6...a6)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 *++[ECO "B49"]+[Variation "défense sicilienne, variante Taimanov"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be3 a6 7.Be2 *++[ECO "B49/10"]+[Variation "défense sicilienne, variante Taimanov, sous-variante Portisch"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7 6.Be2 a6 7.O-O Nf6 8.Be3 Bb4 9.Na4 O-O 10.Nxc6 bxc6 11.f4 Be7 12.Bd3 c5 13.c4 Bb7 14.Nc3 d6 *++[ECO "B50"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 *++[ECO "B50"]+[Variation "défense sicilienne, gambit de l’aile wing différé"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.b4 *++[ECO "B50"]+[Variation "défense sicilienne, système Kopec"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.c3 Nf6 4.Bd3 *++[ECO "B50"]+[Variation "défense sicilienne, variante fermée, fianchetto roi (avec d3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d3 Nc6 4.g3 g6 5.Bg2 Bg7 6.O-O e6 7.Nbd2 Nge7 8.Re1 O-O 9.a4 *++[ECO "B50/01"]+[Variation "défense sicilienne (3.d3, cf. A04)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d3 Nc6 4.g3 g6 5.Bg2 Bg7 6.O-O e6 7.Nbd2 Nge7 8.Re1 O-O 9.a4 *++[ECO "B50/01"]+[Variation "défense sicilienne (3.g3, cf. A04)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.g3 *++[ECO "B50/01"]+[Variation "défense sicilienne (3.g3, cf. B20)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.g3 Nf6 4.d3 g6 5.Bg2 Bg7 6.O-O *++[ECO "B50/07"]+[Variation "défense sicilienne, variante des quatre cavaliers, fianchetto roi"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.Nc3 d6 4.g3 Nc6 5.Bg2 Nf6 *++[ECO "B51"]+[Variation "défense sicilienne, attaque Canal – Sokolsky (= Nimzovitch - Rossolimo, de Moscou)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ *++[ECO "B51"]+[Variation "défense sicilienne, attaque Nimzovitch - Rossolimo (3...d6)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.Bb5 d6 4.Bxc6+ *++[ECO "B52"]+[Variation "défense sicilienne, attaque Canal - Sokolsky (3...Fd7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 *++[ECO "B52"]+[Variation "défense sicilienne, attaque Canal - Sokolsky, gambit Bronstein"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.O-O Nc6 6.c3 Nf6 7.d4 *++[ECO "B52"]+[Variation "défense sicilienne, attaque Canal - Sokolsky, variante Sokolsky"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.Bb5+ Bd7 4.Bxd7+ Qxd7 5.c4 *++[ECO "B53"]+[Variation "défense sicilienne, variante Chekhover"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 *++[ECO "B53"]+[Variation "défense sicilienne, variante Chekhover, sous-variante Zaitsev"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Qxd4 Nc6 5.Bb5 Qd7 *++[ECO "B54"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 *++[ECO "B54"]+[Variation "défense sicilienne, variante Prins (= de Moscou)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 *++[ECO "B54/02"]+[Variation "défense sicilienne, variante Taimanov (5...d6)"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 d6 6.g4 Nge7 7.Be3 a6 8.f4 *++[ECO "B55"]+[Variation "défense sicilienne, variante Prins, attaque de Venise"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.f3 e5 6.Bb5+ *++[ECO "B56"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 *++[ECO "B56"]+[Variation "défense sicilienne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 *++[ECO "B56"]+[Variation "défense sicilienne, attaque de Venise"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Bb5+ *++[ECO "B57"]+[Variation "défense sicilienne, piège de Magnus - Smith"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 g6 7.Nxc6 bxc6 8.e5 *++[ECO "B57"]+[Variation "défense sicilienne, variante Sozine (sauf transpositions Scheveningue)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 *++[ECO "B57"]+[Variation "défense sicilienne, variante Sozine, sous-variante Benkö"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 Qb6 *++[ECO "B58"]+[Variation "défense sicilienne, variante Boleslavsky"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6 6.Be2 e5 *++[ECO "B58"]+[Variation "défense sicilienne, variante Boleslavsky, sous-variante Louma"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6 6.Be2 e5 7.Nxc6 *++[ECO "B58"]+[Variation "défense sicilienne, variante classique"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6 6.Be2 *++[ECO "B59"]+[Variation "défense sicilienne, variante Boleslavsky (7.Cb3)"]+[Result "*"]+1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6 6.Be2 e5 7.Nb3 *++[ECO "B60"]+[Variation "défense sicilienne, variante Richter - Rauser"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 *++[ECO "B60"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Bondarevsky"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 g6 *++[ECO "B60"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Larsen"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 *++[ECO "B61"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Larsen (7.Dd2)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 *++[ECO "B62"]+[Variation "défense sicilienne, variante Richter – Rauser (6...e6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 *++[ECO "B62"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Richter"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nxc6 *++[ECO "B62"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Kérès"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd3 *++[ECO "B62"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Margate (= Alekhine)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Bb5 *++[ECO "B62"]+[Variation "défense sicilienne, variante Richter - Rauser, sous-variante Podvebrady"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Nb3 *++[ECO "B63"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (7.Dd2)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 *++[ECO "B63/11"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (= Fedorowicz) (cf. B60)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.Nb3 Qb6 10.f3 Rd8 11.Nb5 Rd7 *++[ECO "B64"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...Fe7, ...f4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 *++[ECO "B64"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser, sous-variante Geller"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 e5 *++[ECO "B65"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...Fe7, ...Cxd4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 10.Qxd4 *++[ECO "B65"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...Fe7, ...Cxd4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 Be7 8.O-O-O O-O 9.f4 Nxd4 *++[ECO "B66"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Be7 9.f4 Qc7 10.Be2 Bd7 11.Nb3 O-O-O 12.Bxf6 gxf6 13.Bh5 Be8 14.Kb1 Kb8 15.Qe2 Rg8 *++[ECO "B66"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Nxd4 *++[ECO "B66/07"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6, ...h6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O h6 9.Be3 Bd7 10.f4 Be7 11.Bd3 b5 12.Kb1 Qc7 13.h3 Na5 14.g4 b4 15.Nce2 Nc4 16.Bxc4 Qxc4 17.Ng3 a5 18.Rhf1 *++[ECO "B67"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6, ...Fd7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 *++[ECO "B68"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6, ...Fe7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 *++[ECO "B68"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (9.Fe2)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.Be2 Be7 10.f4 *++[ECO "B68/02"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (11.a3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.a3 b4 *++[ECO "B68/02"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (11.Fd3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bd3 b4 12.Ne2 Qc7 *++[ECO "B68/02"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (11.Rb1)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Kb1 b4 *++[ECO "B68/03"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (11.e5)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.e5 b4 12.exf6 bxc3 13.Qxc3 gxf6 14.Bh4 d5 15.Kb1 Na5 16.f5 Rc8 17.Qd2 Qc7 *++[ECO "B69"]+[Variation "défense sicilienne, variante Richter - Rauser, attaque Rauser (avec ...a6, 11.Fxf6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2 a6 8.O-O-O Bd7 9.f4 Be7 10.Nf3 b5 11.Bxf6 *++[ECO "B70"]+[Variation "défense sicilienne, variante du dragon"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 *++[ECO "B70"]+[Variation "défense sicilienne, variante du dragon"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Be2 g6 7.O-O Bg7 8.Nb3 O-O 9.Bg5 Be6 10.Kh1 *++[ECO "B71"]+[Variation "défense sicilienne, variante du dragon, sous-variante Levenfish"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 *++[ECO "B71"]+[Variation "défense sicilienne, variante du dragon, sous-variante Levenfish - Flohr"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.f4 Nbd7 *++[ECO "B72"]+[Variation "défense sicilienne, variante du dragon (6.Fe3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 *++[ECO "B72"]+[Variation "défense sicilienne, variante du dragon, système classique"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 *++[ECO "B72"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante d’Amsterdam"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Qd2 *++[ECO "B72"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Grigoriev"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Qd2 O-O 9.O-O-O *++[ECO "B72"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Nottingham"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.Nb3 *++[ECO "B73"]+[Variation "défense sicilienne, variante du dragon, système classique (8.O-O)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O *++[ECO "B73"]+[Variation "défense sicilienne, variante du dragon, système classique, gambit Zollner"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.f4 Qb6 10.e5 *++[ECO "B73"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Richter"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Qd2 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique (9.Cb3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique, attaque de Stockholm"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Nxa5 Bxe2 13.Qxe2 Qxa5 14.g4 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique, contre-attaque Bernard"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Bd3 Bxd3 13.cxd3 d5 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Alekhine"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 a5 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Réti - Tartakover"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Qc8 *++[ECO "B74"]+[Variation "défense sicilienne, variante du dragon, système classique, sous-variante Spielmann"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.Be2 Nc6 8.O-O O-O 9.Nb3 Be6 10.f4 Na5 11.f5 Bc4 12.Bd3 *++[ECO "B75"]+[Variation "défense sicilienne, variante du dragon, système yougoslave"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 *++[ECO "B76"]+[Variation "défense sicilienne, variante du dragon, système yougoslave (7...O-O)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O *++[ECO "B76"]+[Variation "défense sicilienne, variante du dragon, système yougoslave, sous-variante Rauser"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.O-O-O *++[ECO "B77"]+[Variation "défense sicilienne, variante du dragon, système yougoslave (9...Fd7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.h4 Nxd4 11.Bxd4 b5 12.Bb3 *++[ECO "B77"]+[Variation "défense sicilienne, variante du dragon, système yougoslave (9.Fc4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 *++[ECO "B77"]+[Variation "défense sicilienne, variante du dragon, système yougoslave, sous-variante Byrne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 a5 *++[ECO "B78"]+[Variation "défense sicilienne, variante du dragon, système yougoslave (10.O-O-O)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O *++[ECO "B79"]+[Variation "défense sicilienne, variante du dragon, système yougoslave (12.h4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O 8.Qd2 Nc6 9.Bc4 Bd7 10.O-O-O Qa5 11.Bb3 Rfc8 12.h4 *++[ECO "B80"]+[Variation "défense sicilienne, variante de Scheveningue"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 *++[ECO "B80"]+[Variation "défense sicilienne, variante de Scheveningue, sous-variante anglaise"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be3 a6 7.Qd2 *++[ECO "B80"]+[Variation "défense sicilienne, variante de Scheveningue, sous-variante fianchetto roi (6.g3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g3 a6 7.Bg2 Nc6 8.O-O Qc7 *++[ECO "B80"]+[Variation "défense sicilienne, variante de Scheveningue, sous-variante Vitolins"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bb5+ *++[ECO "B80/03"]+[Variation "défense sicilienne, variante de Scheveningue, sous-variante fianchetto roi"]+[Result "*"]+1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 d6 6.g3 a6 7.Bg2 Bd7 8.O-O Nf6 9.Re1 Be7 10.Nxc6 Bxc6 11.a4 O-O 12.a5 Nd7 13.Be3 Qc7 *++[ECO "B81"]+[Variation "défense sicilienne, variante de Scheveningue, attaque Kérès"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.g4 *++[ECO "B82"]+[Variation "défense sicilienne, variante de Scheveningue (6.f4 e6, cf. B93)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 e6 *++[ECO "B82"]+[Variation "défense sicilienne, variante de Scheveningue (6.f4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 *++[ECO "B82"]+[Variation "défense sicilienne, variante de Scheveningue, sous-variante Tal"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.f4 Nc6 7.Be3 Be7 8.Qf3 *++[ECO "B83"]+[Variation "défense sicilienne, variante de Scheveningue (6.Fe2)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 *++[ECO "B83"]+[Variation "défense sicilienne, variante de Scheveningue moderne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 *++[ECO "B83"]+[Variation "défense sicilienne, variante de Scheveningue moderne, ligne principale (avec Cb3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 Bd7 10.Nb3 *++[ECO "B83"]+[Variation "défense sicilienne, variante de Scheveningue moderne, ligne principale"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Nc6 7.O-O Be7 8.Be3 O-O 9.f4 *++[ECO "B83/04"]+[Variation "défense sicilienne, variante de Scheveningue moderne, ligne principale (cf. B85)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O Nc6 8.Be3 O-O 9.f4 Qc7 *++[ECO "B84"]+[Variation "défense sicilienne, variante de Scheveningue, système classique"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 *++[ECO "B84"]+[Variation "défense sicilienne, variante de Scheveningue, système classique"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 *++[ECO "B84"]+[Variation "défense sicilienne, variante de Scheveningue, système classique (avec …Cd7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nbd7 *++[ECO "B85"]+[Variation "défense sicilienne, variante de Scheveningue, système classique"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 e6 7.O-O Be7 8.f4 O-O 9.a4 Nc6 10.Be3 Qc7 11.Kh1 *++[ECO "B85"]+[Variation "défense sicilienne, variante de Scheveningue, système classique"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.f4 Nc6 9.Be3 *++[ECO "B85"]+[Variation "défense sicilienne, variante de Scheveningue, système classique, ligne principale"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.f4 Nc6 9.Be3 Be7 10.Qe1 O-O *++[ECO "B85"]+[Variation "défense sicilienne, variante de Scheveningue, système classique (avec ...Dc7 &...Cc6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Qc7 8.f4 Nc6 *++[ECO "B85/01"]+[Variation "défense sicilienne, variante de Scheveningue, ligne principale moderne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O a6 8.f4 Qc7 9.Be3 O-O 10.Qe1 b5 11.Bf3 Bb7 12.e5 Ne8 13.Qg3 Nd7 14.Rad1 dxe5 15.fxe5 Bc5 *++[ECO "B85/01"]+[Variation "défense sicilienne, variante de Scheveningue, système classique (avec Cdb5)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O Nc6 8.Be3 O-O 9.f4 Qc7 10.Ndb5 Qb8 11.Bf3 a6 12.Nd4 Qc7 13.Kh1 Bd7 *++[ECO "B85/04"]+[Variation "défense sicilienne, variante de Scheveningue, ligne principale moderne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 a6 7.O-O Nc6 8.Be3 Be7 9.f4 O-O 10.Qe1 Bd7 11.Qg3 b5 12.a3 Nxd4 13.Bxd4 Bc6 14.Kh1 Qc7 15.Rae1 Qb7 *++[ECO "B85/14"]+[Variation "défense sicilienne, variante de Scheveningue, ligne principale moderne (avec ...Db8)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O O-O 8.f4 Nc6 9.Be3 Bd7 10.Kh1 a6 11.Qe1 b5 12.a3 Qb8 13.Bf3 Nxd4 *++[ECO "B85/15"]+[Variation "défense sicilienne, variante de Scheveningue, ligne principale moderne (avec ...Fd7, De1)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O Nc6 8.Be3 O-O 9.f4 Qc7 10.Kh1 Bd7 11.Qe1 a6 12.Qg3 b5 *++[ECO "B85/19"]+[Variation "défense sicilienne, variante de Scheveningue, ligne principale moderne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O O-O 8.f4 Nc6 9.Be3 a6 10.Kh1 Qc7 11.Qe1 Nxd4 12.Bxd4 b5 13.a3 Bb7 14.Qg3 Bc6 15.Rae1 Qb7 16.Bd3 b4 *++[ECO "B85/23"]+[Variation "défense sicilienne, variante de Scheveningue, système classique, sous-variante Maroczy (avec ...b6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O Nc6 8.Be3 O-O 9.f4 Qc7 10.Nb3 a6 11.a4 b6 12.Bf3 Rb8 13.Qe2 *++[ECO "B85/30"]+[Variation "défense sicilienne, variante de Scheveningue, système classique, sous-variante Maroczy"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Be2 Be7 7.O-O Nc6 8.Be3 O-O 9.f4 Qc7 10.Bf3 a6 11.Kh1 Rb8 12.a4 Re8 *++[ECO "B86"]+[Variation "défense sicilienne, variante Sozine (6.Fc4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 *++[ECO "B87"]+[Variation "défense sicilienne, variante Sozine (avec ...a6 &...b5)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 a6 7.Bb3 b5 *++[ECO "B88"]+[Variation "défense sicilienne, variante Sozine, sous-variante Fischer"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Bb3 Be7 8.Be3 O-O 9.f4 *++[ECO "B88"]+[Variation "défense sicilienne, variante Sozine, sous-variante Leonhardt"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 *++[ECO "B89"]+[Variation "défense sicilienne, attaque Velimirovic"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 Be7 8.Qe2 *++[ECO "B89"]+[Variation "défense sicilienne, variante Sozine (7.Fe3)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e6 6.Bc4 Nc6 7.Be3 *++[ECO "B90"]+[Variation "défense sicilienne, variante Najdorf"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 *++[ECO "B90"]+[Variation "défense sicilienne, variante Najdorf, attaque Adams"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.h3 *++[ECO "B90"]+[Variation "défense sicilienne, variante Najdorf, attaque Byrne (= anglaise)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 *++[ECO "B90"]+[Variation "défense sicilienne, variante Najdorf, attaque Lipnitzky"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bc4 *++[ECO "B90/04"]+[Variation "défense sicilienne, variante Najdorf, attaque Byrne - Almasi"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3 e5 7.Nb3 Be6 8.Qd2 Nbd7 9.f3 Be7 10.g4 h6 11.h4 b5 12.O-O-O Nb6 13.Qf2 Rb8 14.Kb1 Nc4 *++[ECO "B91"]+[Variation "défense sicilienne, variante Najdorf, sous-variante de Zagreb (= fianchetto roi)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.g3 *++[ECO "B92"]+[Variation "défense sicilienne, variante Najdorf, sous-variante Opovcensky"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2 *++[ECO "B93"]+[Variation "défense sicilienne, variante Najdorf (6.f4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.f4 *++[ECO "B94"]+[Variation "défense sicilienne, variante Najdorf (6.Fg5)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 *++[ECO "B94"]+[Variation "défense sicilienne, variante Najdorf, sous-variante Ivkov"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 Qa5 8.Qd2 e6 9.O-O-O b5 10.Bb3 Bb7 11.Rhe1 Nc5 12.e5 *++[ECO "B95"]+[Variation "défense sicilienne, variante Najdorf (6...e6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 *++[ECO "B96"]+[Variation "défense sicilienne, variante Najdorf (7.f4)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 *++[ECO "B96"]+[Variation "défense sicilienne, variante Najdorf, sous-variante Polugayevsky"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 *++[ECO "B96"]+[Variation "défense sicilienne, variante Najdorf, sous-variante Polugayevsky, ligne Simaguine"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 b5 8.e5 dxe5 9.fxe5 Qc7 10.Qe2 *++[ECO "B97"]+[Variation "défense sicilienne, variante Najdorf (7...Db6)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 *++[ECO "B97"]+[Variation "défense sicilienne, variante Najdorf, gambit du pion empoisonné"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2 9.Rb1 Qa3 *++[ECO "B98"]+[Variation "défense sicilienne, variante Najdorf (7...Fe7)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 *++[ECO "B98"]+[Variation "défense sicilienne, variante Najdorf"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 *++[ECO "B98"]+[Variation "défense sicilienne, variante Najdorf, sous-variante Browne"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 Qc7 *++[ECO "B98"]+[Variation "défense sicilienne, variante Najdorf, sous-variante de Göteborg (= d’Argentine)"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 h6 9.Bh4 g5 *++[ECO "B99"]+[Variation "défense sicilienne, variante Najdorf (7...Be7), ligne principale"]+[Result "*"]+1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7 9.O-O-O Nbd7 *++[ECO "C00"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 *++[ECO "C00"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 2.Nc3 *++[ECO "C00"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 2.Nf3 *++[ECO "C00"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 2.d4 *++[ECO "C00"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 2.d4 d5 *++[ECO "C00"]+[Variation "défense française, attaque est-indienne"]+[Result "*"]+1.e4 e6 2.d3 *++[ECO "C00"]+[Variation "défense française, attaque Steinitz"]+[Result "*"]+1.e4 e6 2.e5 *++[ECO "C00"]+[Variation "défense française, formation défense Philidor inversée"]+[Result "*"]+1.e4 e6 2.d3 d5 3.Nd2 Nf6 4.Ngf3 Nc6 5.Be2 *++[ECO "C00"]+[Variation "défense française, variante Alapinee"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Be3 *++[ECO "C00"]+[Variation "défense française, variante des deux cavaliers"]+[Result "*"]+1.e4 e6 2.Nc3 d5 3.Nf3 *++[ECO "C00"]+[Variation "défense française, variante Labourdonnais"]+[Result "*"]+1.e4 e6 2.f4 *++[ECO "C00"]+[Variation "défense française, variante Pelikan"]+[Result "*"]+1.e4 e6 2.Nc3 d5 3.f4 *++[ECO "C00"]+[Variation "défense française, variante Réti (= Spielmann)"]+[Result "*"]+1.e4 e6 2.b3 *++[ECO "C00"]+[Variation "défense française, variante Schlechter"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Bd3 *++[ECO "C00"]+[Variation "défense française, variante Steiner"]+[Result "*"]+1.e4 e6 2.c4 *++[ECO "C00"]+[Variation "défense française, variante Tchigorine"]+[Result "*"]+1.e4 e6 2.Qe2 *++[ECO "C00"]+[Variation "défense St.-Georges"]+[Result "*"]+1.e4 e6 2.d4 a6 *++[ECO "C00"]+[Variation "système Lengfellner"]+[Result "*"]+1.e4 e6 2.d4 d6 *++[ECO "C00/11"]+[Variation "défense française, gambit de l’aile"]+[Result "*"]+1.e4 e6 2.Nf3 d5 3.e5 c5 4.b4 *++[ECO "C01"]+[Variation "défense française, variante d’échange (3.Cc3)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.exd5 exd5 *++[ECO "C01"]+[Variation "défense française, variante d’échange"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 *++[ECO "C01"]+[Variation "défense française, variante d’échange, sous-variante Bogolioubof"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 5.Bg5 Nc6 *++[ECO "C01"]+[Variation "défense française, variante d’échange, sous-variante Svenonius"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nc3 Nf6 5.Bg5 *++[ECO "C01/01"]+[Variation "défense française, variante d’échange, sous-variante Blackburne"]+[Result "*"]+1.e4 e6 2.d4 d5 3.exd5 exd5 4.Nf3 Be6 5.Nbd2 *++[ECO "C02"]+[Variation "défense française, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 *++[ECO "C02"]+[Variation "défense française, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 *++[ECO "C02"]+[Variation "défense française, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 *++[ECO "C02"]+[Variation "défense française, variante d’avance, attaque Paulsen"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 *++[ECO "C02"]+[Variation "défense française, variante d’avance, sous-variante Euwe"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Bd7 *++[ECO "C02"]+[Variation "défense française, variante d’avance, sous-variante Milner-Barry"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Nc6 5.Nf3 Qb6 6.Bd3 *++[ECO "C02"]+[Variation "défense française, variante d’avance, sous-variante Nimzovitch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Qg4 *++[ECO "C02"]+[Variation "défense française, variante d’avance, sous-variante Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.dxc5 *++[ECO "C02"]+[Variation "défense française, variante d’avance, sous-variante Wade"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.c3 Qb6 5.Nf3 Bd7 *++[ECO "C02"]+[Variation "défense française, variante d’avance, système Nimzovitch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.e5 c5 4.Nf3 *++[ECO "C03"]+[Variation "défense française, variante Tarrasch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 *++[ECO "C03"]+[Variation "défense française, variante Tarrasch, sous-variante Guimard"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 *++[ECO "C03"]+[Variation "défense française, variante Tarrasch, sous-variante Haberditz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 f5 *++[ECO "C04"]+[Variation "défense française, variante Tarrasch, sous-variante Guimard, ligne principale"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nc6 4.Ngf3 Nf6 *++[ECO "C05"]+[Variation "défense française, variante Tarrasch, sous-variante Botvinnik"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 b6 *++[ECO "C05"]+[Variation "défense française, variante Tarrasch, sous-variante fermée"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 *++[ECO "C05"]+[Variation "défense française, variante Tarrasch, sous-variante fermée"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 *++[ECO "C06"]+[Variation "défense française, variante Tarrasch, sous-variante de Léningrad"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 Nb6 *++[ECO "C06"]+[Variation "défense française, variante Tarrasch, sous-variante fermée, ligne principale"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2 cxd4 8.cxd4 *++[ECO "C07"]+[Variation "défense française, variante Tarrasch, sous-variante Eliskases"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 Qxd5 5.Ngf3 cxd4 6.Bc4 Qd8 *++[ECO "C07"]+[Variation "défense française, variante Tarrasch, sous-variante ouverte"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 *++[ECO "C08"]+[Variation "défense française, variante Tarrasch, sous-variante ouverte (4.exd5 exd5 5.Cgf3)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 *++[ECO "C09"]+[Variation "défense française, variante Tarrasch, sous-variante ouverte, ligne principale"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 *++[ECO "C09/02"]+[Variation "défense française, variante Tarrasch, sous-variante ouverte (= Hübner)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Bb5+ Nc6 6.Ngf3 cxd4 7.Qe2 Qe7 8.Nxd4 Qxe2 9.Kxe2 Bd7 10.N2f3 Nf6 *++[ECO "C09/17"]+[Variation "défense française, variante Tarrasch, sous-variante ouverte, ligne principale (cf. C09/05)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nd2 c5 4.exd5 exd5 5.Ngf3 Nc6 6.Bb5 Bd6 7.O-O Ne7 8.dxc5 Bxc5 9.Nb3 Bd6 10.Nbd4 O-O 11.c3 Bg4 12.Qa4 Bh5 13.Bd3 h6 *++[ECO "C10"]+[Variation "défense française, variante Fort Knox"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Bd7 5.Nf3 Bc6 *++[ECO "C10"]+[Variation "défense française, variante Frere (= Becker)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Qd5 *++[ECO "C10"]+[Variation "défense française, variante Marshall"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 c5 *++[ECO "C10"]+[Variation "défense française, variante Paulsen"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 *++[ECO "C10"]+[Variation "défense française, variante Rubinstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 *++[ECO "C10"]+[Variation "défense française, variante Rubinstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 *++[ECO "C10"]+[Variation "défense française, variante Rubinstein, ligne Capablanca"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Nf3 Ngf6 6.Nxf6+ Nxf6 7.Ne5 *++[ECO "C11"]+[Variation "défense française"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 *++[ECO "C11"]+[Variation "défense française, variante Burn"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 dxe4 *++[ECO "C11"]+[Variation "défense française, variante Henneberger"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Be3 *++[ECO "C11"]+[Variation "défense française, variante Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Nc6 *++[ECO "C11"]+[Variation "défense française, variante Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 *++[ECO "C11"]+[Variation "défense française, variante Steinitz, attaque Bradford"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Bxc5 7.Qg4 *++[ECO "C11"]+[Variation "défense française, variante Steinitz, attaque Gledhill"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.Qg4 *++[ECO "C11"]+[Variation "défense française, variante Steinitz, sous-variante Boleslavsky"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.Nf3 Nc6 7.Be3 *++[ECO "C11"]+[Variation "défense française, variante Steinitz, sous-variante Brodsky-Jones"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.e5 Nfd7 5.f4 c5 6.dxc5 Nc6 7.a3 Bxc5 8.Qg4 O-O 9.Nf3 f6 *++[ECO "C11"]+[Variation "défense française, variante suisse"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bd3 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Bernstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bh4 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Bogolioubof"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.exd5 Qxd5 6.Bxf6 gxf6 7.Qd2 Qa5 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Dr. Olland (= hollandaise)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bc1 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Duras"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 Kf8 9.Bc1 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Grigoriev"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.exf6 hxg5 7.fxg7 Rg8 8.h4 gxh4 9.Qg4 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Janowski"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Be3 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Lasker (8...g6)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 7.bxc3 Ne4 8.Qg4 g6 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Lasker"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Bxc3 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Tartakover"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.Bd2 Nfd7 *++[ECO "C12"]+[Variation "défense française, variante Mac Cutcheon, sous-variante Tchigorine"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Bb4 5.e5 h6 6.exf6 *++[ECO "C13"]+[Variation "défense française, attaque Albin – Alekhine - Chatard"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 *++[ECO "C13"]+[Variation "défense française, attaque Albin – Alekhine - Chatard, variante Breyer"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 c5 *++[ECO "C13"]+[Variation "défense française, attaque Albin – Alekhine - Chatard, variante Maroczy"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 a6 *++[ECO "C13"]+[Variation "défense française, attaque Albin – Alekhine - Chatard, variante Spielmann"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 O-O *++[ECO "C13"]+[Variation "défense française, attaque Albin – Alekhine - Chatard, variante Teichmann"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.h4 f6 *++[ECO "C13"]+[Variation "défense française, système classique"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 *++[ECO "C13"]+[Variation "défense française, système classique, variante Anderssen - Richter"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.Bxf6 Bxf6 6.e5 Be7 7.Qg4 *++[ECO "C13"]+[Variation "défense française, système classique, variante Anderssen"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.Bxf6 *++[ECO "C13"]+[Variation "défense française, système classique, variante de Francfort"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ng8 6.Be3 b6 *++[ECO "C13"]+[Variation "défense française, système classique, variante Tartakover"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ne4 *++[ECO "C13"]+[Variation "défense française, système classique, variante Vistaneckis (= Nimzovitch)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Ng8 *++[ECO "C14"]+[Variation "défense française, système classique"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 *++[ECO "C14"]+[Variation "défense française, système classique, variante Alapinee"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Nb5 *++[ECO "C14"]+[Variation "défense française, système classique, variante Pollock"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Qg4 *++[ECO "C14"]+[Variation "défense française, système classique, variante Rubinstein"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Qd2 *++[ECO "C14"]+[Variation "défense française, système classique, variante Stahlberg"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 O-O 8.Nf3 c5 9.Qd2 Nc6 10.O-O-O c4 *++[ECO "C14"]+[Variation "défense française, système classique, variante Steinitz"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.f4 *++[ECO "C14"]+[Variation "défense française, système classique, variante Tarrasch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5 Be7 5.e5 Nfd7 6.Bxe7 Qxe7 7.Bd3 *++[ECO "C15"]+[Variation "défense française, variante variante Winawer"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd2 *++[ECO "C15"]+[Variation "défense française, variante Winawer, gambit Alekhine (= Maroczy)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Nge2 *++[ECO "C15"]+[Variation "défense française, variante Winawer, gambit Alekhine"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Nge2 dxe4 5.a3 Bxc3+ *++[ECO "C15"]+[Variation "défense française, variante Winawer, gambit Alekhine, sous-variante Alatortsev"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Nge2 dxe4 5.a3 Be7 6.Nxe4 Nf6 7.N2g3 O-O 8.Be2 Nc6 *++[ECO "C15"]+[Variation "défense française, variante Winawer, gambit Alekhine, sous-variante Kan"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Nge2 dxe4 5.a3 Bxc3+ 6.Nxc3 Nc6 *++[ECO "C15"]+[Variation "défense française, variante Winawer, variante Kondratiyev"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.Bd3 c5 5.exd5 Qxd5 6.Bd2 *++[ECO "C15"]+[Variation "défense française, variante Winawer, variante Nimzovitch"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 *++[ECO "C16"]+[Variation "défense française, variante Winawer, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 *++[ECO "C16"]+[Variation "défense française, variante Winawer, variante Petrosian"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 Qd7 *++[ECO "C17"]+[Variation "défense française, variante Winawer, variante d’avance (5.a3)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 *++[ECO "C17"]+[Variation "défense française, variante Winawer, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 *++[ECO "C17"]+[Variation "défense française, variante Winawer, variante d’avance, sous-variante Bogolioubof"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Bd2 *++[ECO "C17"]+[Variation "défense française, variante Winawer, variante d’avance, sous-variante Rauser"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 cxd4 6.axb4 dxc3 7.Nf3 *++[ECO "C17/04"]+[Variation "défense française, variante Winawer, variante d’avance, sous-variante russe (5.Qg4)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.Qg4 Ne7 6.dxc5 Nbc6 7.Bd2 O-O *++[ECO "C18"]+[Variation "défense française, variante Winawer, variante classique"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 *++[ECO "C18"]+[Variation "défense française, variante Winawer, variante d’avance"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 *++[ECO "C18/02"]+[Variation "défense française, variante Winawer, variante classique (7.Cf3)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 7.Nf3 *++[ECO "C18/06"]+[Variation "défense française, variante Winawer, variante d’avance (7.h4)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.h4 Nbc6 8.h5 *++[ECO "C18/07"]+[Variation "défense française, variante Winawer, variante d’avance (sans 7...Dc7)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 *++[ECO "C18/15"]+[Variation "défense française, variante Winawer, variante d’avance, sous-variante pion empoisonné, ligne Euwe - Gligoric"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Kd1 *++[ECO "C18/15"]+[Variation "défense française, variante Winawer, variante d’avance, sous-variante pion empoisonné, ligne Konstantinopolsky"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Qg4 Qc7 8.Qxg7 Rg8 9.Qxh7 cxd4 10.Ne2 *++[ECO "C19"]+[Variation "défense française, variante Winawer, variante d’avance (6...Ce7)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 *++[ECO "C19"]+[Variation "défense française, variante Winawer, variante d’avance, ligne principale positionnelle"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.Nf3 *++[ECO "C19"]+[Variation "défense française, variante Winawer, variante d’avance, variante Smyslov"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Ne7 7.a4 *++[ECO "C19/05"]+[Variation "défense française, variante Winawer, variante d’avance, ligne principale positionnelle (avec ...Dc7)"]+[Result "*"]+1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3 Qc7 7.Nf3 Ne7 8.a4 b6 9.Bb5+ *++[ECO "C20"]+[Variation "début du pion roi"]+[Result "*"]+1.e4 e5 *++[ECO "C20"]+[Variation "ouverture Alapinee"]+[Result "*"]+1.e4 e5 2.Ne2 *++[ECO "C20"]+[Variation "ouverture de mazette"]+[Result "*"]+1.e4 e5 2.Qh5 *++[ECO "C20"]+[Variation "ouverture indienne"]+[Result "*"]+1.e4 e5 2.d3 *++[ECO "C20"]+[Variation "ouverture Lopez"]+[Result "*"]+1.e4 e5 2.c3 *++[ECO "C20"]+[Variation "ouverture Mengarini"]+[Result "*"]+1.e4 e5 2.a3 *++[ECO "C20"]+[Variation "ouverture Napoléon"]+[Result "*"]+1.e4 e5 2.Qf3 *++[ECO "C20"]+[Variation "ouverture tête de roi"]+[Result "*"]+1.e4 e5 2.f3 *++[ECO "C21"]+[Variation "gambit danois"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 *++[ECO "C21"]+[Variation "gambit danois, défense Collijn"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 Qe7 *++[ECO "C21"]+[Variation "gambit danois, défense Schlechter"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 dxc3 4.Bc4 cxb2 5.Bxb2 d5 *++[ECO "C21"]+[Variation "gambit danois, défense Sörensen"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.c3 d5 *++[ECO "C21"]+[Variation "gambit Halasz"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.f4 *++[ECO "C21"]+[Variation "ouverture du centre"]+[Result "*"]+1.e4 e5 2.d4 exd4 *++[ECO "C21"]+[Variation "ouverture du centre"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 *++[ECO "C21"]+[Variation "ouverture du centre, variante Kieseritsky"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Nf3 c5 4.Bc4 b5 *++[ECO "C22"]+[Variation "ouverture du centre"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 *++[ECO "C22"]+[Variation "ouverture du centre, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 *++[ECO "C22"]+[Variation "ouverture du centre, variante Berger"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Nf6 *++[ECO "C22"]+[Variation "ouverture du centre, variante Charousek"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Bb4+ 5.c3 Be7 *++[ECO "C22"]+[Variation "ouverture du centre, variante Hall"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qc4 *++[ECO "C22"]+[Variation "ouverture du centre, variante Kupreichik"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 Nf6 5.Nc3 Bb4 6.Bd2 O-O 7.O-O-O Re8 8.Bc4 d6 9.Nh3 *++[ECO "C22"]+[Variation "ouverture du centre, variante l'Hermet"]+[Result "*"]+1.e4 e5 2.d4 exd4 3.Qxd4 Nc6 4.Qe3 f5 *++[ECO "C23"]+[Variation "ouverture du fou"]+[Result "*"]+1.e4 e5 2.Bc4 *++[ECO "C23"]+[Variation "ouverture du fou, contre-attaque défense Philidor"]+[Result "*"]+1.e4 e5 2.Bc4 c6 *++[ECO "C23"]+[Variation "ouverture du fou, contre-gambit calabrais"]+[Result "*"]+1.e4 e5 2.Bc4 f5 *++[ECO "C23"]+[Variation "ouverture du fou, contre-gambit calabrais, variante Jänisch"]+[Result "*"]+1.e4 e5 2.Bc4 f5 3.d3 *++[ECO "C23"]+[Variation "ouverture du fou, contre-gambit Lewis"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 d5 *++[ECO "C23"]+[Variation "ouverture du fou, double gambit Mac Donnell"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 Bxb4 4.f4 *++[ECO "C23"]+[Variation "ouverture du fou, gambit de l’aile"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 *++[ECO "C23"]+[Variation "ouverture du fou, gambit des quatre pions"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.b4 Bxb4 4.f4 exf4 5.Nf3 Be7 6.d4 Bh4+ 7.g3 fxg3 8.O-O gxh2+ 9.Kh1 *++[ECO "C23"]+[Variation "ouverture du fou, gambit Lewis"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.d4 *++[ECO "C23"]+[Variation "ouverture du fou, gambit Lopez"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.Qe2 Nc6 4.c3 Nf6 5.f4 *++[ECO "C23"]+[Variation "ouverture du fou, variante classique"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 *++[ECO "C23"]+[Variation "ouverture du fou, variante défense Philidor"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 *++[ECO "C23"]+[Variation "ouverture du fou, variante del Rio"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 Qg5 *++[ECO "C23"]+[Variation "ouverture du fou, variante Lisitsine"]+[Result "*"]+1.e4 e5 2.Bc4 c6 3.d4 d5 4.exd5 cxd5 5.Bb5+ Bd7 6.Bxd7+ Nxd7 7.dxe5 Nxe5 8.Ne2 *++[ECO "C23"]+[Variation "ouverture du fou, variante Pratt"]+[Result "*"]+1.e4 e5 2.Bc4 Bc5 3.c3 Nf6 4.d4 exd4 5.e5 d5 6.exf6 dxc4 7.Qh5 O-O *++[ECO "C24"]+[Variation "ouverture du fou, attaque Burger"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.g4 *++[ECO "C24"]+[Variation "ouverture du fou, défense de Berlin"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 *++[ECO "C24"]+[Variation "ouverture du fou, gambit Greco"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.f4 *++[ECO "C24"]+[Variation "ouverture du fou, gambit Ponziani"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 *++[ECO "C24"]+[Variation "ouverture du fou, gambit Urusov"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 *++[ECO "C24"]+[Variation "ouverture du fou, gambit Urusov, variante Panov"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d4 exd4 4.Nf3 d5 5.exd5 Bb4+ 6.c3 Qe7+ *++[ECO "C24/02"]+[Variation "ouverture du fou (avec 3.d3)"]+[Result "*"]+1.e4 e5 2.Bc4 Nf6 3.d3 d5 4.exd5 Nxd5 5.Nf3 Nc6 6.O-O Bg4 7.Re1 Be7 *++[ECO "C25"]+[Variation "ouverture viennoise"]+[Result "*"]+1.e4 e5 2.Nc3 *++[ECO "C25"]+[Variation "ouverture viennoise, contre-gambit Zhuravlev"]+[Result "*"]+1.e4 e5 2.Nc3 Bb4 3.Qg4 Nf6 *++[ECO "C25"]+[Variation "ouverture viennoise, défense Max Lange"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Byfe"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.d4 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit de Vienne"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit de Vienne"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Hamppe - Allgaier"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.h4 g4 6.Ng5 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Hamppe - Allgaier, variante Alapinee"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.h4 g4 6.Ng5 d6 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Hamppe - Muzio"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.Bc4 g4 6.O-O *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Hamppe - Muzio, variante Dubois"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.Bc4 g4 6.O-O gxf3 7.Qxf3 Ne5 8.Qxf4 Qf6 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Pierce"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.d4 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Pierce, attaque Tushmere"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.Nf3 g5 5.d4 g4 6.Bc4 gxf3 7.O-O d5 8.exd5 Bg4 9.dxc6 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Steinitz"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Steinitz, défense Zukertort"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 Qh4+ 5.Ke2 d5 *++[ECO "C25"]+[Variation "ouverture viennoise, gambit Steinitz, variante Fraser-Minckwitz"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.f4 exf4 4.d4 Qh4+ 5.Ke2 b6 *++[ECO "C25"]+[Variation "ouverture viennoise, variante Paulsen"]+[Result "*"]+1.e4 e5 2.Nc3 Nc6 3.g3 *++[ECO "C26"]+[Variation "ouverture viennoise"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 *++[ECO "C26"]+[Variation "ouverture viennoise, variante Falkbeer"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 *++[ECO "C26"]+[Variation "ouverture viennoise, variante Mengarini"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.a3 *++[ECO "C26"]+[Variation "ouverture viennoise, variante Paulsen - Mieses"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.g3 *++[ECO "C26/09"]+[Variation "ouverture viennoise (avec Fc4, ...Fc5) (aujourd’hui, joué avec 2.Fc4 [Adams])"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Bc5 4.d3 d6 5.Bg5 h6 *++[ECO "C27"]+[Variation "gambit Foden - Kieseritsky (cf. C42)"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Nf3 *++[ECO "C27"]+[Variation "gambit Foden – Kieseritsky, défense Lichtenhein (cf. C42)"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Nf3 d5 *++[ECO "C27"]+[Variation "ouverture viennoise"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 *++[ECO "C27"]+[Variation "ouverture viennoise"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Be7 *++[ECO "C27"]+[Variation "ouverture viennoise, gambit Adams"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.d4 *++[ECO "C27"]+[Variation "ouverture viennoise, variante Alekhine"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Be7 6.Nf3 Nc6 7.Nxe5 *++[ECO "C27"]+[Variation "ouverture viennoise, variante Frankenstein - Dracula"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nxe4 4.Qh5 Nd6 5.Bb3 Nc6 6.Nb5 g6 7.Qf3 f5 8.Qd5 Qe7 9.Nxc7+ Kd8 10.Nxa8 b6 *++[ECO "C28"]+[Variation "ouverture viennoise (4.d3)"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.Bc4 Nc6 4.d3 *++[ECO "C29"]+[Variation "gambit viennois"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 *++[ECO "C29"]+[Variation "gambit viennois"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 *++[ECO "C29"]+[Variation "gambit viennois, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 *++[ECO "C29"]+[Variation "gambit viennois, piège Wurzburgeois"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.d3 Qh4+ 6.g3 Nxg3 7.Nf3 Qh5 8.Nxd5 *++[ECO "C29"]+[Variation "gambit viennois, variante Bardeleben"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 f5 *++[ECO "C29"]+[Variation "gambit viennois, variante Breyer"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Be7 *++[ECO "C29"]+[Variation "gambit viennois, variante Heyde"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Qf3 f5 6.d4 *++[ECO "C29"]+[Variation "gambit viennois, variante Kaufmann"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.fxe5 Nxe4 5.Nf3 Bg4 6.Qe2 *++[ECO "C29"]+[Variation "gambit viennois, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nc3 Nf6 3.f4 d5 4.d3 *++[ECO "C30"]+[Variation "gambit roi"]+[Result "*"]+1.e4 e5 2.f4 *++[ECO "C30"]+[Variation "gambit roi refusé (2...Cf6)"]+[Result "*"]+1.e4 e5 2.f4 Nf6 *++[ECO "C30"]+[Variation "gambit roi refusé, défense de la Mafia"]+[Result "*"]+1.e4 e5 2.f4 c5 *++[ECO "C30"]+[Variation "gambit roi refusé, défense Keene"]+[Result "*"]+1.e4 e5 2.f4 Qh4+ 3.g3 Qe7 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique (4.c3)"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique"]+[Result "*"]+1.e4 e5 2.f4 Bc5 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, attaque Marshall"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 Bg4 5.fxe5 dxe5 6.Qa4+ *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, contre-gambit"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 f5 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, sous-variante Hanham"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 Nd7 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, sous-variante Heath"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.b4 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, sous-variante Réti"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.c3 f5 5.fxe5 dxe5 6.d4 exd4 7.Bc4 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, sous-variante Soldatenkov"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.fxe5 *++[ECO "C30"]+[Variation "gambit roi refusé, variante classique, sous-variante Svenonius"]+[Result "*"]+1.e4 e5 2.f4 Bc5 3.Nf3 d6 4.Nc3 Nf6 5.Bc4 Nc6 6.d3 Bg4 7.h3 Bxf3 8.Qxf3 exf4 *++[ECO "C30"]+[Variation "gambit roi refusé, variante Norwalde"]+[Result "*"]+1.e4 e5 2.f4 Qf6 *++[ECO "C30"]+[Variation "gambit roi refusé, variante Norwalde, gambit Buecker"]+[Result "*"]+1.e4 e5 2.f4 Qf6 3.Nf3 Qxf4 4.Nc3 Bb4 5.Bc4 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer (3...e4)"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer (4.d3)"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer"]+[Result "*"]+1.e4 e5 2.f4 d5 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, gambit Morphy"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nc3 Bb4 6.Bd2 e3 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Milner-Barry"]+[Result "*"]+1.e4 e5 2.f4 d5 3.Nc3 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Nimzovitch"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.Bb5+ *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Rubinstein"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.Nc3 Nf6 5.Qe2 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Tartakover"]+[Result "*"]+1.e4 e5 2.f4 d5 3.Nf3 *++[ECO "C31"]+[Variation "gambit roi refusé, contre-gambit Nimzovitch"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 c6 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer (5.dxe4)"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, ligne principale (7...Ff5)"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf5 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Alapinee"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf2+ 8.Kd1 Qxd5+ 9.Nfd2 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Charousek"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Qe2 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Charousek"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Qe2 Qxd5 7.Nd2 f5 8.g4 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Kérès"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Nd2 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Réti"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.Qe2 *++[ECO "C32"]+[Variation "gambit roi refusé, contre-gambit Falkbeer, variante Tarrasch"]+[Result "*"]+1.e4 e5 2.f4 d5 3.exd5 e4 4.d3 Nf6 5.dxe4 Nxe4 6.Nf3 Bc5 7.Qe2 Bf5 8.g4 O-O *++[ECO "C33"]+[Variation "gambit roi accepté"]+[Result "*"]+1.e4 e5 2.f4 exf4 *++[ECO "C33"]+[Variation "gambit roi accepté, contre-gambit Lopez-Gianutio, variante Hein"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 f5 4.Qe2 Qh4+ 5.Kd1 fxe4 6.Nc3 Kd8 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Breyer"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Qf3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Carrera (= Basman)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Qe2 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou réduit (Petrofff – Jänisch - Tartakover)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Be2 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, attaque Mc Donnell"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 Ne7 7.g3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, attaque Mc Donnell"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.g3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 Bb4 5.e5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, attaque Tchigorine"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 d5 5.Bxd5 g5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, attaqueGrimm"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 d6 7.e5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, contre-gambit Bryan"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 b5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, contre-gambit Bryan"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 b5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, contre-gambit Lopez-Gianutio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 f5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense Boden"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 Nc6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense classique"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense classique"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.d4 Ne7 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense classique, attaque Cozio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Qf3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense Cozio (= Morphy)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense ouverture espagnole (= Ruy Lopez)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 c6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, défense Steinitz"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Ne7 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, Maurian défense"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nc6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Anderssen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 c6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Bledow"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Bogolioubof"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Boren-Svenonius"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 Qh4+ 5.Kf1 Bd6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Fraser"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 g5 5.Nc3 Bg7 6.g3 fxg3 7.Qf3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Gifford"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 Qh4+ 5.Kf1 g5 6.g3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Greco"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 Bc5 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Jänisch"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 Nf6 4.Nc3 c6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du fou, variante Morphy"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bc4 d5 4.Bxd5 Nf6 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit du pion (= Stamma)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.h4 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Kérès (= Mason - Steinitz)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nc3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Orsini"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.b3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Rumbleweed"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Kf2 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Schurig"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Bd3 *++[ECO "C33"]+[Variation "gambit roi accepté, gambit Villemson (= Steinitz)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.d4 *++[ECO "C34"]+[Variation "gambit roi accepté, contre-gambit Gianutio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 f5 *++[ECO "C34"]+[Variation "gambit roi accepté, défense Becker"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 h6 *++[ECO "C34"]+[Variation "gambit roi accepté, défense Fischer"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d6 *++[ECO "C34"]+[Variation "gambit roi accepté, défense Schallop"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Nf6 *++[ECO "C34"]+[Variation "gambit roi accepté, gambit du cavalier roi"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 *++[ECO "C34"]+[Variation "gambit roi accepté, variante Bonsch - Osmolovsky"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Ne7 *++[ECO "C35"]+[Variation "gambit roi accepté, défense Cunningham"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 *++[ECO "C35"]+[Variation "gambit roi accepté, défense Cunningham, défense Euwe"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Nf6 *++[ECO "C35"]+[Variation "gambit roi accepté, défense Cunningham, gambit Bertin"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Bh4+ 5.g3 *++[ECO "C35"]+[Variation "gambit roi accepté, défense Cunningham, gambit des trois pions"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 Be7 4.Bc4 Bh4+ 5.g3 fxg3 6.O-O gxh2+ 7.Kh1 *++[ECO "C36"]+[Variation "gambit roi accepté, défense Abbazia (défense classique, défense moderne)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 *++[ECO "C36"]+[Variation "gambit roi accepté, défense Abbazia, variante Botvinnik"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 5.Bb5+ c6 6.dxc6 bxc6 7.Bc4 Nd5 *++[ECO "C36"]+[Variation "gambit roi accepté, défense Abbazia, variante moderne"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 d5 4.exd5 Nf6 *++[ECO "C37"]+[Variation "gambit roi accepté, double gambit Muzio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qf6 7.e5 Qxe5 8.Bxf7+ *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Blachly"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Nc6 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Cochrane"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 f3 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit du cavalier roi"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Ghulam Rassim"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.d4 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Herzfeld"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nc6 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Lolli (= gambit Muzio sauvage)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Bxf7+ *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Lolli, variante Young"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Bxf7+ Kxf7 6.O-O gxf3 7.Qxf3 Qf6 8.d4 Qxd4+ 9.Be3 Qf6 10.Nc3 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Mac Donnell"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Nc3 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Muzio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Muzio, contre-attaque Kling - Horwitz"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O Qe7 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Muzio, défense Brentano"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O d5 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Muzio, défense From"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qe7 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Muzio, défense Holloway"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Nc6 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Quaade"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Nc3 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Rosentreter"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.d4 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Salvio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Salvio, contre-attaque Anderssen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nh6 7.d4 d6 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Silberschmidt"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.Ne5 Qh4+ 6.Kf1 Nh6 7.d4 f3 *++[ECO "C37"]+[Variation "gambit roi accepté, gambit Sörensen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.d4 g4 5.Ne5 *++[ECO "C37"]+[Variation "gambit roi accepté, Muzio gambit, variante Paulsen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 g4 5.O-O gxf3 6.Qxf3 Qf6 7.e5 Qxe5 8.d3 Bh6 9.Nc3 Ne7 10.Bd2 Nbc6 11.Rae1 *++[ECO "C38"]+[Variation "gambit roi accepté, gambit défense Philidor"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 *++[ECO "C38"]+[Variation "gambit roi accepté, gambit défense Philidor, variante Schultz"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 h6 6.d4 d6 7.Qd3 *++[ECO "C38"]+[Variation "gambit roi accepté, gambit Greco"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.h4 h6 6.d4 d6 7.Nc3 c6 8.hxg5 hxg5 9.Rxh8 Bxh8 10.Ne5 *++[ECO "C38"]+[Variation "gambit roi accepté, gambit Hanstein"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 5.O-O *++[ECO "C38"]+[Variation "King's knight's gambit"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.Bc4 Bg7 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, attaque Urusov"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Bc4+ d5 8.Bxd5+ Kg7 9.d4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, attaque Walker"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Bc4+ *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, défense Horny"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Qxg4 Nf6 8.Qxf4 Bd6 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, défense Schlechter"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 Nf6 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, gambit Blackburne"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.Nc3 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, variante Cook"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.d4 d5 8.Bxf4 dxe4 9.Bc4+ Kg7 10.Be5+ *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Allgaier, variante Thorold"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ng5 h6 6.Nxf7 Kxf7 7.d4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit du cavalier roi"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Berlin (6.Bc4)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Bc4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Berlin"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Berlin, variante Rivière"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Nxg4 d5 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Brentano (= Campbell)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Brentano"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.Bxf4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Brentano, variante Caro"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.Bxf4 Nxe4 8.Nd2 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Brentano, variante Kaplanek"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d5 6.d4 Nf6 7.exd5 Qxd5 8.Nc3 Bb4 9.Kf2 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense du grand fouet (= classique)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 h5 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense du grand fouet, variante Jänisch"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 h5 6.Bc4 Rh7 7.d4 Bh6 8.Nc3 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Kolisch"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 d6 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Neumann"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nc6 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Paulsen"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Bg7 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Polerio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Be7 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Salvio (= Rosenthal)"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Qe7 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, défense Salvio, variante Cozio"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Qe7 6.d4 f5 7.Bc4 *++[ECO "C39"]+[Variation "gambit roi accepté, gambit Kieseritsky, gambit Rice"]+[Result "*"]+1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.Bc4 d5 7.exd5 Bd6 8.O-O *++[ECO "C40"]+[Variation "défense Damiano"]+[Result "*"]+1.e4 e5 2.Nf3 f6 *++[ECO "C40"]+[Variation "défense Greco"]+[Result "*"]+1.e4 e5 2.Nf3 Qf6 *++[ECO "C40"]+[Variation "défense Gunderam"]+[Result "*"]+1.e4 e5 2.Nf3 Qe7 *++[ECO "C40"]+[Variation "gambit du pion dame (= de l’éléphant)"]+[Result "*"]+1.e4 e5 2.Nf3 d5 *++[ECO "C40"]+[Variation "gambit du pion dame (= Maroczy)"]+[Result "*"]+1.e4 e5 2.Nf3 d5 3.exd5 Bd6 *++[ECO "C40"]+[Variation "gambit letton (3.Fc4)"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 *++[ECO "C40"]+[Variation "gambit letton"]+[Result "*"]+1.e4 e5 2.Nf3 f5 *++[ECO "C40"]+[Variation "gambit letton, contre-gambit du tire-bouchon"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 Nf6 *++[ECO "C40"]+[Variation "gambit letton, défense Fraser"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Nc6 *++[ECO "C40"]+[Variation "gambit letton, variante Behting"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 Qg5 5.Nf7 Qxg2 6.Rf1 d5 7.Nxh8 Nf6 *++[ECO "C40"]+[Variation "gambit letton, variante Nimzovitch"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Nxe5 Qf6 4.d4 d6 5.Nc4 fxe4 6.Ne3 *++[ECO "C40"]+[Variation "gambit letton, variante Polerio"]+[Result "*"]+1.e4 e5 2.Nf3 f5 3.Bc4 fxe4 4.Nxe5 d5 *++[ECO "C40"]+[Variation "ouverture du cavalier roi"]+[Result "*"]+1.e4 e5 2.Nf3 *++[ECO "C41"]+[Variation "défense Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 d6 *++[ECO "C41"]+[Variation "défense Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 *++[ECO "C41"]+[Variation "défense Philidor Berger variante"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 5.Nc3 Be7 6.Be2 O-O 7.O-O c5 8.Nf3 Nc6 9.Bg5 Be6 10.Re1 *++[ECO "C41"]+[Variation "défense Philidor, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 d5 5.exd5 *++[ECO "C41"]+[Variation "défense Philidor, gambit Lopez"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 f5 *++[ECO "C41"]+[Variation "défense Philidor, gambit Lopez, variante Jänisch"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 f5 4.d4 exd4 5.Ng5 Nh6 6.Nxh7 *++[ECO "C41"]+[Variation "défense Philidor, gambit Philidor"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 *++[ECO "C41"]+[Variation "défense Philidor, gambit Philidor, attaque del Rio"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 fxe4 5.Ng5 d5 6.e6 *++[ECO "C41"]+[Variation "défense Philidor, gambit Philidor, variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.dxe5 fxe4 5.Ng5 d5 6.e6 Bc5 7.Nc3 *++[ECO "C41"]+[Variation "défense Philidor, gambit Philidor, variante Zukertort"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 f5 4.Nc3 *++[ECO "C41"]+[Variation "défense Philidor, variante d’échange"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 *++[ECO "C41"]+[Variation "défense Philidor, variante d’échange"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 *++[ECO "C41"]+[Variation "défense Philidor, variante d’échange"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 Nf6 *++[ECO "C41"]+[Variation "défense Philidor, variante Foden"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Qxd4 Bd7 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham améliorée"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Ng5 Nh6 6.f4 Be7 7.O-O O-O 8.c3 d5 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Delmar"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.c3 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Kmoch"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Ng5 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Krause"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.O-O *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Schlechter"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.Nc3 *++[ECO "C41"]+[Variation "défense Philidor, variante Hanham, sous-variante Steiner"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nd7 4.Bc4 c6 5.O-O Be7 6.dxe5 *++[ECO "C41"]+[Variation "défense Philidor, variante Larsen"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 exd4 4.Nxd4 g6 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch (= Jänisch)"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Klein"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Bc4 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Larobok"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.Ng5 O-O 7.Bxf7+ *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Locock"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Ng5 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Rellstab"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 Nxe4 5.Qd5 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Sokolsky"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.dxe5 Nxe4 5.Nbd2 *++[ECO "C41"]+[Variation "défense Philidor, variante Nimzovitch, sous-variante Sozine"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.d4 Nf6 4.Nc3 Nbd7 5.Bc4 Be7 6.O-O O-O 7.Qe2 c6 8.a4 exd4 *++[ECO "C41"]+[Variation "défense Philidor, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 d6 3.Bc4 Be7 4.c3 *++[ECO "C42"]+[Variation "défense Petroff (= russe)"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, piège Marshall"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 7.O-O O-O 8.c4 Bg4 9.cxd5 f5 10.Re1 Bxh2+ *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.Nbd2 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante fermée"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 Nf6 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Jänisch"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.c4 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Krause"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.c4 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Maroczy"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 Bg4 9.c3 f5 10.c4 Bh4 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Marshall"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Mason"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O O-O *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Tarrasch"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Bd6 7.O-O O-O 8.c4 Bg4 *++[ECO "C42"]+[Variation "défense Petroff, attaque classique, variante Tchigorine"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d4 d5 6.Bd3 Be7 7.O-O Nc6 8.Re1 *++[ECO "C42"]+[Variation "défense Petroff, attaque Cozio (= Lasker)"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Qe2 *++[ECO "C42"]+[Variation "défense Petroff, attaque française"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.d3 *++[ECO "C42"]+[Variation "défense Petroff, attaque Kaufmann"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.c4 *++[ECO "C42"]+[Variation "défense Petroff, attaque Nimzovitch"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nf3 Nxe4 5.Nc3 *++[ECO "C42"]+[Variation "défense Petroff, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nc4 *++[ECO "C42"]+[Variation "défense Petroff, gambit Cochrane"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6 4.Nxf7 *++[ECO "C42"]+[Variation "défense Petroff, variante Damiano"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nxe5 Nxe4 *++[ECO "C42"]+[Variation "défense Petroff, variante des trois cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Nc3 *++[ECO "C42"]+[Variation "défense Petroff, variante italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 *++[ECO "C42/01"]+[Variation "défense Petroff"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 Nxe4 4.Nc3 *++[ECO "C42/01"]+[Variation "défense Petroff, gambit Foden - Kieseritsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 Nxe4 4.Nc3 Nxc3 5.dxc3 Nc6 *++[ECO "C42/01"]+[Variation "défense Petroff, variante Lichtehein modifiée"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.Bc4 Nxe4 4.Nc3 d5 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne (= Steinitz)"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne, ligne principale"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qxd4 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne, variante Bardeleben"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qe2 Nc5 6.Nxd4 Nc6 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.e5 Ne4 5.Qe2 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne, variante symétrique"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 *++[ECO "C43"]+[Variation "défense Petroff, attaque moderne, variante Trifunovic"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Bd6 6.O-O O-O 7.c4 Bxe5 *++[ECO "C43"]+[Variation "défense Petroff, gambit Urusov"]+[Result "*"]+1.e4 e5 2.Nf3 Nf6 3.d4 exd4 4.Bc4 *++[ECO "C44"]+[Variation "gambit irlandais (= de Chicago)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nxe5 Nxe5 4.d4 *++[ECO "C44"]+[Variation "ouverture de Dresde"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c4 *++[ECO "C44"]+[Variation "ouverture du pion roi"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 *++[ECO "C44"]+[Variation "ouverture écossaise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bb4+ *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bb4+ 5.c3 dxc3 6.bxc3 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.Ng5 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, attaque Vitzhum"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.Ng5 Nh6 6.Qh5 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, contre-attaque Anderssen (= Paulsen, Suhle)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.O-O d6 6.c3 Bg4 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, défense Benima"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Be7 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, défense Cochrane - Shumov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bc5 5.Ng5 Nh6 6.Nxf7 Nxf7 7.Bxf7+ Kxf7 8.Qh5+ g6 9.Qxc5 d5 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, défense Dubois - Réti"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Nf6 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, variante Cochrane"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bb4+ 5.c3 dxc3 6.bxc3 Ba5 7.e5 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit écossais, variante Hanneken"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bc4 Bb4+ 5.c3 dxc3 6.O-O cxb2 7.Bxb2 Nf6 8.Ng5 O-O 9.e5 Nxe5 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit Göring"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit Göring"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit Göring, mat du mousse"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 d6 6.Bc4 Bg4 7.O-O Ne5 8.Nxe5 Bxd1 9.Bxf7+ Ke7 10.Nd5# *++[ECO "C44"]+[Variation "ouverture écossaise, gambit Göring, variante Bardeleben"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.c3 dxc3 5.Nxc3 Bb4 6.Bc4 Nf6 *++[ECO "C44"]+[Variation "ouverture écossaise, gambit Kelfsson (= Mac Lopez)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Bb5 *++[ECO "C44"]+[Variation "ouverture écossaise, variante Cochrane"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 Nxd4 4.Nxe5 Ne6 5.Bc4 c6 6.O-O Nf6 7.Nxf7 *++[ECO "C44"]+[Variation "ouverture écossaise, variante Lolli (cf. C45)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 Nxd4 4.Nxd4 exd4 5.Qxd4 Ne7 6.Nc3 *++[ECO "C44"]+[Variation "ouverture écossaise, variante Lolli"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 Nxd4 *++[ECO "C44"]+[Variation "ouverture Hanham inversée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 Nf6 4.d3 d5 5.Nbd2 *++[ECO "C44"]+[Variation "ouverture hongroise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 *++[ECO "C44"]+[Variation "ouverture Konstantinopolsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.g3 *++[ECO "C44"]+[Variation "ouverture Ponziani"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 *++[ECO "C44"]+[Variation "ouverture Ponziani, contre-attaque Jänisch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 *++[ECO "C44"]+[Variation "ouverture Ponziani, contre-gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 *++[ECO "C44"]+[Variation "ouverture Ponziani, contre-gambit, attaque Schmidt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 4.d4 d6 5.d5 *++[ECO "C44"]+[Variation "ouverture Ponziani, contre-gambit, variante Cordel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 f5 4.d4 d6 5.d5 fxe4 6.Ng5 Nb8 7.Nxe4 Nf6 8.Bd3 Be7 *++[ECO "C44"]+[Variation "ouverture Ponziani, défense Fraser"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nf6 4.d4 Nxe4 5.d5 Bc5 *++[ECO "C44"]+[Variation "ouverture Ponziani, variante Caro"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 Bd7 *++[ECO "C44"]+[Variation "ouverture Ponziani, variante Leonhardt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 Nf6 *++[ECO "C44"]+[Variation "ouverture Ponziani, variante Réti"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Nge7 *++[ECO "C44"]+[Variation "ouverture Ponziani, variante Romanishin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 Be7 *++[ECO "C44"]+[Variation "ouverture Ponziani, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.c3 d5 4.Qa4 f6 *++[ECO "C44"]+[Variation "ouverture Tayler"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Be2 Nf6 4.d4 *++[ECO "C45"]+[Variation "ouverture écossaise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 *++[ECO "C45"]+[Variation "ouverture écossaise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Bd2 *++[ECO "C45"]+[Variation "ouverture écossaise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Blackburne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Qd2 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Blumenfeld"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.Nb5 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Fraser"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nf3 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Horwitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bb5 *++[ECO "C45"]+[Variation "ouverture écossaise, attaque Paulsen, défense Gunsberg"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Bb5 Nd8 *++[ECO "C45"]+[Variation "ouverture écossaise, contre-attaque Pulling"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Nd2 Qxe4+ 7.Be2 Qxg2 8.Bf3 Qh3 9.Nxc7+ Kd8 10.Nxa8 Nf6 11.a3 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Ghulam Kassim"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nxd4 5.Qxd4 d6 6.Bd3 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Gottschall"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Qd2 d5 8.Nb5 Bxe3 9.Qxe3 O-O 10.Nxc7 Rb8 11.Nxd5 Nxd5 12.exd5 Nb4 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Meitner"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Be3 Qf6 6.c3 Nge7 7.Nc2 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Mieses"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.e5 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Potter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Romanichine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Bc5 5.Nb3 Bb4+ *++[ECO "C45"]+[Variation "ouverture écossaise, variante Rosenthal"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nb5 Bb4+ 6.Bd2 Qxe4+ 7.Be2 Kd8 8.O-O Bxd2 9.Nxd2 Qg6 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Schmidt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Qh4 5.Nc3 *++[ECO "C45"]+[Variation "ouverture écossaise, variante Tartakover"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4 Nf6 5.Nxc6 bxc6 6.Nd2 *++[ECO "C46"]+[Variation "ouverture des quatre cavaliers, gambit Schultze - Müller"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Nxe5 *++[ECO "C46"]+[Variation "ouverture des quatre cavaliers, variante italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bc4 *++[ECO "C46"]+[Variation "ouverture des trois cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 *++[ECO "C46"]+[Variation "ouverture des trois cavaliers, défense Winawer (= gothique)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 f5 *++[ECO "C46"]+[Variation "ouverture des trois cavaliers, variante Schlechter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Bb4 4.Nd5 Nf6 *++[ECO "C46"]+[Variation "ouverture des trois cavaliers, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 *++[ECO "C46"]+[Variation "ouverture des trois cavaliers, variante Steinitz, sous-variante Rosenthal"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 g6 4.d4 exd4 5.Nd5 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, gambit de Belgrade"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nd5 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, variante écossaise (4...exd4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, variante écossaise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, variante écossaise, sous-variante Krause"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 Bb4 5.Nxe5 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, variante Gunsberg"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.a3 *++[ECO "C47"]+[Variation "ouverture des quatre cavaliers, variante Ioseliani - Glek, (cf. C46)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.g3 *++[ECO "C47/05"]+[Variation "ouverture des quatre cavaliers, variante écossaise (4...exd4 5.Cxd4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.d4 exd4 5.Nxd4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein (5.Fe2)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Be2 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein, variante Bogolioubof"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxe5 Qe7 6.f4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein, variante d’échange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Nxd4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein, variante Henneberger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.O-O *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, gambit Rubinstein, variante Maroczy"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Nd4 5.Be2 Nxf3+ 6.Bxf3 Bc5 7.O-O O-O 8.d3 d6 9.Na4 Bb6 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante Bardeleben"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.O-O O-O 6.Nxe5 Nxe5 7.d4 Bd6 8.f4 Nc6 9.e5 Bb4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante espagnole"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante espagnole, défense classique"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante Marshall"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bc5 5.O-O O-O 6.Nxe5 Nd4 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante Spielmann"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 a6 5.Bxc6 dxc6 6.Nxe5 Nxe4 7.Nxe4 Qd4 8.O-O Qxe5 9.Re1 Be6 10.d4 Qd5 *++[ECO "C48"]+[Variation "ouverture des quatre cavaliers, variante Tanken"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 a6 5.Bxc6 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, contre-attaque Gunsberg"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.Nd5 Nxd5 7.exd5 e4 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante Alatortsev"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Qe7 7.Ne2 d5 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante espagnole double"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante espagnole double"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante Janowski"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 7.bxc3 d6 8.Re1 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante Nimzovitch (= Paulsen)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.Bxc6 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante Svenonius"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 Bxc3 7.bxc3 d5 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, déclouage Metger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, sous-variante Blake"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Ne7 8.Nh4 c6 9.Bc4 d5 10.Bb3 Qd6 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, sous-variante Capablanca"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Bxc3 8.bxc3 Qe7 9.Re1 Nd8 10.d4 Bg4 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, sous-variante Pillsbury"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Ne7 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, sous-variante Tarrasch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Bg5 Be6 *++[ECO "C49"]+[Variation "ouverture des quatre cavaliers, variante symétrique, système Maroczy"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6 4.Bb5 Bb4 5.O-O O-O 6.d3 d6 7.Ne2 *++[ECO "C50"]+[Variation "défense hongroise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 *++[ECO "C50"]+[Variation "défense hongroise, variante Tartakover"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Be7 4.d4 exd4 5.c3 Nf6 6.e5 Ne4 *++[ECO "C50"]+[Variation "gambit Rousseau"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 f5 *++[ECO "C50"]+[Variation "ouverture Blackburne, gambit du shilling"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nd4 4.Nxe5 Qg5 5.Nxf7 Qxg2 6.Rf1 Qxe4+ 7.Be2 Nf3+ *++[ECO "C50"]+[Variation "ouverture du pion roi"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 *++[ECO "C50"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 *++[ECO "C50"]+[Variation "ouverture italienne, gambit Jérome"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.Bxf7+ *++[ECO "C50"]+[Variation "ouverture italienne, système Giuoco Pianissimo"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 *++[ECO "C50"]+[Variation "ouverture italienne, système Giuoco Pianissimo"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 *++[ECO "C50"]+[Variation "ouverture italienne, système Giuoco Pianissimo, variante Canal"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 d6 6.Bg5 *++[ECO "C50"]+[Variation "ouverture italienne, système Giuoco Pianissimo, variante Dubois"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 f5 5.Ng5 f4 *++[ECO "C50"]+[Variation "ouverture italienne, système Giuoco Pianissimo, variante italienne des quatre cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.d3 Nf6 5.Nc3 *++[ECO "C50/06"]+[Variation "ouverture italienne, variante des quatre cavaliers (cf. C55)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.Nc3 Nf6 *++[ECO "C51"]+[Variation "gambit Evans (5...Fe7)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 *++[ECO "C51"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 *++[ECO "C51"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 *++[ECO "C51"]+[Variation "gambit Evans refusé (5.a4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.a4 *++[ECO "C51"]+[Variation "gambit Evans refusé"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Cordel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.Bb2 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Hicken"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 7.Qf3 Qxe5 8.Qxf7+ Kd8 9.Bb2 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Hirschbach"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Lange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Nh6 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Pavlov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Nh6 7.d4 d6 8.Bxh6 dxe5 9.Bxg7 Rg8 10.Bxf7+ Kxf7 11.Bxe5 Qg5 12.Nd2 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Showalter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.a4 a6 6.Nc3 *++[ECO "C51"]+[Variation "gambit Evans refusé, variante Vasquez"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bb6 5.b5 Na5 6.Nxe5 Qg5 7.Bxf7+ Ke7 8.Qh5 *++[ECO "C51"]+[Variation "gambit Evans, attaque Fraser - Mortimer"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 10.Qa4 Bd7 11.Qb3 Na5 12.Bxf7+ Kf8 13.Qc2 *++[ECO "C51"]+[Variation "gambit Evans, attaque Fraser"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Bg4 10.Qa4 *++[ECO "C51"]+[Variation "gambit Evans, attaque Göring"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Na5 10.Bg5 *++[ECO "C51"]+[Variation "gambit Evans, attaque Morphy"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 *++[ECO "C51"]+[Variation "gambit Evans, contre-gambit"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 d5 *++[ECO "C51"]+[Variation "gambit Evans, défense Mayet"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bf8 *++[ECO "C51"]+[Variation "gambit Evans, variante Cordel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Be7 6.d4 Na5 *++[ECO "C51"]+[Variation "gambit Evans, variante normale"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 *++[ECO "C51"]+[Variation "gambit Evans, variante Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.d5 Na5 10.Bb2 Ne7 *++[ECO "C51"]+[Variation "gambit Evans, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.Nc3 Na5 10.Bg5 f6 11.Be3 *++[ECO "C51"]+[Variation "gambit Evans, variante Stone - Ware"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bd6 *++[ECO "C51"]+[Variation "gambit Evans, variante Ulvestad"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Bc5 6.d4 exd4 7.O-O d6 8.cxd4 Bb6 9.d5 Na5 10.Bb2 *++[ECO "C52"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 *++[ECO "C52"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 *++[ECO "C52"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O *++[ECO "C52"]+[Variation "gambit Evans"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 *++[ECO "C52"]+[Variation "gambit Evans, attaque Richardson"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O Nf6 7.d4 O-O 8.Nxe5 *++[ECO "C52"]+[Variation "gambit Evans, attaque Tartakover"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 *++[ECO "C52"]+[Variation "gambit Evans, attaque Waller"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 exd4 8.Qb3 *++[ECO "C52"]+[Variation "gambit Evans, défense du compromis"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 *++[ECO "C52"]+[Variation "gambit Evans, défense du compromis, variante Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 8.Qb3 Qf6 9.e5 Qg6 10.Nxc3 Nge7 11.Ba3 *++[ECO "C52"]+[Variation "gambit Evans, défense du compromis, variante Potter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O dxc3 8.Qb3 Qf6 9.e5 Qg6 10.Nxc3 Nge7 11.Rd1 *++[ECO "C52"]+[Variation "gambit Evans, défense Lasker"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bb6 *++[ECO "C52"]+[Variation "gambit Evans, variante Alapine-Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bg4 *++[ECO "C52"]+[Variation "gambit Evans, variante Leonhardt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 b5 *++[ECO "C52"]+[Variation "gambit Evans, variante Levenfish"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Qb3 Qd7 8.dxe5 dxe5 9.O-O Bb6 10.Ba3 Na5 11.Nxe5 *++[ECO "C52"]+[Variation "gambit Evans, variante Sanders - Alapinee"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.O-O d6 7.d4 Bd7 *++[ECO "C52"]+[Variation "gambit Evans, variante Sokolsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 d6 7.Bg5 *++[ECO "C53"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 *++[ECO "C53"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 *++[ECO "C53"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 *++[ECO "C53"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 d5 *++[ECO "C53"]+[Variation "ouverture italienne, attaque Bird"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.b4 *++[ECO "C53"]+[Variation "ouverture italienne, variante Anderssen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 d5 7.Bb5 Ne4 8.cxd4 Bb4+ *++[ECO "C53"]+[Variation "ouverture italienne, variante de maintien du centre"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 *++[ECO "C53"]+[Variation "ouverture italienne, variante Eisinger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.d5 Nb8 7.d6 *++[ECO "C53"]+[Variation "ouverture italienne, variante fermée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 *++[ECO "C53"]+[Variation "ouverture italienne, variante Ghulam Rassim"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.e5 Ne4 7.Bd5 Nxf2 8.Kxf2 dxc3+ 9.Kg3 *++[ECO "C53"]+[Variation "ouverture italienne, variante La Bourdonnais"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 d6 5.d4 exd4 6.cxd4 Bb6 *++[ECO "C53"]+[Variation "ouverture italienne, variante Mestel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.Bg5 *++[ECO "C53"]+[Variation "ouverture italienne, variante Tarrasch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Qe7 5.d4 Bb6 6.O-O Nf6 7.a4 a6 8.Re1 d6 9.h3 *++[ECO "C54"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 *++[ECO "C54"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 *++[ECO "C54"]+[Variation "ouverture italienne, attaque Greco"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 *++[ECO "C54"]+[Variation "ouverture italienne, attaque Möller (= Therkatz)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 *++[ECO "C54"]+[Variation "ouverture italienne, attaque Möller, attaque à la bayonette"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 Bf6 10.Re1 Ne7 11.Rxe4 d6 12.g4 *++[ECO "C54"]+[Variation "ouverture italienne, variante Aitken"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 9.bxc3 Bxc3 10.Ba3 *++[ECO "C54"]+[Variation "ouverture italienne, variante Bernstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 9.bxc3 Bxc3 10.Qb3 d5 *++[ECO "C54"]+[Variation "ouverture italienne, variante de Cracovie"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Kf1 *++[ECO "C54"]+[Variation "ouverture italienne, variante Greco"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Nxc3 *++[ECO "C54"]+[Variation "ouverture italienne, variante Krause"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Bd2 Nxe4 8.Bxb4 Nxb4 9.Bxf7+ Kxf7 10.Qb3+ d5 11.Ne5+ Kf6 12.f3 *++[ECO "C54"]+[Variation "ouverture italienne, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.bxc3 d5 10.Ba3 *++[ECO "C54"]+[Variation "ouverture italienne, variante Therkatz - Herzog"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d4 exd4 6.cxd4 Bb4+ 7.Nc3 Nxe4 8.O-O Bxc3 9.d5 Bf6 10.Re1 Ne7 11.Rxe4 d6 12.Bg5 Bxg5 13.Nxg5 O-O 14.Nxh7 *++[ECO "C55"]+[Variation "défense des deux cavaliers (3...Nf6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Nc3 Nxe4 5.Nxe4 d5 *++[ECO "C55"]+[Variation "défense des deux cavaliers (ouverture moderne du fou)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d3 *++[ECO "C55"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 *++[ECO "C55"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, défense Loman"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 g6 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.g4 Qg6 12.Nce4 Bb6 13.f4 O-O-O *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Krause"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 Ng4 7.c3 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Marshall"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.Nce4 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Rubinstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.Ng5 Qd5 10.Nc3 Qf5 11.Nce4 Bf8 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Schlechter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 d5 7.exf6 dxc4 8.Re1+ Be6 9.fxg7 *++[ECO "C55"]+[Variation "défense des deux cavaliers, attaque Max Lange, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Bc5 6.e5 Ng4 *++[ECO "C55"]+[Variation "défense des deux cavaliers, variante Keidanz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.e5 d5 6.Bb5 Ne4 7.Nxd4 Bc5 8.Nxc6 Bxf2+ 9.Kf1 Qh4 *++[ECO "C55"]+[Variation "défense des deux cavaliers, variante Perreux"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.Ng5 *++[ECO "C55"]+[Variation "ouverture italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 Bxd4 6.Nxd4 Nxd4 7.Bg5 d6 *++[ECO "C55"]+[Variation "ouverture italienne, attaque Holzhausen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 Bxd4 6.Nxd4 Nxd4 7.Bg5 d6 8.f4 Qe7 9.fxe5 dxe5 10.Nc3 *++[ECO "C55"]+[Variation "ouverture italienne, variante Rosentreter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.O-O Bc5 5.d4 Bxd4 6.Nxd4 Nxd4 7.Bg5 h6 8.Bh4 g5 9.f4 *++[ECO "C56"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 *++[ECO "C56"]+[Variation "défense des deux cavaliers, attaque Yurdansky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Bxd5 Qxd5 8.Nc3 Qa5 9.Nxe4 Be6 10.Bg5 h6 11.Bh4 g5 12.Nf6+ Ke7 13.b4 *++[ECO "C56"]+[Variation "défense des deux cavaliers, variante Canal"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.d4 exd4 5.O-O Nxe4 6.Re1 d5 7.Nc3 *++[ECO "C57"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 *++[ECO "C57"]+[Variation "défense des deux cavaliers, attaque Fegatello"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 *++[ECO "C57"]+[Variation "défense des deux cavaliers, attaque Fegatello, défense Polerio"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 Kxf7 7.Qf3+ Ke6 8.Nc3 Nce7 *++[ECO "C57"]+[Variation "défense des deux cavaliers, attaque Fegatello, variante Leonhardt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.Nxf7 Kxf7 7.Qf3+ Ke6 8.Nc3 Ncb4 9.Qe4 c6 10.a3 Na6 11.d4 Nac7 *++[ECO "C57"]+[Variation "défense des deux cavaliers, attaque Lolli"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.d4 *++[ECO "C57"]+[Variation "défense des deux cavaliers, variante Fritz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 *++[ECO "C57"]+[Variation "défense des deux cavaliers, variante Fritz, sous-variante Gruber"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nd4 6.c3 b5 7.Bf1 Nxd5 8.Ne4 *++[ECO "C57"]+[Variation "défense des deux cavaliers, variante Pincus"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Nxd5 6.d4 Bb4+ *++[ECO "C57"]+[Variation "défense des deux cavaliers, variante Ulvestad"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 b5 *++[ECO "C57"]+[Variation "défense des deux cavaliers, variante Wilkes Barre (= Traxler)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 Bc5 *++[ECO "C58"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ *++[ECO "C58"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 *++[ECO "C58"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Blackburne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 cxb5 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Bogolioubof"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Colman"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 Rb8 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Kieseritsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Maroczy"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 h6 7.Nf3 e4 8.Qe2 Nxc4 9.dxc4 Be7 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Paoli"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Qf3 Qc7 9.Bd3 *++[ECO "C58"]+[Variation "défense des deux cavaliers, variante Yankovich"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.d3 h6 7.Nf3 e4 8.Qe2 Nxc4 9.dxc4 Bc5 10.Nfd2 *++[ECO "C59"]+[Variation "défense des deux cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 *++[ECO "C59"]+[Variation "défense des deux cavaliers, variante Göring"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Qc7 *++[ECO "C59"]+[Variation "défense des deux cavaliers, variante Knorre"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nf3 e4 10.Ne5 Bd6 11.d4 Qc7 12.Bd2 *++[ECO "C59"]+[Variation "défense des deux cavaliers, variante Steinitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6 4.Ng5 d5 5.exd5 Na5 6.Bb5+ c6 7.dxc6 bxc6 8.Be2 h6 9.Nh3 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Brentano (cf. C65)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g5 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Cozio"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Cozio, variante Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nge7 4.Nc3 g6 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense fianchetto roi (= Smyslov - Barnes)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 g6 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Lucena"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Be7 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Pollock"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Na5 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), variante de Nuremberg"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f6 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Vinogradov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Qe7 *++[ECO "C60"]+[Variation "ouverture espagnole (= Ruy Lopez),)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 *++[ECO "C61"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Bird"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 *++[ECO "C61"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Bird, variante Paulsen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nd4 4.Nxd4 exd4 5.O-O Ne7 *++[ECO "C62"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz ancienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 *++[ECO "C62"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz ancienne, attaque Nimzovitch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 5.Nc3 Nf6 6.Bxc6 *++[ECO "C62"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz ancienne, variante semi-Duras"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 d6 4.d4 Bd7 5.c4 *++[ECO "C63"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Schliemann"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 *++[ECO "C63"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Schliemann, variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 f5 4.Nc3 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel) (4.c3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel), variante du Bénélux"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Nf6 5.O-O O-O 6.d4 Bb6 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel), variante Charousek"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Bb6 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel), variante Boden"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 Qe7 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel), variante Zaitsev"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.O-O Nd4 5.b4 *++[ECO "C64"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Cordel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Bc5 4.c3 f5 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise (4.O-O)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, attaque Nyholm"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d4 exd4 5.O-O *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, piège de Mortimer"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Ne7 5.Nxe5 c6 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Anderssen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 5.Bxc6+ *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Beverwijk"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Duras"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 d6 5.c4 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Kaufmann"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Bc5 5.Be3 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Mortimer"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.d3 Ne7 *++[ECO "C65"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique (= Cordel), variante du Bénélux (cf. C64)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Bc5 5.c3 O-O 6.d4 Bb6 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise fermée, variante Bernstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Bg5 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise fermée, variante Tchigorine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Nd7 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise fermée, variante Showalter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Bxc6 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise fermée, variante Wolf"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 exd4 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, (4.O-O d6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, piège de Tarrasch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 7.Re1 O-O *++[ECO "C66"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante du hérisson"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O d6 5.d4 Bd7 6.Nc3 Be7 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise ouverte"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise ouverte, (5...Fe7)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise ouverte, variante l'Hermet"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.dxe5 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise ouverte, variante Showalter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Nd6 6.Ba4 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, attaque Winawer"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.Nd4 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Cordel"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nf5 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Minckwitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.dxe5 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Pillsbury"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.b3 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante de Rio de Janeiro"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.Nc3 O-O 10.Re1 Nc5 11.Nd4 Ne6 12.Be3 Nxd4 13.Bxd4 c5 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Rosenthal"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 a6 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Trifunovic"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 d5 *++[ECO "C67"]+[Variation "ouverture espagnole (= Ruy Lopez), défense berlinoise, variante Zukertort"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6 4.O-O Nxe4 5.d4 Be7 6.Qe2 Nd6 7.Bxc6 bxc6 8.dxe5 Nb7 9.c4 *++[ECO "C68"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 *++[ECO "C68"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, sous-variante Alekhine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.d4 exd4 6.Qxd4 Qxd4 7.Nxd4 Bd7 *++[ECO "C68"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, sous-variante Kérès"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 *++[ECO "C68"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, sous-variante Romanovsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.Nc3 f6 6.d3 *++[ECO "C68/12"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, sous-variante Pachman - Romanichine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Qd6 *++[ECO "C69"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange (5.O-O)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O *++[ECO "C69"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, gambit Alapinee"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O Bg4 6.h3 h5 *++[ECO "C69"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange, sous-variante Gligoric"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Bxc6 dxc6 5.O-O f6 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Alapinee différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Bb4 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Bird différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nd4 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense classique différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Bc5 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Cozio différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nge7 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense fianchetto différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 g6 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Schliemann différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 f5 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Caro"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), variante de Graz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 5.Bb3 Bc5 *++[ECO "C70"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Taimanov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 b5 5.Bb3 Na5 *++[ECO "C71"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 *++[ECO "C71"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante Duras (= Kérès)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c4 *++[ECO "C71"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante des trois cavaliers"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Nc3 *++[ECO "C71"]+[Variation "ouverture espagnole (= Ruy Lopez), piège de l’arche de Noé"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.d4 b5 6.Bb3 Nxd4 7.Nxd4 exd4 8.Qxd4 c5 *++[ECO "C72"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne (5.O-O)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.O-O *++[ECO "C73"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante Alapine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ bxc6 6.d4 f6 *++[ECO "C73"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante Richter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.Bxc6+ bxc6 6.d4 *++[ECO "C74"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 *++[ECO "C74"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante de la siesta"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 *++[ECO "C74"]+[Variation "ouverture espagnole (= Ruy Lopez), Siesta, Kopayev variante"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 f5 6.exf5 Bxf5 7.O-O *++[ECO "C75"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 *++[ECO "C75"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante Rubinstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nge7 *++[ECO "C75/04"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante Rubinstein - Geller"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 Nge7 7.O-O Ng6 8.d5 Nb8 9.c4 Be7 10.Nc3 O-O 11.Bxd7 Nxd7 12.Be3 Nh4 *++[ECO "C76"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz moderne, variante fianchetto roi (= Bronstein) (6...g6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 d6 5.c3 Bd7 6.d4 g6 7.O-O Bg7 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque Wormald (= Alapine)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque Wormald, variante Grünfeld"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Qe2 b5 6.Bb3 Be7 7.d4 d6 8.c3 Bg4 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Morphy"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Morphy, variante Duras"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 d6 6.c4 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Anderssen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.d3 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), variante des quatre cavaliers (= Tarrasch)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Nc3 *++[ECO "C77"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Treybal (= de Bayreuth)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.Bxc6 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), (5.O-O)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), (avec ...b5, ...d6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 d6 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque de l’aile"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Be7 7.a4 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Möller"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Bc5 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’Arkhangelsk"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bc5 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’Arkhangelsk"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Bb7 *++[ECO "C78"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Rabinovich"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 d6 7.Ng5 d5 8.exd5 Nd4 9.Re1 Bc5 10.Rxe5+ Kf8 *++[ECO "C79"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz différée (= défense russe)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 *++[ECO "C79"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz différée, variante Boleslavsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Nxe4 8.Re1 f5 9.dxe5 d5 10.Nc3 *++[ECO "C79"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz différée, variante Lipnitsky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Bg4 *++[ECO "C79"]+[Variation "ouverture espagnole (= Ruy Lopez), défense Steinitz différée, variante Rubinstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O d6 6.Bxc6+ bxc6 7.d4 Nxe4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (= Tarrasch)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (6.d4 b5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (6.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (7.Fb3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (8...Fe6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (8.dxe5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Fries"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Nxe5 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, défense Schlechter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.a4 Nxd4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, gambit Harksen"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.c4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Berger"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.a4 Nxd4 9.Nxd4 exd4 10.Nc3 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Bernstein"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Bernstein, gambit Karpov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Nbd2 Nc5 10.c3 d4 11.Ng5 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Knorre"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Nc3 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Richter"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.d5 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante de Riga"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 exd4 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Tartakover"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.Qe2 *++[ECO "C80"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Zukertort"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Ne7 *++[ECO "C81"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Howell"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 *++[ECO "C81"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Howell, sous-variante Adams"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.c4 *++[ECO "C81"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Howell, sous-variante Ekström"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.Qe2 Be7 10.Rd1 O-O 11.c4 bxc4 12.Bxc4 Qd7 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (9.c3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Motzko"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Qd3 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, attaque Motzko, sous-variante Nenarokov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Qd3 Ne7 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante de Berlin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Nc5 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Dilworth"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 O-O 11.Bc2 Nxf2 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante italienne"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 *++[ECO "C82"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante de St.-Petersbourg"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Bc5 10.Nbd2 *++[ECO "C83"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte (9...Fe7 10.Te1)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 *++[ECO "C83"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, défense classique"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 *++[ECO "C83"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, piège de Tarrasch"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 O-O 11.Nd4 Qd7 12.Nxe6 fxe6 13.Rxe4 *++[ECO "C83"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante de Breslau"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Re1 O-O 11.Nd4 Nxe5 *++[ECO "C83"]+[Variation "ouverture espagnole (= Ruy Lopez), variante ouverte, sous-variante Malkin"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Nxe4 6.d4 b5 7.Bb3 d5 8.dxe5 Be6 9.c3 Be7 10.Nbd2 O-O 11.Qe2 *++[ECO "C84"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 *++[ECO "C84"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée centre (5...b5) (cf. N78)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3 Be7 7.Nc3 *++[ECO "C84"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, attaque du centre"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 *++[ECO "C84"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, gambit basque (= variante nord-espagnole)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d4 exd4 7.e5 Ne4 8.c3 *++[ECO "C84/01"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (6.d3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 *++[ECO "C84/02"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (7...Fb7)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 b5 7.Bb3 Bb7 *++[ECO "C84/05"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (7...d6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.d3 b5 7.Bb3 d6 *++[ECO "C85"]+[Variation "ouverture espagnole (= Ruy Lopez), variante d’échange doublement différée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Bxc6 *++[ECO "C86"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque Worrall"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 *++[ECO "C86"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque Worrall, ligne solide"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 d6 *++[ECO "C86"]+[Variation "ouverture espagnole (= Ruy Lopez), attaque Worrall, ligne violente (8.c3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Qe2 b5 7.Bb3 O-O 8.c3 *++[ECO "C87"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, variante Averbakh"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 d6 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), piège de l’arche de Noé"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.d4 Nxd4 9.Nxd4 exd4 10.Qxd4 c5 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (7...h6 8.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.d4 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (7...O-O)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (8.c3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Falla"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Na5 9.Bc2 c5 10.d4 Qc7 11.a4 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Leonhardt"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 Na5 9.Bc2 c5 10.d4 Qc7 11.h3 Nc6 12.d5 Nb8 13.Nbd2 g5 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, système anti-Marshall (8.a4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.a4 *++[ECO "C88"]+[Variation "ouverture espagnole (= Ruy Lopez), variante Trajkovic"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 Bb7 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall (11...c6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall, ligne principale (12.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall, ligne principale"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall, ligne principale, variante Spassky"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.d4 Bd6 13.Re1 Qh4 14.g3 Qh3 15.Be3 Bg4 16.Qd3 Rae8 17.Nd2 Re6 18.a4 Qh5 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall, variante Herman - Steiner"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 e4 *++[ECO "C89"]+[Variation "ouverture espagnole (= Ruy Lopez), gambit Marshall, variante Kevitz"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d5 9.exd5 Nxd5 10.Nxe5 Nxe5 11.Rxe5 c6 12.Bxd5 cxd5 13.d4 Bd6 14.Re3 *++[ECO "C90"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (avec ...d6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 *++[ECO "C90"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Lutikov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.Bc2 *++[ECO "C90"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Pilnik"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d3 *++[ECO "C90"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Suetine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.a3 *++[ECO "C91"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (9.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 *++[ECO "C91"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Bogolioubof"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.d4 Bg4 *++[ECO "C92"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (9.h3)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 *++[ECO "C92"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Kérès (9...a5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 a5 *++[ECO "C92"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Kholmov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Be6 *++[ECO "C92"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, sous-variante Ragozine - Petrossian (= Kérès)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nd7 *++[ECO "C92"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, système Flohr - Zaitsev (= sous-variante Lenzerheide)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Bb7 *++[ECO "C93"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Smyslov"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 h6 *++[ECO "C94"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Breyer"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 *++[ECO "C95"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Breyer (10.d4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 *++[ECO "C95"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Breyer, sous-variante Borisenko"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 *++[ECO "C95"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Breyer, sous-variante Gligoric"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nbd2 Bb7 12.Bc2 c5 *++[ECO "C95"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Breyer, sous-variante Simaguine"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Nb8 10.d4 Nbd7 11.Nh4 *++[ECO "C96"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (10...c5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 *++[ECO "C96"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée (8...Ca5)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 *++[ECO "C96"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Borisenko"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Nc6 *++[ECO "C96"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Kérès (avec ...Cd7)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Nd7 *++[ECO "C96"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Rossolimo"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c6 11.d4 Qc7 *++[ECO "C97"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine (12.Cbd2)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 *++[ECO "C97"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine, système yougoslave"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Bd7 13.Nf1 Rfe8 14.Ne3 g6 *++[ECO "C98"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine (12...Cc6)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 *++[ECO "C98"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine, attaque Rauser"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 Nc6 13.dxc5 *++[ECO "C99"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine (avec ...cxd4)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 *++[ECO "C99/13"]+[Variation "ouverture espagnole (= Ruy Lopez), variante fermée, défense Tchigorine (avec ...cxd4, ...Fb7)"]+[Result "*"]+1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O 8.c3 d6 9.h3 Na5 10.Bc2 c5 11.d4 Qc7 12.Nbd2 cxd4 13.cxd4 Bb7 14.Nf1 Rac8 15.Bb1 d5 *++[ECO "D00"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 d5 *++[ECO "D00"]+[Variation "début du pion dame, attaque Levitsky (attaque du fou dame)"]+[Result "*"]+1.d4 d5 2.Bg5 *++[ECO "D00"]+[Variation "début du pion dame, attaque Stonewall"]+[Result "*"]+1.d4 d5 2.e3 Nf6 3.Bd3 *++[ECO "D00"]+[Variation "début du pion dame, variante Mason"]+[Result "*"]+1.d4 d5 2.Bf4 *++[ECO "D00"]+[Variation "début du pion dame, variante Mason, gambit Steinitz"]+[Result "*"]+1.d4 d5 2.Bf4 c5 *++[ECO "D00"]+[Variation "début du pion dame, variante Tchigorine"]+[Result "*"]+1.d4 d5 2.Nc3 *++[ECO "D00"]+[Variation "défense anti Richter - Veresov"]+[Result "*"]+1.d4 d5 2.Nc3 Bg4 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer"]+[Result "*"]+1.d4 d5 2.e4 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer, contre-gambit Lemberg"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 e5 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer, contre-gambit Lemberg"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 e5 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer, défense Euwe"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 dxe4 4.f3 exf3 5.Nxf3 e6 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer, défense Lagenheinicke"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 Nf6 4.f3 e3 *++[ECO "D00"]+[Variation "gambit Blackmar – Diemer, défense Teichmann"]+[Result "*"]+1.d4 d5 2.e4 dxe4 3.Nc3 Nf6 4.f3 exf3 5.Nxf3 Bg4 *++[ECO "D00/05"]+[Variation "attaque Trompovsky, variante Hodgson"]+[Result "*"]+1.d4 Nf6 2.Bg5 d5 3.Bxf6 exf6 4.e3 c6 5.Bd3 Bd6 6.Qf3 *++[ECO "D00/07"]+[Variation "gambit Blackmar – Diemer, variante Hübsch"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.e4 Nxe4 *++[ECO "D01"]+[Variation "attaque Richter - Veresov"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 *++[ECO "D01"]+[Variation "attaque Richter - Veresov, variante Richter"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 4.f3 *++[ECO "D01"]+[Variation "attaque Richter - Veresov, variante Veresov"]+[Result "*"]+1.d4 d5 2.Nc3 Nf6 3.Bg5 Bf5 4.Bxf6 *++[ECO "D02"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 d5 2.Nf3 *++[ECO "D02"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 *++[ECO "D02"]+[Variation "début du pion dame, variante anti-Grünfeld (tout sauf 6.c4)"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2 O-O 5.O-O d5 6.Bf4 *++[ECO "D02"]+[Variation "début du pion dame, variante Krause"]+[Result "*"]+1.d4 d5 2.Nf3 c5 *++[ECO "D02"]+[Variation "début du pion dame, variante Tchigorine"]+[Result "*"]+1.d4 d5 2.Nf3 Nc6 *++[ECO "D02"]+[Variation "système de Londres"]+[Result "*"]+1.d4 Nf6 2.Nf3 e6 3.Bf4 d5 4.e3 *++[ECO "D02"]+[Variation "système de Londres"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bf4 *++[ECO "D02"]+[Variation "système de Londres"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.Bf4 c6 4.e3 *++[ECO "D03"]+[Variation "attaque Torre (= Tartakover)"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 *++[ECO "D03/12"]+[Variation "attaque Torre (= Tartakover)"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.Bg5 g6 4.Nbd2 Bg7 5.e3 O-O 6.c3 Nbd7 7.Be2 Re8 8.b4 h6 *++[ECO "D04"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 *++[ECO "D05"]+[Variation "système Colle"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 *++[ECO "D05"]+[Variation "système Colle"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 *++[ECO "D05"]+[Variation "système Colle, variante Koltanovski"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.c3 *++[ECO "D05"]+[Variation "système Colle, variante Zukertort (= Rubinstein)"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Bd3 c5 5.b3 *++[ECO "D05"]+[Variation "système Colle, variante Zukertort"]+[Result "*"]+1.d4 d5 2.Nf3 Nf6 3.e3 e6 4.Nbd2 c5 5.b3 *++[ECO "D06"]+[Variation "gambit dame"]+[Result "*"]+1.d4 d5 2.c4 *++[ECO "D06"]+[Variation "gambit dame refusé, défense Grau (= Sahovic)"]+[Result "*"]+1.d4 d5 2.c4 Bf5 *++[ECO "D06"]+[Variation "gambit dame refusé, défense Marshall"]+[Result "*"]+1.d4 d5 2.c4 Nf6 *++[ECO "D06"]+[Variation "gambit dame refusé, défense symétrique (= autrichienne)"]+[Result "*"]+1.d4 d5 2.c4 c5 *++[ECO "D07"]+[Variation "gambit dame refusé, défense Tchigorine"]+[Result "*"]+1.d4 d5 2.c4 Nc6 *++[ECO "D07"]+[Variation "gambit dame refusé, défense Tchigorine défense, variante Janowski"]+[Result "*"]+1.d4 d5 2.c4 Nc6 3.Nc3 dxc4 4.Nf3 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin"]+[Result "*"]+1.d4 d5 2.c4 e5 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin, piège de Lasker"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.e3 Bb4+ 5.Bd2 dxe3 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin, variante Alapine"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin, variante Balogh"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 Qe7 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin, variante Janowski"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 f6 *++[ECO "D08"]+[Variation "gambit dame refusé, contre-gambit Albin, variante Krenosz"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.Nbd2 Bg4 6.h3 Bxf3 7.Nxf3 Bb4+ 8.Bd2 Qe7 *++[ECO "D09"]+[Variation "gambit dame refusé, contre-gambit Albin (5.g3)"]+[Result "*"]+1.d4 d5 2.c4 e5 3.dxe5 d4 4.Nf3 Nc6 5.g3 *++[ECO "D10"]+[Variation "gambit dame refusé, défense slave"]+[Result "*"]+1.d4 Nf6 2.c4 c6 3.Nc3 d5 4.e3 a6 *++[ECO "D10"]+[Variation "gambit dame refusé, défense slave"]+[Result "*"]+1.d4 d5 2.c4 c6 *++[ECO "D10"]+[Variation "gambit dame refusé, défense slave, gambit Winawer"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 e5 *++[ECO "D10"]+[Variation "gambit dame refusé, défense slave, variante Alekhine"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 dxc4 4.e4 *++[ECO "D10"]+[Variation "gambit dame refusé, défense slave, variante d’échange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.cxd5 *++[ECO "D11"]+[Variation "gambit dame refusé, défense slave (2...Ff5)"]+[Result "*"]+1.d4 d5 2.Nf3 Bf5 3.c4 e6 4.Nc3 *++[ECO "D11"]+[Variation "gambit dame refusé, défense slave (3.Cf3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 *++[ECO "D11"]+[Variation "gambit dame refusé, défense slave (4.Dc2)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qc2 *++[ECO "D11"]+[Variation "gambit dame refusé, défense slave (4.e3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 *++[ECO "D11"]+[Variation "gambit dame refusé, défense slave, variante Breyer"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nbd2 *++[ECO "D12"]+[Variation "gambit dame refusé, défense slave (4.e3 Ff5)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 *++[ECO "D12"]+[Variation "gambit dame refusé, défense slave, variante d’Amsterdam"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Nc3 e6 7.Ne5 Nfd7 *++[ECO "D12"]+[Variation "gambit dame refusé, défense slave, variante d’échange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Nc3 *++[ECO "D12"]+[Variation "gambit dame refusé, défense slave, variante de Landau"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 Bf5 5.cxd5 cxd5 6.Qb3 Qc8 7.Bd2 e6 8.Na3 *++[ECO "D13"]+[Variation "gambit dame refusé, défense slave, variante d’échange"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 *++[ECO "D14"]+[Variation "gambit dame refusé, défense slave, variante d’échange (6.Ff4 Ff5)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 *++[ECO "D14"]+[Variation "gambit dame refusé, défense slave, variante d’échange, sous-variante Trifunovic"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Qb3 Bb4 *++[ECO "D14/03"]+[Variation "gambit dame refusé, défense slave, variante d’échange, attaque Wuss"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.cxd5 cxd5 5.Nc3 Nc6 6.Bf4 Bf5 7.e3 e6 8.Bd3 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave (avec …dxc4)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave, (avec Cc3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 a6 5.e3 b5 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave, gambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave, variante Alekhine (5.e3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e3 b5 6.a4 b4 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave, variante Schlechter"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 g6 *++[ECO "D15"]+[Variation "gambit dame refusé, défense slave, variante Süchting"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 Qb6 *++[ECO "D15/07"]+[Variation "gambit dame refusé, défense slave, Tolush-Geller gambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.e4 b5 6.e5 *++[ECO "D16"]+[Variation "gambit dame refusé, défense slave, variante Alapine"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 *++[ECO "D16"]+[Variation "gambit dame refusé, défense slave, variante Smyslov"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Na6 6.e4 Bg4 *++[ECO "D16"]+[Variation "gambit dame refusé, défense slave, variante Soultanbeieff"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 e6 *++[ECO "D16"]+[Variation "gambit dame refusé, défense slave, variante Steiner variante"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bg4 *++[ECO "D17"]+[Variation "gambit dame refusé, défense slave, attaque Krause"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 *++[ECO "D17"]+[Variation "gambit dame refusé, défense slave, défense tchèque"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 *++[ECO "D17"]+[Variation "gambit dame refusé, défense slave, variante de Karlsbad"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 Nbd7 7.Nxc4 Qc7 8.g3 e5 *++[ECO "D17"]+[Variation "gambit dame refusé, défense slave, variante de Wiesbaden"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.Ne5 e6 *++[ECO "D18"]+[Variation "gambit dame refusé, défense slave, variante hollandaise (6.e3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qe2 Bg6 *++[ECO "D18"]+[Variation "gambit dame refusé, défense slave, variante hollandaise, sous-variante Lasker"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 Na6 *++[ECO "D18/02"]+[Variation "gambit dame refusé, défense slave, variante hollandaise, gambit"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O Nbd7 9.Qe2 Bg6 10.e4 *++[ECO "D19"]+[Variation "gambit dame refusé, défense slave, variante hollandaise"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O *++[ECO "D19"]+[Variation "gambit dame refusé, défense slave, variante hollandaise, ligne principale"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 *++[ECO "D19"]+[Variation "gambit dame refusé, défense slave, variante hollandaise, sous-variante Sämisch"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 dxc4 5.a4 Bf5 6.e3 e6 7.Bxc4 Bb4 8.O-O O-O 9.Qe2 Ne4 10.g4 *++[ECO "D20"]+[Variation "gambit dame accepté, (3.e4)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 *++[ECO "D20"]+[Variation "gambit dame accepté, Linares variante"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 c5 4.d5 Nf6 5.Nc3 b5 *++[ECO "D20"]+[Variation "gambit dame accepté, Schwartz défense"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.e4 f5 *++[ECO "D20"]+[Variation "gambit dame accepté"]+[Result "*"]+1.d4 d5 2.c4 dxc4 *++[ECO "D21"]+[Variation "gambit dame accepté (3.Cf3)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 *++[ECO "D21"]+[Variation "gambit dame accepté, défense Alekhine, variante Borisenko - Furman"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e4 *++[ECO "D21"]+[Variation "gambit dame accepté, variante Ericson"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 b5 *++[ECO "D22"]+[Variation "gambit dame accepté, défense Alekhine"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 *++[ECO "D22"]+[Variation "gambit dame accepté, défense Alekhine, variante Alatortsev"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 Bg4 5.Bxc4 e6 6.d5 *++[ECO "D22"]+[Variation "gambit dame accepté, variante Haberditz"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 a6 4.e3 b5 *++[ECO "D23"]+[Variation "gambit dame accepté"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 *++[ECO "D23"]+[Variation "gambit dame accepté, variante Mannheim"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Qa4+ *++[ECO "D23/06"]+[Variation "gambit dame accepté (4.Dc2)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Qc2 dxc4 *++[ECO "D24"]+[Variation "gambit dame accepté (4.Cc3)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 *++[ECO "D24"]+[Variation "gambit dame accepté, variante Bogolioubof"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.Nc3 a6 5.e4 *++[ECO "D25"]+[Variation "gambit dame accepté (4.e3)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 *++[ECO "D25"]+[Variation "gambit dame accepté, variante Flohr"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Be6 *++[ECO "D25"]+[Variation "gambit dame accepté, variante Janovsky - Larsen"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 Bg4 *++[ECO "D25"]+[Variation "gambit dame accepté, variante Smyslov"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 g6 *++[ECO "D26"]+[Variation "gambit dame accepté (4...e6)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 *++[ECO "D26"]+[Variation "gambit dame accepté, variante classique (6.O-O)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O *++[ECO "D26"]+[Variation "gambit dame accepté, variante classique"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 *++[ECO "D26"]+[Variation "gambit dame accepté, variante classique, sous-variante Furman"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.Qe2 a6 7.dxc5 Bxc5 8.O-O Nc6 9.e4 b5 10.e5 *++[ECO "D26"]+[Variation "gambit dame accepté, variante classique, sous-variante Steinitz"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O cxd4 *++[ECO "D27"]+[Variation "gambit dame accepté, variante classique (6...a6)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 *++[ECO "D27"]+[Variation "gambit dame accepté, variante classique, sous-variante Geller"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.e4 *++[ECO "D27"]+[Variation "gambit dame accepté, variante classique, sous-variante Rubinstein"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.a4 *++[ECO "D28"]+[Variation "gambit dame accepté, variante classique (7...b5)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 *++[ECO "D28"]+[Variation "gambit dame accepté, variante classique (7.De2)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 *++[ECO "D28"]+[Variation "gambit dame accepté, variante classique, sous-variante Flohr"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Nc6 9.Rd1 c4 10.Bc2 Nb4 11.Nc3 Nxc2 12.Qxc2 Bb7 13.d5 Qc7 *++[ECO "D29"]+[Variation "gambit dame accepté, variante classique (8...Fb7)"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 *++[ECO "D29"]+[Variation "gambit dame accepté, variante classique, sous-variante Smyslov"]+[Result "*"]+1.d4 d5 2.c4 dxc4 3.Nf3 Nf6 4.e3 e6 5.Bxc4 c5 6.O-O a6 7.Qe2 b5 8.Bb3 Bb7 9.Rd1 Nbd7 10.Nc3 Bd6 *++[ECO "D30"]+[Variation "gambit dame refusé"]+[Result "*"]+1.d4 d5 2.c4 e6 *++[ECO "D30"]+[Variation "gambit dame refusé"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 *++[ECO "D30"]+[Variation "gambit dame refusé, défense slave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 *++[ECO "D30"]+[Variation "gambit dame refusé, défense slave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 *++[ECO "D30"]+[Variation "gambit dame refusé, défense slave, variante Semmering"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Nbd7 6.Bd3 c5 *++[ECO "D30"]+[Variation "gambit dame refusé, variante Capablanca - Duras"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 h6 *++[ECO "D30"]+[Variation "gambit dame refusé, variante Capablanca"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nbd2 *++[ECO "D30"]+[Variation "gambit dame refusé, variante d’Hastings"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 h6 5.Bxf6 Qxf6 6.Nc3 c6 *++[ECO "D30"]+[Variation "gambit dame refusé, variante Spielmann"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 g6 *++[ECO "D30"]+[Variation "gambit dame refusé, variante Stonewall"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.e3 c6 5.Nbd2 Ne4 6.Bd3 f5 *++[ECO "D30"]+[Variation "gambit dame refusé, variante Vienna"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nf3 Nf6 4.Bg5 Bb4+ *++[ECO "D31"]+[Variation "gambit dame refusé (3.Cc3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave, gambit Marshall"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.e4 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave, variante Abrahams"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 a5 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave, variante Junge"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 Qb6 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave, variante Koomen"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 5.a4 Bb4 6.e3 b5 7.Bd2 Qe7 *++[ECO "D31"]+[Variation "gambit dame refusé, défense semi-slave, variante Noteboom"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c6 4.Nf3 dxc4 *++[ECO "D31"]+[Variation "gambit dame refusé, variante Alapine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 b6 *++[ECO "D31"]+[Variation "gambit dame refusé, variante Charousek (= Petrossian)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 *++[ECO "D31"]+[Variation "gambit dame refusé, variante Janowski"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 a6 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch (4.cd ed)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch, gambit Marshall"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.e4 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch, gambit Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.dxc5 d4 6.Na4 b5 *++[ECO "D32"]+[Variation "gambit dame refusé, défense Tarrasch, gambit von Hennig-Schara"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 cxd4 *++[ECO "D32/16"]+[Variation "gambit dame refusé, défense Tarrasch (6.e3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.e3 Nf6 7.Be2 *++[ECO "D33"]+[Variation "gambit dame refusé, défense Tarrasch, système Schlechter - Rubinstein"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 *++[ECO "D33"]+[Variation "gambit dame refusé, défense Tarrasch, système Schlechter - Rubinstein, variante Rey Ardid"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 7.e4 *++[ECO "D33"]+[Variation "gambit dame refusé, défense Tarrasch, variante de Folkestone (= suédoise)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 c4 *++[ECO "D33"]+[Variation "gambit dame refusé, défense Tarrasch, variante de Prague"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 *++[ECO "D33"]+[Variation "gambit dame refusé, défense Tarrasch, variante Wagner"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Bg4 *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante Bogolioubof"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 Be6 10.Rc1 c4 *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante de Prague (7...Fe7)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante de Prague (9.Fg5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante de Prague, position normale"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante Réti"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.dxc5 Bxc5 10.Na4 *++[ECO "D34"]+[Variation "gambit dame refusé, défense Tarrasch, variante Stoltz"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.cxd5 exd5 5.Nf3 Nc6 6.g3 Nf6 7.Bg2 Be7 8.O-O O-O 9.Bg5 Be6 10.Rc1 b6 *++[ECO "D35"]+[Variation "gambit dame refusé (3...Cf6)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 *++[ECO "D35"]+[Variation "gambit dame refusé, attaque Harrwitz"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bf4 *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Be7 4.cxd5 exd5 5.Bf4 Nf6 *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange, ligne positionnelle (5...c6)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange, ligne positionnelle"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange, sous-variante du caméléon"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 O-O 7.Bd3 Nbd7 8.Qc2 Re8 9.Nge2 Nf8 10.O-O-O *++[ECO "D35"]+[Variation "gambit dame refusé, variante d’échange, variante Sämisch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Nf3 Nbd7 6.Bf4 *++[ECO "D36"]+[Variation "gambit dame refusé, variante d’échange, ligne positionnelle (6.Dc2)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 c6 6.Qc2 *++[ECO "D36/07"]+[Variation "gambit dame refusé, variante d’échange, ligne moderne"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.cxd5 exd5 7.Qc2 Nbd7 8.Bd3 c6 9.Nge2 Re8 10.h3 *++[ECO "D37"]+[Variation "gambit dame refusé (4.Cf3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 *++[ECO "D37"]+[Variation "gambit dame refusé, variante classique"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Be7 5.Bf4 *++[ECO "D38"]+[Variation "gambit dame refusé, variante Ragozine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 *++[ECO "D39"]+[Variation "gambit dame refusé, variante Ragozine, sous-variante de Vienne"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 Bb4 5.Bg5 dxc4 *++[ECO "D40"]+[Variation "gambit dame refusé, défense semi-Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 *++[ECO "D40"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante Levenfish"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.Bd3 Bd6 7.O-O O-O 8.Qe2 Qe7 9.dxc5 Bxc5 10.e4 *++[ECO "D40"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante Pillsbury"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.Bg5 *++[ECO "D40"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante symétrique"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 Nc6 6.Bd3 Bd6 7.O-O O-O *++[ECO "D40/11"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante d’échange (cf. B14/D42)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.e3 cxd4 6.exd4 Be7 7.Bd3 dxc4 8.Bxc4 O-O 9.O-O Nc6 10.a3 a6 *++[ECO "D41"]+[Variation "gambit dame refusé, défense semi-Tarrasch (5.cxd5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 *++[ECO "D41"]+[Variation "gambit dame refusé, défense semi-Tarrasch, ligne moderne"]+[Result "*"]+1.c4 Nf6 2.Nf3 e6 3.g3 c5 4.Bg2 d5 5.O-O Nc6 6.d4 Be7 7.cxd5 Nxd5 8.Nc3 O-O *++[ECO "D41"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante de San Sebastian"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Qa5 *++[ECO "D41"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante Kmoch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e4 Nxc3 7.bxc3 cxd4 8.cxd4 Bb4+ 9.Bd2 Bxd2+ 10.Qxd2 O-O 11.Bb5 *++[ECO "D41/32"]+[Variation "gambit dame refusé, défense semi-Tarrasch (avec e3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Be7 7.Bc4 cxd4 8.exd4 Nc6 9.O-O O-O 10.Re1 *++[ECO "D42"]+[Variation "gambit dame refusé, défense semi-Tarrasch (3...c5) (cf. B14, E54, D40, D32)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.e3 Nf6 5.Nf3 cxd4 6.exd4 Be7 7.cxd5 Nxd5 8.Bd3 Nc6 9.O-O O-O 10.Re1 Bf6 11.Be4 Nce7 12.Ne5 Nc6 13.Qd3 h6 *++[ECO "D42"]+[Variation "gambit dame refusé, défense semi-Tarrasch (3...c5) (cf. B14, E54, D40, D32)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 c5 4.e3 Nf6 5.Nf3 cxd4 6.exd4 Be7 7.cxd5 Nxd5 8.Bd3 Nc6 9.O-O O-O 10.Re1 Nf6 11.a3 b6 *++[ECO "D42"]+[Variation "gambit dame refusé, défense semi-Tarrasch (7.Fd3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c5 5.cxd5 Nxd5 6.e3 Nc6 7.Bd3 *++[ECO "D43"]+[Variation "gambit dame refusé, défense semi-slave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 *++[ECO "D43"]+[Variation "gambit dame refusé, défense semi-slave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.e3 *++[ECO "D43"]+[Variation "gambit dame refusé, défense semi-slave, variante d’Hastings"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 h6 6.Bxf6 Qxf6 7.Qb3 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave (5.Fg5 dxc4)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran, système Alatortsev"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 Nd5 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran, variante Lilienthal"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.g3 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran, variante Szabo"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.Qf3 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran (= système Botvinnik)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 *++[ECO "D44"]+[Variation "gambit dame refusé, défense semi-slave, variante Ekstrom"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.exf6 gxh4 10.Ne5 *++[ECO "D44/05"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran (4...dxc4)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 dxc4 5.e4 Bb4 6.Bg5 b5 7.a4 c6 8.e5 h6 9.exf6 hxg5 10.fxg7 Rg8 *++[ECO "D44/06"]+[Variation "gambit dame refusé, défense semi-slave, système Botvinnik (anti-variante Méran avec a4)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.Bg5 dxc4 6.e4 b5 7.a4 *++[ECO "D44/07"]+[Variation "gambit dame refusé, défense semi-slave, gambit anti-variante Méran, variante Denker"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 e6 5.Bg5 dxc4 6.e4 b5 7.e5 h6 8.Bh4 g5 9.Nxg5 hxg5 10.Bxg5 Nbd7 11.exf6 Bb7 12.g3 c5 13.d5 Qb6 14.Bg2 O-O-O 15.O-O b4 16.Na4 Qb5 17.a3 Nb8 18.axb4 cxb4 19.Qg4 Bxd5 20.Rfc1 *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave (5...Cd7)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave (5.e3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave, défense Stonewall"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Ne4 6.Bd3 f5 *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave, système Rubinstein (anti-variante Méran)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Ne5 *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave, variante Stoltz"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Qc2 Bd6 7.Be2 O-O 8.O-O *++[ECO "D45"]+[Variation "gambit dame refusé, défense semi-slave, variante variante Méran accélérée (= Alekhine)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 a6 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave (6.Fd3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave (avec Dc2, Fd3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.e3 e6 5.Nf3 Nbd7 6.Qc2 Bd6 7.Bd3 O-O 8.O-O dxc4 9.Bxc4 Qe7 10.h3 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave (sans Cc3)"]+[Result "*"]+1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.e3 e6 5.Nbd2 Nbd7 6.Bd3 Bd6 7.O-O O-O 8.e4 dxe4 9.Nxe4 Nxe4 10.Bxe4 h6 11.b3 Nf6 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave, défense Tchigorine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bd6 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave, variante Bogolioubof"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Be7 *++[ECO "D46"]+[Variation "gambit dame refusé, défense semi-slave, variante Romih"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 Bb4 *++[ECO "D47"]+[Variation "gambit dame refusé, défense semi-slave (7.Fc4)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 *++[ECO "D47"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 *++[ECO "D47"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Wade"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 Bb7 *++[ECO "D47"]+[Variation "gambit dame refusé, défense semi-slave, variante néo-Méran (= Lundin)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 b4 *++[ECO "D48"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran (8...a6)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 *++[ECO "D48"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, ancienne ligne principale"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 *++[ECO "D48"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Pirc"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 b4 *++[ECO "D48"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Reynold"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.d5 *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Blumenfeld"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Rabinovich"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Ng4 *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Rellstab"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.O-O Qd5 14.Qe2 Ba6 15.Bg5 *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Sozine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.O-O *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Sozine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 *++[ECO "D49"]+[Variation "gambit dame refusé, défense semi-slave, variante Méran, sous-variante Stahlberg"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Nf3 c6 5.e3 Nbd7 6.Bd3 dxc4 7.Bxc4 b5 8.Bd3 a6 9.e4 c5 10.e5 cxd4 11.Nxb5 Nxe5 12.Nxe5 axb5 13.Qf3 *++[ECO "D50"]+[Variation "gambit dame refusé (4.Fg5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 *++[ECO "D50"]+[Variation "gambit dame refusé, défense semi-Tarrasch"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 *++[ECO "D50"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante Krause"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Nxd4 e5 7.Ndb5 a6 8.Qa4 *++[ECO "D50"]+[Variation "gambit dame refusé, défense semi-Tarrasch, variante Pillsbury primitive"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.Nf3 cxd4 6.Qxd4 *++[ECO "D50"]+[Variation "gambit dame refusé, variante Been-Koomen"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 *++[ECO "D50"]+[Variation "gambit dame refusé, variante Canal (= de Venise)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 c5 5.cxd5 Qb6 *++[ECO "D51"]+[Variation "gambit dame refusé (4.Fg5 Cbd7)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 *++[ECO "D51"]+[Variation "gambit dame refusé (5...c6)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 *++[ECO "D51"]+[Variation "gambit dame refusé"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 *++[ECO "D51"]+[Variation "gambit dame refusé, variante Alekhine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 c6 6.e4 *++[ECO "D51"]+[Variation "gambit dame refusé, variante Capablanca (= anti-Cambridge Springs)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.a3 *++[ECO "D51"]+[Variation "gambit dame refusé, variante de Manhattan"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 Bb4 *++[ECO "D51"]+[Variation "gambit dame refusé, variante Rochlin"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.Nf3 c6 6.Rc1 Qa5 7.Bd2 *++[ECO "D52"]+[Variation "gambit dame refusé"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs (7.cxd5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.cxd5 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs, variante argentine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 O-O 9.Bh4 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs, variante Bogolioubof"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 Bb4 8.Qc2 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs, variante Capablanca"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Bxf6 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs, variante Rubinstein"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.Nd2 dxc4 *++[ECO "D52"]+[Variation "gambit dame refusé, défense Cambridge Springs, variante yougoslave"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Nbd7 5.e3 c6 6.Nf3 Qa5 7.cxd5 Nxd5 *++[ECO "D53"]+[Variation "gambit dame refusé (4.Fg5 Fe7 5.e3 O-O)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O *++[ECO "D53"]+[Variation "gambit dame refusé (4.Fg5 Fe7)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 *++[ECO "D53"]+[Variation "gambit dame refusé, variante Lasker"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 Ne4 *++[ECO "D54"]+[Variation "gambit dame refusé, variante anti-néo-orthodoxe"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Rc1 *++[ECO "D55"]+[Variation "gambit dame refusé (6.Cf3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 *++[ECO "D55"]+[Variation "gambit dame refusé, attaque Pillsbury"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 b6 7.Bd3 Bb7 8.cxd5 exd5 9.Ne5 *++[ECO "D55"]+[Variation "gambit dame refusé, variante néo-orthodoxe (7.Fh4)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 *++[ECO "D55"]+[Variation "gambit dame refusé, variante néo-orthodoxe (7.Fxf6)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 *++[ECO "D55"]+[Variation "gambit dame refusé, variante néo-orthodoxe"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 *++[ECO "D55"]+[Variation "gambit dame refusé, variante néo-orthodoxe accélérée (5.Fg5 h6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 d5 4.Nc3 Be7 5.Bg5 h6 6.Bxf6 Bxf6 7.Qb3 c6 8.e3 O-O *++[ECO "D55"]+[Variation "gambit dame refusé, variante Petrossian"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bxf6 Bxf6 8.Rc1 c6 9.Bd3 Nd7 10.O-O dxc4 11.Bxc4 *++[ECO "D56"]+[Variation "gambit dame refusé, défense Lasker"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 *++[ECO "D56"]+[Variation "gambit dame refusé, défense Lasker, variante russe"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Qc2 Nf6 10.Bd3 dxc4 11.Bxc4 c5 12.O-O Nc6 13.Rfd1 Bd7 *++[ECO "D56"]+[Variation "gambit dame refusé, défense Lasker, variante Teichmann"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.Qc2 *++[ECO "D57"]+[Variation "gambit dame refusé, défense Lasker, ligne principale"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 *++[ECO "D57"]+[Variation "gambit dame refusé, défense Lasker, variante Bernstein"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 Ne4 8.Bxe7 Qxe7 9.cxd5 Nxc3 10.bxc3 exd5 11.Qb3 Qd6 *++[ECO "D58"]+[Variation "gambit dame refusé, système Tartakover (= Makagonov - Bondarevsky)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 *++[ECO "D58/17"]+[Variation "gambit dame refusé, système Tartakover (= Nikolic - Vaganian)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.Be2 Bb7 9.Bxf6 Bxf6 10.cxd5 exd5 11.O-O Qe7 12.Qb3 Rd8 13.Rad1 *++[ECO "D58/23"]+[Variation "gambit dame refusé, système Tartakover (= Kasparov - Beliavsky)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.cxd5 exd5 5.Bg5 Be7 6.e3 h6 7.Bh4 O-O 8.Bd3 b6 9.Nf3 Bb7 10.O-O c5 *++[ECO "D59"]+[Variation "gambit dame refusé, système Tartakover (= Makagonov - Bondarevsky) (8.cd Cxd5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 *++[ECO "D59"]+[Variation "gambit dame refusé, système Tartakover"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 *++[ECO "D60"]+[Variation "gambit dame refusé, défense orthodoxe"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 *++[ECO "D60"]+[Variation "gambit dame refusé, défense orthodoxe, variante Botvinnik"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Bd3 *++[ECO "D60"]+[Variation "gambit dame refusé, défense orthodoxe, variante Rauser"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qb3 *++[ECO "D61"]+[Variation "gambit dame refusé, défense orthodoxe, Rubinstein variante"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 *++[ECO "D62"]+[Variation "gambit dame refusé, défense orthodoxe, Rubinstein variante"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Qc2 c5 8.cxd5 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe (7.Tc1)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Pillsbury"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 9.Bd3 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe, variante Capablanca"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 b6 8.cxd5 exd5 9.Bb5 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe, variante suisse (= Henneberger)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 *++[ECO "D63"]+[Variation "gambit dame refusé, défense orthodoxe, variante suisse, sous-variante de Karlsbad"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 a6 8.cxd5 *++[ECO "D64"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Rubinstein (avec Tc1)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 *++[ECO "D64"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Rubinstein, variante Grünfeld"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.a3 *++[ECO "D64"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Rubinstein, variante Karlsbad"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 *++[ECO "D64"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Rubinstein, variante Wolf"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 Ne4 *++[ECO "D65"]+[Variation "gambit dame refusé, défense orthodoxe, attaque Rubinstein, ligne principale"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Qc2 a6 9.cxd5 *++[ECO "D66"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 *++[ECO "D66"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3), variante fianchetto"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 b5 *++[ECO "D67"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 *++[ECO "D67"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3), variante Alekhine"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.Ne4 *++[ECO "D67"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3), variante Capablanca"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 *++[ECO "D67"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3), variante Janovski"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.h4 *++[ECO "D67"]+[Variation "gambit dame refusé, défense orthodoxe (avec Fd3, 11.O-O)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O *++[ECO "D68"]+[Variation "gambit dame refusé, défense orthodoxe, variante classique (13.Db1, Maroczy)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qb1 *++[ECO "D68"]+[Variation "gambit dame refusé, défense orthodoxe, variante classique (13.Dc2, Vidmar)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.Qc2 *++[ECO "D68"]+[Variation "gambit dame refusé, défense orthodoxe, variante classique"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 *++[ECO "D69"]+[Variation "gambit dame refusé, défense orthodoxe, variante classique (13.dxe5)"]+[Result "*"]+1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.e3 O-O 6.Nf3 Nbd7 7.Rc1 c6 8.Bd3 dxc4 9.Bxc4 Nd5 10.Bxe7 Qxe7 11.O-O Nxc3 12.Rxc3 e5 13.dxe5 Nxe5 14.Nxe5 Qxe5 *++[ECO "D70"]+[Variation "défense néo-Grünfeld (= Kemeri)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 *++[ECO "D70"]+[Variation "défense néo-Grünfeld"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.f3 d5 *++[ECO "D71"]+[Variation "défense néo-Grünfeld (5.cxd5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 *++[ECO "D72"]+[Variation "défense néo-Grünfeld (5.cxd5), ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.e4 Nb6 7.Ne2 *++[ECO "D73"]+[Variation "défense néo-Grünfeld (5.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 *++[ECO "D73"]+[Variation "défense néo-Grünfeld (avec ...Cb6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.cxd5 Nxd5 6.Nf3 Nb6 *++[ECO "D74"]+[Variation "défense néo-Grünfeld (6.cxd5 Cxd5 7.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O *++[ECO "D75"]+[Variation "défense néo-Grünfeld (7...c5 8.Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.Nc3 *++[ECO "D75"]+[Variation "défense néo-Grünfeld (7...c5 8.dxc5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O c5 8.dxc5 *++[ECO "D76"]+[Variation "défense néo-Grünfeld (6.cxd5 Cxd5 7.O-O Cb6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.cxd5 Nxd5 7.O-O Nb6 *++[ECO "D77"]+[Variation "défense néo-Grünfeld (6.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O *++[ECO "D78"]+[Variation "défense néo-Grünfeld (6.O-O c6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 *++[ECO "D78/01"]+[Variation "défense néo-Grünfeld (6.O-O c6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.Nc3 dxc4 *++[ECO "D79"]+[Variation "défense néo-Grünfeld (6.O-O), ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 d5 4.Bg2 Bg7 5.Nf3 O-O 6.O-O c6 7.cxd5 cxd5 *++[ECO "D79/02"]+[Variation "défense néo-Grünfeld (6.cxd5, Karpov)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 c6 5.Bg2 d5 6.cxd5 cxd5 7.Nc3 O-O 8.Ne5 e6 9.O-O Nfd7 10.f4 Nc6 11.Be3 Ndxe5 *++[ECO "D80"]+[Variation "défense Grünfeld"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 *++[ECO "D80"]+[Variation "défense Grünfeld, gambit Spike"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.g4 *++[ECO "D80"]+[Variation "défense Grünfeld, variante de Stockholm"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 *++[ECO "D80"]+[Variation "défense Grünfeld, variante Lundin"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bg5 Ne4 5.Nxe4 dxe4 6.Qd2 c5 *++[ECO "D81"]+[Variation "défense Grünfeld, variante russe"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Qb3 *++[ECO "D82"]+[Variation "défense Grünfeld, (4.Ff4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 *++[ECO "D83"]+[Variation "défense Grünfeld, gambit Grünfeld"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O *++[ECO "D83"]+[Variation "défense Grünfeld, gambit Grünfeld, variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 c5 7.dxc5 Be6 *++[ECO "D83"]+[Variation "défense Grünfeld, gambit Grünfeld, variante Capablanca"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 *++[ECO "D84"]+[Variation "défense Grünfeld, gambit Grünfeld accepté"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.cxd5 Nxd5 7.Nxd5 Qxd5 8.Bxc7 *++[ECO "D85"]+[Variation "défense Grünfeld, variante d’échange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 *++[ECO "D85"]+[Variation "défense Grünfeld, variante d’échange moderne"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Nf3 *++[ECO "D85/04"]+[Variation "défense Grünfeld, variante d’échange moderne (Fb5+) (cf. D86)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bb5+ c6 8.Ba4 b5 9.Bb3 b4 10.Be3 bxc3 11.Ne2 *++[ECO "D86"]+[Variation "défense Grünfeld, variante d’échange, sous-variante classique"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 *++[ECO "D86"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Larsen"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Qd7 9.O-O b6 *++[ECO "D86"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Simaguine améliorée"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 Nc6 *++[ECO "D86"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Simaguine réduite"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 b6 *++[ECO "D87"]+[Variation "défense Grünfeld, variante d’échange, sous-variante de Séville"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 Bg4 11.f3 Na5 12.Bxf7+ *++[ECO "D87"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Spassky"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 *++[ECO "D88"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Spassky, ligne principale (10...cxd4 11.cxd4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 *++[ECO "D89"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Sokolsky"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 14.d5 *++[ECO "D89"]+[Variation "défense Grünfeld, variante d’échange, sous-variante Spassky, ligne principale (13.Fd3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7 7.Bc4 O-O 8.Ne2 c5 9.O-O Nc6 10.Be3 cxd4 11.cxd4 Bg4 12.f3 Na5 13.Bd3 Be6 *++[ECO "D90"]+[Variation "défense Grünfeld, variante des trois cavaliers"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 *++[ECO "D90"]+[Variation "défense Grünfeld, variante des trois cavaliers"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 *++[ECO "D90"]+[Variation "défense Grünfeld, variante Flohr"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qa4+ *++[ECO "D90"]+[Variation "défense Grünfeld, variante Schlechter"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 c6 *++[ECO "D91"]+[Variation "défense Grünfeld (5.Fg5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bg5 *++[ECO "D92"]+[Variation "défense Grünfeld (5.Ff4 O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O *++[ECO "D93"]+[Variation "défense Grünfeld (avec ...c5, dxc5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 c5 6.dxc5 Qa5 7.Rc1 *++[ECO "D93"]+[Variation "défense Grünfeld (avec Db3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Qb3 c6 7.Nf3 Qa5 *++[ECO "D93"]+[Variation "défense Grünfeld (avec Ff4, e3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Bf4 O-O 6.e3 *++[ECO "D93"]+[Variation "défense Grünfeld (avec Ff4, e3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Bf4 Bg7 5.e3 O-O 6.Rc1 c6 7.Nf3 *++[ECO "D94"]+[Variation "défense Grünfeld (5.e3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 *++[ECO "D94"]+[Variation "défense Grünfeld, (avec e3 Fd3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 *++[ECO "D94"]+[Variation "défense Grünfeld, défense Flohr"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 c6 7.O-O Bf5 *++[ECO "D94"]+[Variation "défense Grünfeld, défense Smyslov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd3 c6 7.O-O Bg4 *++[ECO "D94"]+[Variation "défense Grünfeld, variante Makogonov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.b4 *++[ECO "D94"]+[Variation "défense Grünfeld, variante Opovcensky"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Bd2 *++[ECO "D94/16"]+[Variation "défense Grünfeld (5.e3 c6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 c6 6.Be2 O-O 7.O-O Be6 *++[ECO "D95"]+[Variation "défense Grünfeld (avec e3 & Db3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 *++[ECO "D95"]+[Variation "défense Grünfeld, variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 e6 *++[ECO "D95"]+[Variation "défense Grünfeld, variante Pachman"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.e3 O-O 6.Qb3 dxc4 7.Bxc4 Nbd7 8.Ng5 *++[ECO "D96"]+[Variation "défense Grünfeld, variante russe"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe (avec e4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe, sous-variante (= Simaguine)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Nc6 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe, sous-variante Alekhine (= hongroise)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 a6 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe, sous-variante Levenfish"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 b6 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe, sous-variante Prins"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Na6 *++[ECO "D97"]+[Variation "défense Grünfeld, variante russe, sous-variante Szabo (= Boleslavsky)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 c6 *++[ECO "D98"]+[Variation "défense Grünfeld, variante russe, sous-variante Kérès"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Be2 Nb6 10.Qd3 Nc6 11.O-O-O *++[ECO "D98"]+[Variation "défense Grünfeld, variante russe, sous-variante Smyslov (7...Fg4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 *++[ECO "D99"]+[Variation "défense Grünfeld, variante russe, sous-variante Smyslov, attaque yougoslave"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 c5 *++[ECO "D99"]+[Variation "défense Grünfeld, variante russe, sous-variante Smyslov, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3 Bg7 5.Qb3 dxc4 6.Qxc4 O-O 7.e4 Bg4 8.Be3 Nfd7 9.Qb3 *++[ECO "E00"]+[Variation "attaque néo-indienne (= Seirawan)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Bg5 *++[ECO "E00"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 2.c4 e6 *++[ECO "E00"]+[Variation "ouverture catalane (3.g3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Bb4+ 5.Bd2 *++[ECO "E00"]+[Variation "ouverture catalane"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 c6 5.Bg2 Bb4+ 6.Bd2 Be7 *++[ECO "E00"]+[Variation "ouverture catalane"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Qe7 *++[ECO "E00"]+[Variation "ouverture catalane, variante Lobron - Morozevich"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Bb4+ 5.Bd2 c5 *++[ECO "E01"]+[Variation "ouverture catalane fermée (4.Fg2)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c5 5.Nf3 cxd4 6.O-O *++[ECO "E01"]+[Variation "ouverture catalane fermée (4.Fg2)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 c5 5.Nf3 cxd4 6.O-O Be7 7.Nxd4 O-O 8.cxd5 Nxd5 *++[ECO "E02"]+[Variation "ouverture catalane ouverte (5.Da4+)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Nf3 a6 7.Nc3 *++[ECO "E02"]+[Variation "ouverture catalane ouverte (5.Da4+)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Bd7 *++[ECO "E03"]+[Variation "ouverture catalane ouverte (5.Da4+ Cbd7 6.Dxc4)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 *++[ECO "E03"]+[Variation "ouverture catalane ouverte, variante Alekhine"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Qa4+ Nbd7 6.Qxc4 a6 7.Qc2 *++[ECO "E03/02"]+[Variation "ouverture catalane ouverte, variante Alekhine (ligne anglaise)"]+[Result "*"]+1.c4 e6 2.g3 d5 3.Bg2 Nf6 4.Nf3 dxc4 5.Qa4+ Nbd7 6.Qxc4 c5 7.d4 a6 8.Qc2 cxd4 *++[ECO "E04"]+[Variation "ouverture catalane ouverte (5.Cf3 c5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 c5 6.O-O Nc6 *++[ECO "E04"]+[Variation "ouverture catalane ouverte (5.Cf3 Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Nc6 *++[ECO "E04"]+[Variation "ouverture catalane ouverte (5.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 *++[ECO "E05"]+[Variation "ouverture catalane ouverte, ligne classique (5...Fe7)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 dxc4 5.Nf3 Be7 6.O-O O-O *++[ECO "E05"]+[Variation "ouverture catalane ouverte, ligne classique"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O dxc4 7.Qc2 *++[ECO "E05/03"]+[Variation "ouverture catalane ouverte (avec Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 Be7 5.Bg2 O-O 6.Nc3 dxc4 7.O-O *++[ECO "E06"]+[Variation "ouverture catalane fermée (5.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O *++[ECO "E06/04"]+[Variation "ouverture catalane fermée"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O c6 7.Qc2 b6 *++[ECO "E07"]+[Variation "ouverture catalane fermée (6...Cbd7)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 *++[ECO "E07"]+[Variation "ouverture catalane fermée, variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Nc3 c6 8.Qd3 *++[ECO "E08"]+[Variation "ouverture catalane fermée (7.Dc2)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 *++[ECO "E08"]+[Variation "ouverture catalane fermée (avec Dc2 & b3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 *++[ECO "E08"]+[Variation "ouverture catalane fermée, variante Zagoryansky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Rd1 b6 9.a4 *++[ECO "E08/01"]+[Variation "ouverture catalane fermée, ligne moderne (Fb4+)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Be7 5.Bg2 d5 6.Nf3 O-O 7.O-O c6 8.Qc2 b6 9.Bf4 Bb7 10.Nbd2 Nbd7 *++[ECO "E08/07"]+[Variation "ouverture catalane fermée, gambit Spassky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.b3 b6 9.Rd1 Bb7 10.Nc3 b5 *++[ECO "E09"]+[Variation "ouverture catalane fermée, ligne moderne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Nf3 c6 5.Bg2 Bb4+ 6.Bd2 Be7 7.Qc2 O-O 8.O-O Nbd7 9.Bf4 Nh5 10.Bc1 Nhf6 11.Nbd2 b6 *++[ECO "E09"]+[Variation "ouverture catalane fermée, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 *++[ECO "E09"]+[Variation "ouverture catalane fermée, variante Sokolsky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 d5 4.Bg2 Be7 5.Nf3 O-O 6.O-O Nbd7 7.Qc2 c6 8.Nbd2 b6 9.b3 a5 10.Bb2 Ba6 *++[ECO "E10"]+[Variation "contre-gambit Blumenfeld"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 *++[ECO "E10"]+[Variation "contre-gambit Blumenfeld accepté"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.dxe6 fxe6 6.cxb5 d5 *++[ECO "E10"]+[Variation "contre-gambit Blumenfeld, variante Dus - Chotimursky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 *++[ECO "E10"]+[Variation "contre-gambit Blumenfeld, variante Spielmann"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 b5 5.Bg5 exd5 6.cxd5 h6 *++[ECO "E10"]+[Variation "début du pion dame"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 *++[ECO "E10"]+[Variation "défense Döry"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Ne4 *++[ECO "E10"]+[Variation "défense Dzindzihashvili"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 a6 *++[ECO "E11"]+[Variation "défense Bogo-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ *++[ECO "E11"]+[Variation "défense Bogo-indienne, piège de Monticelli"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Bxd2+ 5.Qxd2 b6 6.g3 Bb7 7.Bg2 O-O 8.Nc3 Ne4 9.Qc2 Nxc3 10.Ng5 *++[ECO "E11"]+[Variation "défense Bogo-indienne, variante Grünfeld"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Nbd2 *++[ECO "E11"]+[Variation "défense Bogo-indienne, variante Nimzovitch (5.g3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Qe7 5.g3 *++[ECO "E11/36"]+[Variation "défense Bogo-indienne (retraite ...Fe7), ligne Kasparov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+ 4.Bd2 Be7 5.g3 d5 6.Bg2 O-O 7.O-O c6 *++[ECO "E11/36"]+[Variation "défense Bogo-indienne (retraite ...Fe7), ligne Kasparov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.g3 Bb4+ 4.Bd2 Be7 5.Bg2 d5 6.Nf3 O-O 7.O-O c6 8.Qc2 b6 9.b3 Nbd7 *++[ECO "E12"]+[Variation "défense ouest-indienne (4.Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 *++[ECO "E12"]+[Variation "défense ouest-indienne (4.Cc3), variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 g5 7.Bg3 Nh5 *++[ECO "E12"]+[Variation "défense ouest-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 *++[ECO "E12"]+[Variation "défense ouest-indienne, système Petrossian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3 *++[ECO "E12"]+[Variation "défense ouest-indienne, variante Miles"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Bf4 *++[ECO "E12/23"]+[Variation "défense ouest-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.a3 *++[ECO "E13"]+[Variation "défense ouest-indienne, ligne principale (7.e3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb7 5.Bg5 h6 6.Bh4 Bb4 7.e3 *++[ECO "E14"]+[Variation "défense ouest-indienne (4.e3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 *++[ECO "E14"]+[Variation "défense ouest-indienne, variante Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.Nxd4 *++[ECO "E14/03"]+[Variation "défense ouest-indienne (avec e3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 Bb4+ 6.Nbd2 *++[ECO "E14/07"]+[Variation "défense ouest-indienne, variante Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4 d5 10.Nbd2 Nc6 11.Rc1 Rc8 12.Qe2 Re8 13.Rfd1 Bf8 14.Qe3 g6 15.h3 *++[ECO "E14/07"]+[Variation "défense ouest-indienne, variante Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.e3 Bb7 5.Bd3 c5 6.O-O Be7 7.b3 O-O 8.Bb2 cxd4 9.exd4 d5 10.Qe2 *++[ECO "E14/07"]+[Variation "défense ouest-indienne, variante Averbakh moderne"]+[Result "*"]+1.Nf3 Nf6 2.d4 e6 3.e3 b6 4.Bd3 Bb7 5.O-O Be7 6.c4 O-O 7.b3 c5 8.Bb2 cxd4 9.exd4 d5 10.Qe2 *++[ECO "E15"]+[Variation "défense ouest-indienne (4.g3 Fb7)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 *++[ECO "E15"]+[Variation "défense ouest-indienne, 4.g3"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 *++[ECO "E15"]+[Variation "défense ouest-indienne, variante Bürger"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 c5 6.d5 exd5 7.Ng5 *++[ECO "E15"]+[Variation "défense ouest-indienne, variante Nimzovitch (= fianchetto exagéré)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 *++[ECO "E15"]+[Variation "défense ouest-indienne, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 c5 6.d5 exd5 7.Nh4 *++[ECO "E15/25"]+[Variation "défense ouest-indienne, variante Vaganian"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6 5.b3 Bb4+ 6.Bd2 Be7 7.Bg2 c6 8.O-O d5 9.Qc2 *++[ECO "E16"]+[Variation "défense ouest-indienne, variante Capablanca (5...Fb4+)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Nbd2 *++[ECO "E16"]+[Variation "défense ouest-indienne, variante Riumin"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 Be7 *++[ECO "E16"]+[Variation "défense ouest-indienne, variante Yates"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Bb4+ 6.Bd2 a5 *++[ECO "E17"]+[Variation "défense ouest-indienne (5.Fg2 Fe7)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 *++[ECO "E17"]+[Variation "défense ouest-indienne, système anti-défense ouest-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 *++[ECO "E17"]+[Variation "défense ouest-indienne, variante Euwe"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.b3 *++[ECO "E17"]+[Variation "défense ouest-indienne, variante Opovcensky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.Nc3 Ne4 7.Bd2 *++[ECO "E18"]+[Variation "défense ouest-indienne, ancienne ligne principale (7.Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 *++[ECO "E18/02"]+[Variation "défense ouest-indienne, ancienne ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 d5 8.cxd5 exd5 *++[ECO "E19"]+[Variation "défense ouest-indienne, ancienne ligne principale (9.Dxc3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Bb7 5.Bg2 Be7 6.O-O O-O 7.Nc3 Ne4 8.Qc2 Nxc3 9.Qxc3 *++[ECO "E20"]+[Variation "défense Nimzo-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 *++[ECO "E20"]+[Variation "défense Nimzo-indienne, attaque Mikenas"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qd3 *++[ECO "E20"]+[Variation "défense Nimzo-indienne, système Romanichine - Kasparov (= Steiner)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 *++[ECO "E20"]+[Variation "défense Nimzo-indienne, variante Kmoch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.f3 *++[ECO "E20/05"]+[Variation "défense Nimzo-indienne, système Kasparov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.g3 Nc6 6.Bg2 Ne4 7.Bd2 Bxc3 8.bxc3 O-O 9.O-O Na5 *++[ECO "E20/10"]+[Variation "défense Nimzo- indienne, système Romanichine - Kasparov (= Steiner)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.g3 c5 5.Nf3 cxd4 6.Nxd4 Ne4 *++[ECO "E21"]+[Variation "défense Nimzo- indienne, variante des trois cavaliers"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 *++[ECO "E21"]+[Variation "défense Nimzo- indienne, variante des trois cavaliers, sous-variante Euwe"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.d5 Ne4 *++[ECO "E21"]+[Variation "défense Nimzo- indienne, variante des trois cavaliers, sous-variante Kortchnoï"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.d5 *++[ECO "E21"]+[Variation "défense Nimzo-indienne, variante des trois cavaliers (avec ...b6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.Nc3 Bb4 *++[ECO "E22"]+[Variation "défense Nimzo-indienne, variante Spielmann (4.Db3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Bxc5 6.Nf3 *++[ECO "E23"]+[Variation "défense Nimzo-indienne, variante Spielmann (4...c5 5.dxc5 Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 *++[ECO "E23"]+[Variation "défense Nimzo-indienne, variante Spielmann, sous-variante de Karlsbad"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxd2 *++[ECO "E23"]+[Variation "défense Nimzo-indienne, variante Spielmann, sous-variante de San Remo"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxc5 *++[ECO "E23"]+[Variation "défense Nimzo-indienne, variante Spielmann, sous-variante Stahlberg"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qb3 c5 5.dxc5 Nc6 6.Nf3 Ne4 7.Bd2 Nxc5 8.Qc2 f5 9.g3 *++[ECO "E24"]+[Variation "défense Nimzo-indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 *++[ECO "E24"]+[Variation "défense Nimzo-indienne, variante Sämisch, sous-variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.e3 O-O 8.cxd5 Nxd5 *++[ECO "E25"]+[Variation "défense Nimzo- indienne, variante Sämisch, sous-variante Romanovsky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 f5 *++[ECO "E25"]+[Variation "défense Nimzo-indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 *++[ECO "E25"]+[Variation "défense Nimzo-indienne, variante Sämisch, sous-variante Kérès"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.f3 d5 7.cxd5 Nxd5 8.dxc5 *++[ECO "E26"]+[Variation "défense Nimzo- indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 *++[ECO "E26"]+[Variation "défense Nimzo- indienne, variante Sämisch, sous-variante O'Kelly"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 c5 6.e3 b6 *++[ECO "E27"]+[Variation "défense Nimzo- indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O *++[ECO "E28"]+[Variation "défense Nimzo- indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 *++[ECO "E29"]+[Variation "défense Nimzo- indienne, variante Sämisch, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 *++[ECO "E29"]+[Variation "défense Nimzo- indienne, variante Sämisch, sous-variante Capablanca"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.a3 Bxc3+ 5.bxc3 O-O 6.e3 c5 7.Bd3 Nc6 8.Ne2 b6 9.e4 Ne8 *++[ECO "E30"]+[Variation "défense Nimzo-indienne, variante de Leningrad (ext fm 4.Fg5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 *++[ECO "E30"]+[Variation "défense Nimzo-indienne, variante de Leningrad (gambit ...b5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 b5 *++[ECO "E31"]+[Variation "défense Nimzo- indienne, variante de Leningrad, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Bg5 h6 5.Bh4 c5 6.d5 d6 *++[ECO "E32"]+[Variation "défense Nimzo- indienne, variante classique, gambit Adorjan"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3 b5 *++[ECO "E32"]+[Variation "défense Nimzo-indienne, variante classique"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 *++[ECO "E33"]+[Variation "défense Nimzo- indienne, variante classique (4...Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 *++[ECO "E33"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Milner-Barry (= de Zürich)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 Nc6 5.Nf3 d6 *++[ECO "E34"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Noa"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 *++[ECO "E35"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Noa (5.cd ed)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.cxd5 exd5 *++[ECO "E36"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Nc6 *++[ECO "E36"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Noa (5.a3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 *++[ECO "E36"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Noa, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 *++[ECO "E37"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante de San Remo"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 Nc6 8.e3 e5 *++[ECO "E37"]+[Variation "défense Nimzo- indienne, variante classique, sous-variante Noa, ligne principale (7.Dc2)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 d5 5.a3 Bxc3+ 6.Qxc3 Ne4 7.Qc2 c5 *++[ECO "E38"]+[Variation "défense Nimzo- indienne, variante classique (4...c5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 *++[ECO "E38/02"]+[Variation "défense Nimzo- indienne, variante classique (4...c5/5...Ca6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 Na6 6.a3 Bxc3+ 7.Qxc3 Nxc5 8.b4 Nce4 9.Qd4 d5 10.c5 *++[ECO "E39"]+[Variation "défense Nimzo- indienne, variante classique, variante Pirc"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O *++[ECO "E39/12"]+[Variation "défense Nimzo- indienne, variante classique (sans a3, cf. E32)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 c5 5.dxc5 O-O 6.Nf3 Na6 7.g3 Nxc5 8.Bg2 Nce4 9.O-O Nxc3 10.bxc3 Be7 11.e4 d6 12.e5 dxe5 13.Nxe5 Qc7 *++[ECO "E40"]+[Variation "défense Nimzo- indienne, variante Rubinstein, sous-variante Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 Nc6 *++[ECO "E40"]+[Variation "défense Nimzo-indienne, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 *++[ECO "E41"]+[Variation "défense Nimzo- indienne, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 *++[ECO "E41"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Hübner"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Bd3 Nc6 6.Nf3 Bxc3+ 7.bxc3 d6 *++[ECO "E42"]+[Variation "défense Nimzo-indienne, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 c5 5.Nge2 *++[ECO "E43"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Fischer"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 *++[ECO "E44"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Fischer (5.Ce2)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nge2 *++[ECO "E45"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Bronstein (= Byrne)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 b6 5.Nge2 Ba6 *++[ECO "E46"]+[Variation "défense Nimzo-indienne, variante Rubinstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O *++[ECO "E46"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Reshevsky"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nge2 *++[ECO "E46"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Simaguine"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nge2 d5 6.a3 Bd6 *++[ECO "E47"]+[Variation "défense Nimzo-indienne, variante Rubinstein (4.e3 O-O 5.Fd3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 *++[ECO "E48"]+[Variation "défense Nimzo-indienne, variante Rubinstein (4.e3 O-O 5.Fd3 d5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 *++[ECO "E49"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Botvinnik"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Bd3 d5 6.a3 Bxc3+ 7.bxc3 *++[ECO "E50"]+[Variation "défense Nimzo-indienne, variante Rubinstein (4.e3 O-O, 5.Cf3, sans ...d5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 *++[ECO "E51"]+[Variation "défense Nimzo-indienne, variante Rubinstein (4.e3 O-O 5.Cf3 d5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 *++[ECO "E51"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Ragozine"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 Nc6 7.O-O dxc4 *++[ECO "E52"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale (avec ...b6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 b6 *++[ECO "E52/02"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne moderne"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 b6 6.Bd3 Bb7 7.O-O d5 8.a3 Bd6 9.cxd5 *++[ECO "E52/13"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Bondarevski"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 b6 6.Bd2 Bb7 7.Bd3 d5 8.cxd5 exd5 *++[ECO "E53"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale (avec ...c5)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 *++[ECO "E53"]+[Variation "défense Nimzo-indienne, variante Rubinstein, sous-variante Kérès"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O b6 *++[ECO "E53"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Gligoric (avec 7...Cbd7)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nbd7 *++[ECO "E54"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Gligoric, sous-variante Smyslov"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Qe7 *++[ECO "E54/03"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Gligoric (avec 7...dxc4)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 cxd4 9.exd4 *++[ECO "E54/03"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Gligoric (avec 7...dxc4), ligne fantôme"]+[Result "*"]+1.c4 c6 2.e4 d5 3.exd5 cxd5 4.d4 Nf6 5.Nc3 e6 6.Nf3 Bb4 7.Bd3 dxc4 8.Bxc4 O-O 9.O-O *++[ECO "E55"]+[Variation "défense Nimzo-indienne, variante Rubinstein, système Gligoric, sous-variante Bronstein"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O dxc4 8.Bxc4 Nbd7 *++[ECO "E56"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale (avec 7...Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 *++[ECO "E57"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale (avec 8...dxc4 & 9...cxd4)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 dxc4 9.Bxc4 cxd4 *++[ECO "E58"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale (avec 8...Fxc3)"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 *++[ECO "E59"]+[Variation "défense Nimzo-indienne, variante Rubinstein, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O 5.Nf3 d5 6.Bd3 c5 7.O-O Nc6 8.a3 Bxc3 9.bxc3 dxc4 10.Bxc4 *++[ECO "E60"]+[Variation "attaque Mengarini"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Qc2 *++[ECO "E60"]+[Variation "Défense est-indienne (3.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 *++[ECO "E60"]+[Variation "Défense est-indienne (3.g3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 *++[ECO "E60"]+[Variation "Défense est-indienne (3.g3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.g3 Bg7 4.Bg2 d5 *++[ECO "E60"]+[Variation "Défense est-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 g6 *++[ECO "E60"]+[Variation "Défense est-indienne, gambit du Danube"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.d5 b5 *++[ECO "E60"]+[Variation "Défense est-indienne, variante anti-Grünfeld"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.d5 *++[ECO "E60"]+[Variation "Défense est-indienne, variante fianchetto roi"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O *++[ECO "E60/04"]+[Variation "Défense est-indienne, attaque Nimzovitch - Larsen"]+[Result "*"]+1.Nf3 Nf6 2.b3 g6 3.Bb2 Bg7 4.e3 O-O 5.Be2 d6 6.d4 Nbd7 7.c4 e5 *++[ECO "E60/10"]+[Variation "Défense est-indienne, variante fianchetto roi, système yougoslave"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O c5 7.dxc5 dxc5 *++[ECO "E61"]+[Variation "Défense est-indienne (3.Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 *++[ECO "E61"]+[Variation "Défense est-indienne (3.Cc3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.g3 *++[ECO "E61"]+[Variation "Défense est-indienne (avec Ff4)"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.c4 Bg7 4.Nc3 O-O 5.Bf4 d6 6.h3 c5 *++[ECO "E61"]+[Variation "Défense est-indienne, système Smyslov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.Bg5 *++[ECO "E61"]+[Variation "Défense est-indienne, système Smyslov"]+[Result "*"]+1.d4 Nf6 2.Nf3 g6 3.c4 Bg7 4.Nc3 O-O 5.Bg5 c5 6.e3 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi (avec ...Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante Kavalek (= Bronstein)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Qa5 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante Simaguine réduite (= Spassky)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bf5 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante Simaguine"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O Bg4 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante Uhlmann (= Szabo)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O e5 *++[ECO "E62"]+[Variation "Défense est-indienne, variante fianchetto roi, système Larsen"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c6 7.O-O Bf5 *++[ECO "E63"]+[Variation "Défense est-indienne, variante fianchetto roi, système Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nc6 7.O-O a6 *++[ECO "E63"]+[Variation "Défense est-indienne, variante fianchetto roi, système Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nf3 Bg7 4.g3 O-O 5.Bg2 d6 6.O-O Nc6 7.Nc3 a6 8.d5 *++[ECO "E64"]+[Variation "Défense est-indienne, variante fianchetto roi, système yougoslave"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 *++[ECO "E65"]+[Variation "Défense est-indienne, variante fianchetto roi, système yougoslave (7.O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O *++[ECO "E66"]+[Variation "Défense est-indienne, variante fianchetto roi, système yougoslave - Panno"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 c5 7.O-O Nc6 8.d5 Na5 9.Nd2 a6 10.Qc2 Rb8 11.b3 b5 *++[ECO "E67"]+[Variation "Défense est-indienne, variante fianchetto roi (avec ...Cd7)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 *++[ECO "E67"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante classique"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 *++[ECO "E68"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante classique (8.e4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 *++[ECO "E69"]+[Variation "Défense est-indienne, variante fianchetto roi, sous-variante classique, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.Nf3 d6 5.g3 O-O 6.Bg2 Nbd7 7.O-O e5 8.e4 c6 9.h3 *++[ECO "E70"]+[Variation "Défense est-indienne"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 *++[ECO "E70"]+[Variation "Défense est-indienne, système Averbakh accéléré"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Bg5 *++[ECO "E70"]+[Variation "Défense est-indienne, système Kramer"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 *++[ECO "E70/01"]+[Variation "Défense est-indienne, formation Benoni (cf. A65-67)"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 Bg7 5.e4 h6 *++[ECO "E71"]+[Variation "Défense est-indienne, système Makagonov (5.h3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.h3 O-O 6.Bg5 c5 *++[ECO "E72"]+[Variation "Défense est-indienne (avec e4 & g3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 *++[ECO "E72"]+[Variation "Défense est-indienne, système Pomar"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.g3 O-O 6.Bg2 e5 7.Nge2 *++[ECO "E73"]+[Variation "Défense est-indienne (5.Fe2)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 *++[ECO "E73"]+[Variation "Défense est-indienne, système Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 *++[ECO "E73"]+[Variation "Défense est-indienne, système semi-Averbakh"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Be3 *++[ECO "E74"]+[Variation "Défense est-indienne, système Averbakh (6...c5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 *++[ECO "E75"]+[Variation "Défense est-indienne, système Averbakh, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Bg5 c5 7.d5 e6 *++[ECO "E76"]+[Variation "Défense est-indienne, attaque des quatre pions"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 Bg4 *++[ECO "E76/01"]+[Variation "Défense est-indienne, attaque des quatre pions"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 6.dxc5 Qa5 7.Bd3 Qxc5 8.Nf3 Nc6 9.Qe2 Bg4 10.Be3 Qa5 11.O-O Nd7 *++[ECO "E76/07"]+[Variation "Défense est-indienne, attaque des quatre pions, variante d’échange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 6.dxc5 Qa5 7.Bd3 Qxc5 8.Qe2 Bg4 9.Nf3 Nc6 10.Be3 Qa5 11.O-O Nd7 *++[ECO "E76/08"]+[Variation "Défense est-indienne, attaque des quatre pions, formation Benoni (cf. A65-67)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 a6 8.a4 *++[ECO "E76/09"]+[Variation "Défense est-indienne, attaque des quatre pions, formation Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 c5 6.d5 O-O 7.Nf3 e6 8.dxe6 Bxe6 9.Bd3 Bg4 10.O-O Nc6 11.Qe1 *++[ECO "E76/10"]+[Variation "Défense est-indienne, attaque des quatre pions, formation Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Nf3 c5 7.d5 e6 8.dxe6 Bxe6 9.Bd3 Nc6 10.f5 Bd7 11.O-O Re8 *++[ECO "E77"]+[Variation "Défense est-indienne, attaque des quatre pions (6.Fe2)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 *++[ECO "E77"]+[Variation "Défense est-indienne, attaque des quatre pions"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.Nf3 *++[ECO "E77"]+[Variation "Défense est-indienne, attaque des quatre pions, gambit florentin"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.Nf3 exd5 9.e5 *++[ECO "E77"]+[Variation "Défense est-indienne, attaque des six pions"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.d5 e6 8.dxe6 fxe6 9.g4 Nc6 10.h4 *++[ECO "E78"]+[Variation "Défense est-indienne, attaque des quatre pions (avec Fe2 & Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 *++[ECO "E79"]+[Variation "Défense est-indienne, attaque des quatre pions, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f4 O-O 6.Be2 c5 7.Nf3 cxd4 8.Nxd4 Nc6 9.Be3 *++[ECO "E80"]+[Variation "Défense est-indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (5...O-O)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (6...Ca6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Na6 7.Qd2 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (6...Cfd7)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nfd7 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (6.Fg5 7...Ca6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 Na6 8.Qd2 Nc7 9.Bd3 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (6.Fg5 7...Cbd7)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 Nbd7 8.Qd2 Re8 9.Nge2 a6 10.Bh6 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (6.Fg5 7...Da5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 Qa5 8.Qd2 e6 9.a4 a6 10.Ra3 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch (avec ...c5, cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.d5 e6 8.Nge2 exd5 9.cxd5 Nbd7 10.Ng3 a6 11.a4 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni (avec d5, ...a6, cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.d5 a6 8.a4 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni (avec d5, ...Cbd7, cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nbd7 8.Nh3 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni, sous-variante d’échange"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c5 7.dxc5 *++[ECO "E81"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante Byrne"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 c6 7.Bd3 a6 *++[ECO "E81/01"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni"]+[Result "*"]+1.d4 Nf6 2.c4 c5 3.d5 g6 4.Nc3 Bg7 5.e4 d6 6.f3 O-O 7.Bg5 h6 *++[ECO "E81/02"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni (cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 a6 *++[ECO "E81/03"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni, sous-variante Kremenecki (cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Qd2 exd5 9.Nxd5 Be6 10.Ne2 Bxd5 11.cxd5 Nbd7 12.Nc3 a6 13.Be2 *++[ECO "E81/03"]+[Variation "Défense est-indienne, variante Sämisch, formation Benoni, sous-variante Petrossian (cf. A65)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Bg5 c5 7.d5 e6 8.Nge2 h6 9.Be3 exd5 10.cxd5 Nbd7 11.Ng3 a6 12.a4 h5 13.Be2 h4 14.Nf1 Nh7 *++[ECO "E81/04"]+[Variation "Défense est-indienne, variante Sämisch"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O 6.f3 e5 7.Bg5 c6 8.Qd2 *++[ECO "E81/11"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante commune"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nbd7 7.Qd2 c5 8.Nge2 a6 9.O-O-O Qa5 10.Kb1 b5 11.dxc5 dxc5 12.Nd5 Nxd5 *++[ECO "E81/12"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante Sax"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 a6 7.Qd2 b6 8.O-O-O c5 9.dxc5 bxc5 10.e5 Ne8 *++[ECO "E82"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante double fianchetto"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 b6 *++[ECO "E83"]+[Variation "Défense est-indienne, variante Sämisch (6...Cc6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 *++[ECO "E83"]+[Variation "Défense est-indienne, variante Sämisch, formation Panno (7...a6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 *++[ECO "E83"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante Zaitsev"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 Rb8 *++[ECO "E84"]+[Variation "Défense est-indienne, variante Sämisch, formation Panno, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 Nc6 7.Nge2 a6 8.Qd2 Rb8 *++[ECO "E85"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 *++[ECO "E86"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe (7.Cge2 c6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.d5 cxd5 10.cxd5 *++[ECO "E87"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe (7.d5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 *++[ECO "E87"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe, ligne Bronstein"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 Nh5 8.Qd2 Qh4+ 9.g3 Nxg3 10.Qf2 Nxf1 11.Qxh4 Nxe3 12.Ke2 Nxc4 *++[ECO "E88"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe (7.d5 c6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 *++[ECO "E89"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.d5 c6 8.Nge2 cxd5 *++[ECO "E89/05"]+[Variation "Défense est-indienne, variante Sämisch, sous-variante orthodoxe, ligne Karpov-Topalov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3 e5 7.Nge2 c6 8.Qd2 Nbd7 9.d5 cxd5 10.cxd5 a6 11.g4 h5 12.g5 Nh7 13.Rg1 *++[ECO "E90"]+[Variation "Défense est-indienne (5.Cf3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 *++[ECO "E90"]+[Variation "Défense est-indienne, variante Larsen"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be3 *++[ECO "E90"]+[Variation "Défense est-indienne, variante Zinnowitz"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Bg5 *++[ECO "E90/22"]+[Variation "Défense est-indienne, variante Kluger"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.h3 c5 7.d5 e6 8.Bd3 *++[ECO "E91"]+[Variation "Défense est-indienne (6.Fe2)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 *++[ECO "E91"]+[Variation "Défense est-indienne (6.Fe2)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 c5 7.d5 e6 *++[ECO "E91"]+[Variation "Défense est-indienne, variante kazakh"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 Na6 *++[ECO "E92"]+[Variation "Défense est-indienne, système Gligoric-Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.Be3 *++[ECO "E92"]+[Variation "Défense est-indienne, système Petrossian"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 *++[ECO "E92"]+[Variation "Défense est-indienne, système Petrossian, variante Stein"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 a5 *++[ECO "E92"]+[Variation "Défense est-indienne, variante Andersson"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.dxe5 *++[ECO "E92"]+[Variation "Défense est-indienne, variante classsique"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 *++[ECO "E93"]+[Variation "Défense est-indienne, système Petrossian, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 *++[ECO "E93"]+[Variation "Défense est-indienne, système Petrossian, variante Kérès"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.Bg5 h6 9.Bh4 g5 10.Bg3 Nh5 11.h4 *++[ECO "E94"]+[Variation "Défense est-indienne, système orthodoxe (7...Cbd7)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 c6 9.d5 c5 10.Ne1 Ne8 *++[ECO "E94"]+[Variation "Défense est-indienne, système orthodoxe"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O *++[ECO "E94"]+[Variation "Défense est-indienne, système orthodoxe, variante Donner"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O c6 *++[ECO "E94/04"]+[Variation "Défense est-indienne, système orthodoxe (7...exd4)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O exd4 8.Nxd4 Re8 9.f3 c6 10.Be3 *++[ECO "E94/08"]+[Variation "Défense est-indienne, système orthodoxe (7...Ca6)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 *++[ECO "E94/08"]+[Variation "Défense est-indienne, système orthodoxe, variante Bonsch - Gourevitch"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Be3 Ng4 9.Bg5 Qe8 10.dxe5 dxe5 11.h3 h6 12.Bd2 Nf6 13.Be3 Nh5 14.c5 Nf4 15.Bb5 Qe6 16.Re1 *++[ECO "E94/09"]+[Variation "Défense est-indienne, système orthodoxe (8.Te1)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Na6 8.Re1 c6 9.Bf1 *++[ECO "E94/26"]+[Variation "Défense est-indienne, système orthodoxe, variante Gelfand"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Be3 c6 9.d5 c5 10.Ne1 Ne8 11.g4 *++[ECO "E94/27"]+[Variation "Défense est-indienne, système orthodoxe (7.d5)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.d5 Nbd7 8.O-O Nc5 9.Qc2 a5 10.Ne1 *++[ECO "E95"]+[Variation "Défense est-indienne, système orthodoxe (7...Cbd7 8.Te1)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 *++[ECO "E96"]+[Variation "Défense est-indienne, système orthodoxe (7...Cbd7), ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nbd7 8.Re1 c6 9.Bf1 a5 *++[ECO "E97"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 *++[ECO "E97"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov, attaque à la bayonette"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.b4 *++[ECO "E97/02"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.Be3 Ng4 9.Bg5 f6 10.Bc1 *++[ECO "E97/28"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov (avec 9.Cd2)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Nd2 a5 10.a3 Nd7 11.Rb1 f5 12.b4 Kh8 13.f3 Ng8 14.Qc2 Ngf6 15.Nb5 axb4 16.axb4 Nh5 17.g3 Ndf6 *++[ECO "E98"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov (9.Ce1)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 *++[ECO "E99"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov, attaque Benkö"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.g4 *++[ECO "E99"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov, ligne principale (Fe3>Cd3)"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.f3 f5 11.Nd3 *++[ECO "E99/03"]+[Variation "Défense est-indienne, système orthodoxe, variante Aronine - Taimanov, ligne principale"]+[Result "*"]+1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Nf3 e5 7.O-O Nc6 8.d5 Ne7 9.Ne1 Nd7 10.Be3 f5 11.f3 f4 12.Bf2 g5 13.a4 Ng6 *+
+ src-exe/BishBosh/Concurrent/Pondering.hs view
@@ -0,0 +1,85 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Implements <https://chessprogramming.wikispaces.com/Pondering> by an automatic player during a manual player's move.++	* Using the last move one can predict the opponent's response, & consequently one's counter-move.+	If the opponent makes the expected response, then this speculative result can be used,+	otherwise pondering is terminated & the effort wasted, but not the time, since the pondering occurred during the opponent's move.+-}++module BishBosh.Concurrent.Pondering(+-- * Types+-- ** Data-types+	Pondering(..),+-- * Functions+	ponder,+	abort+ ) where++import			Control.DeepSeq(($!!))+import qualified	Control.Concurrent+import qualified	Control.DeepSeq+import qualified	Data.Maybe++-- | The premis on which pondering is based & the thread on which it is happening.+data Pondering premis	= MkPondering {+	getPremis	:: premis,+	getThreadId	:: Control.Concurrent.ThreadId+}++-- | Asynchronously evaluate the specified answer, then drop it into the MVar.+ponder+	:: Control.DeepSeq.NFData answer+	=> (String -> IO ())	-- ^ Used to print arbitrary strings.+	-> premis		-- ^ The basis of the question to which an answer is required.+	-> String		-- ^ A string representing the premis.+	-> answer		-- ^ Actually an unevaluated question.+	-> Control.Concurrent.MVar answer+	-> IO (Pondering premis)+ponder putStrLn' premis premisString answer mVar	= do+	threadId	<- Control.Concurrent.forkIO $ do+		Control.Concurrent.putMVar mVar $!! answer++		putStrLn' $ showString "pondering-thread has a response based on " premisString++	putStrLn' . showString "pondering (on " . shows threadId $ showString ") a response to " premisString++	return {-to IO-monad-} MkPondering {+		getPremis	= premis,+		getThreadId	= threadId+	}++-- | Either terminates the running pondering thread, or purges the result it returned.+abort+	:: Control.Concurrent.MVar a+	-> Control.Concurrent.ThreadId+	-> IO String	-- ^ A string defining the action taken.+abort mVar threadId	= Control.Concurrent.tryTakeMVar mVar >>= Data.Maybe.maybe (+	do+		Control.Concurrent.killThread threadId++		return {-to IO-monad-} . showString "killing " $ shows threadId "."+ ) (+	const $ return {-to IO-monad-} "purging MVar."+ )
+ src-exe/BishBosh/Concurrent/SignalHandlers.hs view
@@ -0,0 +1,55 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Provides signal-handlers.+-}+module BishBosh.Concurrent.SignalHandlers (+-- * Functions+	handleSignals+) where++import qualified	BishBosh.Text.Show	as Text.Show+import qualified	Control.Concurrent+import qualified	System.IO+import qualified	System.Posix.Signals	-- CAVEAT: the package 'unix' to which this module belongs, requires a POSIX environment (such as Cygwin) for compilation on Windows.++-- | Provide basic handlers for common signals.+handleSignals :: IO ()+handleSignals	= do+	threadId	<- Control.Concurrent.myThreadId++	mapM_ (+		\(signal, s)	-> System.Posix.Signals.installHandler signal (+			System.Posix.Signals.Catch $ do+				System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsWarningPrefix "SIG" ++ s ++ " caught; exiting."++				Control.Concurrent.killThread threadId+		 ) Nothing+	 ) [+		(+			System.Posix.Signals.sigINT,			"INT"	-- '^C'.+		), (+			System.Posix.Signals.softwareTermination,	"TERM"	-- Default signal for 'kill'.+		), (+			System.Posix.Signals.sigQUIT,			"QUIT"	-- '^\'.+		)+	 ]+
+ src-exe/BishBosh/Input/CommandLineOption.hs view
@@ -0,0 +1,125 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	To facilitate processing of command-line options.+-}++module BishBosh.Input.CommandLineOption(+-- * Types+-- ** Type-synonyms+	Flag,+-- ** Data-types+	CommandLineOption(+--		IOAction,+--		OptionsMutator+	),+-- * Constants+	longFlagPrefix,+-- * Functions+	partition3,+	getArgs,+--	read',+	readArg,+	readBoundedIntegral,+-- ** Constructors+	mkIOAction,+	mkOptionsMutator,+	mkConfigLocationParameter+) where++import qualified	BishBosh.Data.Exception	as Data.Exception+import qualified	Control.Exception+import qualified	Data.List+import qualified	Data.Maybe++-- | Synonym.+type Flag	= String++-- | The varieties of command-line option.+data CommandLineOption options+	= IOAction (IO ())			-- ^ A command-line option which requests an IO-action.+	| OptionsMutator (options -> options)	-- ^ A command-line option which directly specifies a configuration-parameter.+	| ConfigLocationParameter String	-- ^ A command-line option which specifies the location of some configuration.++-- | Construct an 'IOAction' command-line option, from the required action.+mkIOAction :: IO () -> CommandLineOption options+mkIOAction	= IOAction++-- | Construct an 'OptionsMutator' command-line option from a handler-function.+mkOptionsMutator :: (options -> options) -> CommandLineOption options+mkOptionsMutator	= OptionsMutator++-- | Construct a 'ConfigLocationParameter' command-line option, from the command-line flag used to denote it, & a string explaining its argument-type.+mkConfigLocationParameter :: String -> CommandLineOption options+mkConfigLocationParameter	= ConfigLocationParameter++-- | Partition a list of 'CommandLineOption' according to their data-constructor.+partition3 :: [CommandLineOption options] -> ([IO ()], [options -> options], Maybe String)+partition3 categories	= (+	[action | IOAction action <- categories] {-list-comprehension-},+	[mutator | OptionsMutator mutator <- categories] {-list-comprehension-},+	Data.Maybe.listToMaybe [s | ConfigLocationParameter s <- categories]	-- List-comprehension.+ )++-- | The prefix used to denote the long form of a command-line flag.+longFlagPrefix :: Flag+longFlagPrefix	= "--"++{- |+	* Return the list of arguments extracted from the command-line, which match the specified long flag preceded by "--".++	* CAVEAT:+		to match a long flag, all unique abbreviations must also be supplied.+		doesn't cope with short flags preceded by '-'.+-}+getArgs :: [Flag] -> [String] -> [String]+getArgs flags	= slave where+	slave []	= []+	slave (x : xs)+		| x `elem` flags	= case xs of+			s : remainder	-> s : slave remainder {-recurse-}+			[]		-> Control.Exception.throw . Data.Exception.mkInsufficientData . showString "option " $ shows x " requires an argument."+		| any (+			(`Data.List.isPrefixOf` x) . (++ "=")+		) flags			= case dropWhile (/= '=') x of+			_ : remainder	-> remainder : slave xs+			[]		-> Control.Exception.throw . Data.Exception.mkNullDatum . showString "option " $ shows x " requires a non-null argument."+		| otherwise		= slave xs	-- Recurse.++-- | On failure to parse the specified string, returns an explanatory error-message.+read' :: Read a => String -> String -> a+read' errorMessage s	= case reads s of+	[(x, "")]	-> x+	_		-> Control.Exception.throw . Data.Exception.mkParseFailure . showString errorMessage $ shows s "."++-- | On failure to parse a command-line argument, returns an explanatory error.+readArg :: Read a => String -> a+readArg	= read' "failed to parse command-line argument "++-- | Reads a bounded integral from the command-line, guarding against overflow.+readBoundedIntegral :: (Integral i, Read i, Show i) => String -> i+readBoundedIntegral s+	| bounded /= unbounded	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.CommandLineOption.readBoundedIntegral:\tintegral value exceeds permissible bounds; " $ shows unbounded "."+	| otherwise		= bounded+	where+		unbounded	= readArg s+		bounded		= unbounded+
+ src-exe/BishBosh/Play.hs view
@@ -0,0 +1,169 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Constructs the Zobrist data-type.++	* Analyses standard-opening moves in order to statically sort the move-tree.++	* Reads any persistent game-state from file, to initialise the play-state, which constructs the quantified move tree.++	* Constructs position-hashes for each node in the tree.++	* Calls the selected user-interface.+-}++module BishBosh.Play(+-- * Functions+	play+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Zobrist					as Component.Zobrist+import qualified	BishBosh.ContextualNotation.PositionHashQualifiedMoveTree	as ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest			as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Input.EvaluationOptions				as Input.EvaluationOptions+import qualified	BishBosh.Input.IOOptions					as Input.IOOptions+import qualified	BishBosh.Input.Options						as Input.Options+import qualified	BishBosh.Input.SearchOptions					as Input.SearchOptions+import qualified	BishBosh.Input.UIOptions					as Input.UIOptions+import qualified	BishBosh.Model.GameTree						as Model.GameTree+import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.Empty						as Property.Empty+import qualified	BishBosh.Property.Tree						as Property.Tree+import qualified	BishBosh.Search.SearchState					as Search.SearchState+import qualified	BishBosh.State.PlayState					as State.PlayState+import qualified	BishBosh.Text.Show						as Text.Show+import qualified	BishBosh.Types							as T+import qualified	BishBosh.UI.CECP						as UI.CECP+import qualified	BishBosh.UI.Raw							as UI.Raw+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	System.FilePath+import qualified	System.IO+import qualified	System.Random+import			System.FilePath((</>))++-- | Plays the game according to the specified configuration.+play :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	weightedMean,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.FiniteBits	positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		column,+	Integral		x,+	Integral		y,+	Num			positionHash,+	Ord			positionHash,+	Read			x,+	Read			y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Real			weightedMean,+	Show			column,+	Show			pieceSquareValue,+	Show			row,+	Show			x,+	Show			y,+	System.Random.Random	positionHash,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> Input.Options.Options column criterionWeight pieceSquareValue rankValue row x y+	-> ContextualNotation.QualifiedMoveForest.QualifiedMoveForest x y	-- ^ Standard openings.+	-> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+{-# SPECIALISE play :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row,+	Integral		column,+	Show			column,+	Show			row,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> Input.Options.Options column T.CriterionWeight T.PieceSquareValue T.RankValue row T.X T.Y+	-> ContextualNotation.QualifiedMoveForest.QualifiedMoveForest T.X T.Y+	-> IO (State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y)+ #-}+play randomGen options qualifiedMoveForest	= Data.Maybe.maybe (+	return {-to IO-monad-} Data.Default.def {-game-}+ ) (+	\(filePath, _) -> if System.FilePath.equalFilePath filePath $ showChar System.FilePath.pathSeparator "dev" </> "null" -- On *nix.+		then return {-to IO-monad-} Data.Default.def {-game-}+		else Control.Exception.catch (+			do+				s	<- readFile filePath++				return {-to IO-monad-} $! read s	-- Force evaluation, to trigger any exception thrown from within 'catch'.+		) $ \e -> do+			System.IO.hPutStrLn System.IO.stderr . Text.Show.showsWarningPrefix . showString "'readFile' failed; " $ shows (e :: Control.Exception.SomeException) "."++			return {-to IO-monad-} Data.Default.def {-game-}+ ) (+	Input.IOOptions.getMaybePersistence ioOptions+ ) >>= (+	(+		\playState -> Data.Maybe.maybe (+			return {-to IO-monad-} playState+		) (+			\depth -> do+				System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "Move-tree:\n" $ (+					uncurry Notation.MoveNotation.showsNotationFloatToNDecimals (+						Input.UIOptions.getMoveNotation &&& Input.UIOptions.getNDecimalDigits $ uiOptions+					) . Property.Tree.prune depth . Search.SearchState.getPositionHashQuantifiedGameTree $ State.PlayState.getSearchState playState+				 ) ""++				return {-to IO-monad-} playState+		) $ Input.UIOptions.getMaybePrintMoveTree uiOptions+	) . State.PlayState.initialise options zobrist (+		if Input.SearchOptions.getSortOnStandardOpeningMoveFrequency searchOptions+			then Model.GameTree.toMoveFrequency $ ContextualNotation.QualifiedMoveForest.toGameTree qualifiedMoveForest+			else Property.Empty.empty {-MoveFrequency-}+	)+ ) >>= (+	const UI.Raw.takeTurns `either` const UI.CECP.takeTurns $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions	-- Select a user-interface.+ ) (+	ContextualNotation.PositionHashQualifiedMoveTree.fromQualifiedMoveForest (+		Input.EvaluationOptions.getIncrementalEvaluation $ Input.Options.getEvaluationOptions options+	) zobrist qualifiedMoveForest+ ) randomGen where+	(ioOptions, searchOptions)	= Input.Options.getIOOptions &&& Input.Options.getSearchOptions $ options+	uiOptions			= Input.IOOptions.getUIOptions ioOptions++	zobrist	= Component.Zobrist.mkZobrist (Input.SearchOptions.getMaybeMinimumHammingDistance searchOptions) randomGen+
+ src-exe/BishBosh/State/ApplicationTerminationReason.hs view
@@ -0,0 +1,55 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Itemises the various reasons for the termination of the application.+-}++module BishBosh.State.ApplicationTerminationReason(+-- * Types+-- ** Data-types+	ApplicationTerminationReason(),+-- * Constants+	byRequest,+	maximumPlies+) where++import qualified	Control.DeepSeq++-- | Categorises the possible reasons for terminating the application.+data ApplicationTerminationReason+	= ByRequest	-- ^ The user requested exit.+	| MaximumPlies	-- ^ The configured maximum number of /turn/s has been reached.++instance Show ApplicationTerminationReason where+	showsPrec _ ByRequest		= showString "by request"+	showsPrec _ MaximumPlies	= showString "because the configured maximum number of plies has been reached"++instance Control.DeepSeq.NFData ApplicationTerminationReason where+	rnf _	= ()++-- | Constant.+byRequest :: ApplicationTerminationReason+byRequest	= ByRequest++-- | Constant.+maximumPlies :: ApplicationTerminationReason+maximumPlies	= MaximumPlies+
+ src-exe/BishBosh/State/PlayState.hs view
@@ -0,0 +1,254 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The data-type threaded through the moves of the game, transporting the changing /game/-state & configuration.+-}++module BishBosh.State.PlayState(+-- * Types+-- ** Type-synonyms+--	Transformation,+-- ** Data-types+	PlayState(+--		MkPlayState,+--		getCriterionValues,+		getMoveFrequency,+		getSearchState,+		getOptions,+		getMaybeApplicationTerminationReason+	),+-- * Functions+	calculateCriterionValueStatistics,+	suggestCorrections,+-- ** Constructor+	initialise,+-- ** Accessors+	getGame,+-- ** Mutators+	reconstructPositionHashQuantifiedGameTree,+--	setPositionHashQuantifiedGameTree,+	updateWithAutomaticMove,+	updateWithManualMove,+	resign,+-- ** Predicates+	hasMorePlies,+	hasApplicationTerminationBeenRequested+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Zobrist				as Component.Zobrist+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.IOOptions				as Input.IOOptions+import qualified	BishBosh.Input.Options					as Input.Options+import qualified	BishBosh.Input.UIOptions				as Input.UIOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Model.GameTree					as Model.GameTree+import qualified	BishBosh.Notation.MoveNotation				as Notation.MoveNotation+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.State.ApplicationTerminationReason		as State.ApplicationTerminationReason+import qualified	BishBosh.State.TurnsByLogicalColour			as State.TurnsByLogicalColour+import qualified	BishBosh.Types						as T+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Factory.Math.Statistics+import qualified	ToolShed.Data.List++-- | The type threaded through the sequence of /game/s during play.+data PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y	= MkPlayState {+	getCriterionValues			:: [[criterionValue]],	-- ^ The /criterion-value/s accumulated during the game.+	getZobrist				:: Component.Zobrist.Zobrist x y positionHash,+	getMoveFrequency			:: Model.GameTree.MoveFrequency x y,+	getSearchState				:: Search.SearchState.SearchState x y positionHash criterionValue weightedMean,+	getOptions				:: Input.Options.Options column criterionWeight pieceSquareValue rankValue row x y,+	getMaybeApplicationTerminationReason	:: Maybe State.ApplicationTerminationReason.ApplicationTerminationReason+}++-- | Constructor.+initialise :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		x,+	Integral		y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Show			x,+	Show			y+ )+	=> Input.Options.Options column criterionWeight pieceSquareValue rankValue row x y+	-> Component.Zobrist.Zobrist x y positionHash+	-> Model.GameTree.MoveFrequency x y+	-> Model.Game.Game x y+	-> PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+{-# SPECIALISE initialise+	:: Input.Options.Options column T.CriterionWeight T.PieceSquareValue T.RankValue row T.X T.Y+	-> Component.Zobrist.Zobrist T.X T.Y T.PositionHash+	-> Model.GameTree.MoveFrequency T.X T.Y+	-> Model.Game.Game T.X T.Y+	-> PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y+ #-}+initialise options zobrist moveFrequency game	= MkPlayState {+	getCriterionValues			= [],+	getZobrist				= zobrist,+	getMoveFrequency			= moveFrequency,+	getSearchState				= Search.SearchState.initialise $ uncurry Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree (+		Input.Options.getEvaluationOptions &&& Input.Options.getSearchOptions $ options+	) zobrist moveFrequency game,+	getOptions				= options,+	getMaybeApplicationTerminationReason	= Nothing+}++-- | Accessor.+getGame :: PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> Model.Game.Game x y+getGame MkPlayState { getSearchState = searchState }	= Evaluation.QuantifiedGame.getGame . Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame $ Search.SearchState.getPositionHashQuantifiedGameTree searchState++-- | The type of a function used to transform a 'PlayState'.+type Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y	= PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y++-- | Reconstruct the /positionHashQuantifiedGameTree/ (in the /searchState/), with the apex set to the specified game.+reconstructPositionHashQuantifiedGameTree :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		x,+	Integral		y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Show			x,+	Show			y+ ) => Model.Game.Game x y -> Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+reconstructPositionHashQuantifiedGameTree game playState@MkPlayState {+	getZobrist		= zobrist,+	getMoveFrequency	= moveFrequency,+	getSearchState		= searchState,+	getOptions		= options+} = playState {+	getSearchState	= searchState {+		Search.SearchState.getPositionHashQuantifiedGameTree	= uncurry Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree (+			Input.Options.getEvaluationOptions &&& Input.Options.getSearchOptions $ options+		) zobrist moveFrequency game+	}+}++-- | Mutator.+setPositionHashQuantifiedGameTree :: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+setPositionHashQuantifiedGameTree positionHashQuantifiedGameTree playState@MkPlayState { getSearchState = searchState }	= playState {+	getSearchState	= searchState { Search.SearchState.getPositionHashQuantifiedGameTree = positionHashQuantifiedGameTree }+}++-- | Mutator.+updateWithAutomaticMove+	:: [criterionValue]+	-> Search.SearchState.SearchState x y positionHash criterionValue weightedMean+	-> Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+updateWithAutomaticMove criterionValues searchState playState	= playState {+	getCriterionValues	= criterionValues : getCriterionValues playState,+	getSearchState		= searchState+}++-- | Mutator.+updateWithManualMove :: (+	Eq	x,+	Eq	y+ ) => Model.Game.Game x y -> Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+updateWithManualMove game playState@MkPlayState { getSearchState = searchState }	= setPositionHashQuantifiedGameTree (+	Data.Maybe.fromMaybe (+		Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.State.PlayState.updateWithManualMove:\tData.RoseTree.reduce failed."+	) . Evaluation.PositionHashQuantifiedGameTree.reduce (+		(+			== Data.Maybe.fromMaybe (+				Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.State.PlayState.updateWithManualMove:\tModel.Game.maybeLastTurn failed."+			) (+				Model.Game.maybeLastTurn game+			)+		) . Evaluation.QuantifiedGame.getLastTurn . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame+	) $ Search.SearchState.getPositionHashQuantifiedGameTree searchState+ ) playState++-- | Calculate the /root-mean-square/ & the /standard-deviation/, of the values of each type of /criterion/.+calculateCriterionValueStatistics :: (+	Floating	standardDeviation,+	Fractional	mean,+	Real		criterionValue+ ) => PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> [(mean, standardDeviation)]+calculateCriterionValueStatistics MkPlayState { getCriterionValues = criterionValues }	= map (+	Factory.Math.Statistics.getMean &&& Factory.Math.Statistics.getStandardDeviation+ ) $ Data.List.transpose criterionValues++-- | Resignation by the player who currently holds the choice of move.+resign :: Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+resign playState@MkPlayState { getSearchState = searchState }	= setPositionHashQuantifiedGameTree (+	Evaluation.PositionHashQuantifiedGameTree.resign $ Search.SearchState.getPositionHashQuantifiedGameTree searchState+ ) playState++-- | Given a string from which either a /move/ can't be parsed or the one that can is illegal, returns the closest matches amongst the currently available /move/s.+suggestCorrections :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> String	-- ^ Move-string.+	-> PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> [String]	-- ^ Suggested corrections.+suggestCorrections moveString playState@MkPlayState { getOptions = options }+	| Model.Game.isTerminated game	= []+	| otherwise			= case Data.List.Extra.groupSort . map (+		(+			(\d -> d :: Rational) . ToolShed.Data.List.measureJaroDistance . (,) moveString &&& id {-alternative move-string-}+		) . Notation.MoveNotation.showNotation (+			Input.UIOptions.getMoveNotation . Input.IOOptions.getUIOptions $ Input.Options.getIOOptions options+		)+	) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game of+		[]	-> []+		l	-> snd {-move-strings-} $ last {-largest Jaro-distance is most similar-} l+	where+		game	= getGame playState++-- | Whether the game in the first /play-state/ has more plies than that in the second.+hasMorePlies+	:: PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> Bool+hasMorePlies playState playState'	= Data.Ord.comparing (State.TurnsByLogicalColour.getNPlies . Model.Game.getTurnsByLogicalColour . getGame) playState playState' == GT++-- | Whether the user has requested application-termination, or the configured maximum number of turns has been reached.+hasApplicationTerminationBeenRequested :: PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> Bool+hasApplicationTerminationBeenRequested MkPlayState { getMaybeApplicationTerminationReason = maybeApplicationTerminationReason }	= Data.Maybe.isJust maybeApplicationTerminationReason
+ src-exe/BishBosh/Text/Show.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Define standard message-prefixes.+-}++module BishBosh.Text.Show(+-- * Constants+	showsInfoPrefix,+	showsWarningPrefix,+	showsErrorPrefix,+ ) where++import qualified	BishBosh.Attribute.PhysicalColour	as Attribute.PhysicalColour+import qualified	BishBosh.Text.ShowList			as Text.ShowList++-- | Show the prefix used to denote an information-message.+showsInfoPrefix :: ShowS+showsInfoPrefix	= Attribute.PhysicalColour.bracket (+	Attribute.PhysicalColour.selectGraphicsRendition False $ Attribute.PhysicalColour.mkFgColourCode Attribute.PhysicalColour.green+ ) $ Text.ShowList.showsInfoPrefix ""++-- | Show the prefix used to denote a warning-message.+showsWarningPrefix :: ShowS+showsWarningPrefix	= Attribute.PhysicalColour.bracket (+	Attribute.PhysicalColour.selectGraphicsRendition True $ Attribute.PhysicalColour.mkFgColourCode Attribute.PhysicalColour.yellow+ ) $ Text.ShowList.showsWarningPrefix ""++-- | Show the prefix used to denote a error-message.+showsErrorPrefix :: ShowS+showsErrorPrefix	= Attribute.PhysicalColour.bracket (+	Attribute.PhysicalColour.selectGraphicsRendition True $ Attribute.PhysicalColour.mkFgColourCode Attribute.PhysicalColour.red+ ) $ Text.ShowList.showsErrorPrefix ""+
+ src-exe/BishBosh/UI/CECP.hs view
@@ -0,0 +1,1304 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Interfaces via CECP with a GUI; <https://www.gnu.org/software/xboard/engine-intf.html#6>.+-}++module BishBosh.UI.CECP(+-- * Constants+--	hintTag,+--	moveTag,+--	offerTag,+--	pongTag,+--	protoverTag,+--	explicitEnpassant,+-- * Functions+--	tellUser,+--	mkMessage,+--	mkErrorMessage,+--	mkIllegalMoveMessage,+--	mkUnknownCommandError,+--	mkTooManyParametersError,+--	showsThinking,+--	readMove,+	takeTurns+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank						as Attribute.Rank+import qualified	BishBosh.Attribute.RankValues					as Attribute.RankValues+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues		as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Component.Move						as Component.Move+import qualified	BishBosh.Component.QualifiedMove				as Component.QualifiedMove+import qualified	BishBosh.Component.Turn						as Component.Turn+import qualified	BishBosh.Concurrent.Pondering					as Concurrent.Pondering+import qualified	BishBosh.ContextualNotation.PGN					as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PositionHashQualifiedMoveTree	as ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest			as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.ContextualNotation.StandardAlgebraic			as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Data.Exception						as Data.Exception+import qualified	BishBosh.Data.Time						as Data.Time+import qualified	BishBosh.Evaluation.Fitness					as Evaluation.Fitness+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree		as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame				as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.CECPFeatures					as Input.CECPFeatures+import qualified	BishBosh.Input.CECPOptions					as Input.CECPOptions+import qualified	BishBosh.Input.EvaluationOptions				as Input.EvaluationOptions+import qualified	BishBosh.Input.IOOptions					as Input.IOOptions+import qualified	BishBosh.Input.Options						as Input.Options+import qualified	BishBosh.Input.SearchOptions					as Input.SearchOptions+import qualified	BishBosh.Input.StandardOpeningOptions				as Input.StandardOpeningOptions+import qualified	BishBosh.Input.UIOptions					as Input.UIOptions+import qualified	BishBosh.Model.Game						as Model.Game+import qualified	BishBosh.Model.GameTerminationReason				as Model.GameTerminationReason+import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.ForsythEdwards				as Property.ForsythEdwards+import qualified	BishBosh.Property.ShowFloat					as Property.ShowFloat+import qualified	BishBosh.Search.Search						as Search.Search+import qualified	BishBosh.Search.SearchState					as Search.SearchState+import qualified	BishBosh.State.ApplicationTerminationReason			as State.ApplicationTerminationReason+import qualified	BishBosh.State.PlayState					as State.PlayState+import qualified	BishBosh.Text.ShowList						as Text.ShowList+import qualified	BishBosh.Types							as T+import qualified	BishBosh.UI.Command						as UI.Command+import qualified	BishBosh.UI.PrintObject						as UI.PrintObject+import qualified	BishBosh.UI.SetObject						as UI.SetObject+import qualified	Control.Concurrent+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Control.Monad+import qualified	Control.Monad.Reader+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Time.Clock+import qualified	Numeric+import qualified	System.IO+import qualified	System.Random+import qualified	ToolShed.System.Random++-- | Used in output to prefix hints.+hintTag :: String+hintTag			= "Hint:"++-- | Used in output, to prefix moves.+moveTag :: String+moveTag			= "move"++-- | Used in output, to qualify an draw-offer.+offerTag :: String+offerTag		= "offer"++-- | The response to a ping request.+pongTag :: String+pongTag			= "pong"++-- | The command used to request the version of the CECP protocol.+protoverTag :: String+protoverTag		= "protover"++-- | Constant.+explicitEnpassant :: ContextualNotation.StandardAlgebraic.ExplicitEnPassant+explicitEnpassant	= False++-- | Used to prefix messages targetted at the user.+tellUser :: ShowS+tellUser	= showString "telluser" . showChar ' '++-- | Constructor.+mkMessage+	:: String	-- ^ Classification.+	-> String	-- ^ Reason.+	-> ShowS+mkMessage classification reason	= showString classification . showString " (" . showString reason . showString "): "++-- | Constructor.+mkIllegalMoveMessage :: String -> ShowS+mkIllegalMoveMessage	= mkMessage "Illegal move"++-- | Constructor.+mkErrorMessage :: String -> ShowS+mkErrorMessage	= mkMessage "Error"++-- | Constructor.+mkUnknownCommandError :: ShowS+mkUnknownCommandError	= mkErrorMessage "unknown command"++-- | Constructor.+mkTooManyParametersError :: ShowS+mkTooManyParametersError	= mkErrorMessage "too many parameters"++-- | Constructor.+mkParseFailureError :: ShowS+mkParseFailureError	= mkErrorMessage "parse-failure"++-- | Format thinking-output suitable to be posted to xboard.+showsThinking :: (+	Fractional	rankValue,+	Real		rankValue,+	Real		weightedMean+ )+	=> Input.SearchOptions.SearchDepth+	-> Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y+	-> weightedMean+	-> Data.Time.Clock.NominalDiffTime	-- ^ Elapsed time.+	-> Component.Move.NMoves		-- ^ Nodes searched.+	-> String				-- ^ Principal variation.+	-> ShowS+showsThinking searchDepth evaluationOptions weightedMean elapsedTime nMoves principalVariation	= Text.ShowList.showsDelimitedList (showChar ' ') id id [+	shows searchDepth,+	shows . (+		round	:: Double -> Int+	) $ 100 {-centi-Pawns-} * realToFrac (+		uncurry (/) . (+			Attribute.RankValues.calculateMaximumTotalValue &&& Attribute.RankValues.findRankValue Attribute.Rank.Pawn+		) $ Input.EvaluationOptions.getRankValues evaluationOptions+	) * realToFrac weightedMean,+	shows (round $ 100 {-centi-seconds-} * elapsedTime :: Int),+	shows nMoves+ ] . showChar '\t' . showString principalVariation++{- |+	* Reads a command-sequence from the user, terminating in either a request to move or to exit the game.++	* Since the user can also request roll-back to an earlier game before then requesting a new move, a new game is returned rather than just the requested move.+-}+readMove :: forall column criterionValue criterionWeight pieceSquareValue positionHash randomGen rankValue row weightedMean x y. (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		x,+	Integral		y,+	Ord			positionHash,+	Read			x,+	Read			y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Real			weightedMean,+	Show			column,+	Show			pieceSquareValue,+	Show			row,+	Show			x,+	Show			y,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree x y positionHash+	-> randomGen+	-> Data.Time.Clock.UTCTime+	-> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+{-# SPECIALISE readMove :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row,+	Show			column,+	Show			row,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree T.X T.Y T.PositionHash+	-> randomGen+	-> Data.Time.Clock.UTCTime+	-> State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y+	-> IO (State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y)+ #-}+readMove positionHashQualifiedMoveTree randomGen	= slave where+	slave startUTCTime playState	= let+		(game, options)			= State.PlayState.getGame &&& State.PlayState.getOptions $ playState+		(searchOptions, ioOptions)	= Input.Options.getSearchOptions &&& Input.Options.getIOOptions $ options++		(searchDepthByLogicalColour, tryToMatchSwitches)	= Input.SearchOptions.getSearchDepthByLogicalColour &&& Input.StandardOpeningOptions.getMatchSwitches . Input.SearchOptions.getStandardOpeningOptions $ searchOptions+		fullyManual						= Data.Map.null searchDepthByLogicalColour++		uiOptions	= Input.IOOptions.getUIOptions ioOptions++		moveNotation	= Input.UIOptions.getMoveNotation uiOptions+		nDecimalDigits	= Input.UIOptions.getNDecimalDigits uiOptions+		verbosity	= Input.UIOptions.getVerbosity uiOptions+	 in (+		const . Control.Exception.throwIO $ Data.Exception.mkIncompatibleData "BishBosh.UI.CECP.readMove.slave:\tunexpectedly found 'NativeUIOptions'."+	 ) `either` (+		\cecpOptions -> let+			displaySAN	= Input.CECPOptions.getDisplaySAN cecpOptions++			onCommand :: UI.Command.Command x y -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+			onCommand UI.Command.Hint	= do+				Control.Monad.unless (Model.Game.isTerminated game) . Data.Maybe.maybe (+					do+						Control.Monad.when (verbosity > Data.Default.def && not (ContextualNotation.PositionHashQualifiedMoveTree.isTerminal positionHashQualifiedMoveTree)) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "failed to find any suitable archived move."++						let+							searchResult	= Control.Monad.Reader.runReader (+								Search.Search.search (Input.SearchOptions.getSearchDepth searchOptions) $ State.PlayState.getSearchState playState+							 ) searchOptions++						case Search.Search.getQuantifiedGames searchResult of+							quantifiedGame : _	-> putStrLn . showString hintTag . showChar ' ' $ if displaySAN+								then Data.Maybe.maybe (+									Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.UI.CECP.readMove.onCommand:\tzero turns have been made."+								) (+									flip (ContextualNotation.StandardAlgebraic.showTurn explicitEnpassant) game+								) . Model.Game.maybeLastTurn $ Evaluation.QuantifiedGame.getGame quantifiedGame+								else Notation.MoveNotation.showNotation moveNotation $ Evaluation.QuantifiedGame.getLastTurn (quantifiedGame :: Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean)+							_		-> Control.Exception.throwIO . Data.Exception.mkRequestFailure . showString "BishBosh.UI.CECP.readMove.slave.onCommand:\tunexpectedly failed to find any moves; " $ shows game "."	-- CAVEAT: the game should have been terminated.+				 ) (+					\(qualifiedMove, _) -> putStrLn . showString hintTag . showChar ' ' $ if displaySAN+						then ContextualNotation.StandardAlgebraic.showMove explicitEnpassant qualifiedMove game+						else Notation.MoveNotation.showNotation moveNotation qualifiedMove+				 ) $ ContextualNotation.PositionHashQualifiedMoveTree.maybeRandomlySelectOnymousQualifiedMove randomGen tryToMatchSwitches game positionHashQualifiedMoveTree++				return {-to IO-monad-} playState	-- N.B.: though one could merely call "eventLoop", a new random-generator is desirable in case an alternative hint is requested.+			onCommand (UI.Command.Print printObject)	= do+				putStrLn . tellUser =<< case printObject of+					UI.PrintObject.Board		-> return {-to IO-monad-} . show $ Model.Game.getBoard game+					UI.PrintObject.Configuration	-> return {-to IO-monad-} $ Property.ShowFloat.showsFloatToN nDecimalDigits options "."+					UI.PrintObject.FEN		-> return {-to IO-monad-} $ Property.ForsythEdwards.showFEN game+					UI.PrintObject.Game		-> return {-to IO-monad-} $ show game+					UI.PrintObject.Help		-> return {-to IO-monad-} . showString "USAGE: " . showString UI.Command.printTag . showChar ' ' $ Text.ShowList.showsDelimitedList (showChar '|') (showChar '(') (showChar ')') (map shows UI.PrintObject.range) ""+					UI.PrintObject.Moves		-> return {-to IO-monad-} $ showString (+						showString Component.Move.tag "s"+					 ) . Text.ShowList.showsAssociation $ Text.ShowList.showsFormattedList' (+						Notation.MoveNotation.showsNotation moveNotation+					 ) (+						Model.Game.listTurnsChronologically game+					 ) "."+					UI.PrintObject.PGN		-> ($ "") `fmap` ContextualNotation.PGN.showsGame game++				eventLoop+			onCommand UI.Command.Quit	= do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "quitting on request."++				return {-to IO-monad-} playState { State.PlayState.getMaybeApplicationTerminationReason = Just State.ApplicationTerminationReason.byRequest }+			onCommand UI.Command.Resign	= do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "resigning."++				return {-to IO-monad-} $ State.PlayState.resign playState+			onCommand UI.Command.Restart	= let+				modeNames	= [s | (s, True) <- Input.CECPOptions.getNamedModes cecpOptions]	-- List-comprehension.+			 in do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "restarting game" $ (+					if null modeNames+						then id+						else showString " & leaving " . shows modeNames+				 ) "."++				return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree Data.Default.def {-game-} playState {+					State.PlayState.getOptions	= options {+						Input.Options.getIOOptions	= ioOptions {+							Input.IOOptions.getUIOptions	= uiOptions {+								Input.UIOptions.getEitherNativeUIOrCECPOptions	= Right $ Input.CECPOptions.resetModes cecpOptions	-- Retain CECP-features & protocol-version.+							}+						}+					}+				}	-- By exiting the event-loop, the new game will be persisted where appropriate.+			onCommand (UI.Command.RollBack maybeNPlies)	= let+				rollBack :: Component.Move.NMoves -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+				rollBack nPlies+					| (game', _) : _ <- drop (pred nPlies) $ Model.Game.rollBack game	= return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree game' playState+					| otherwise								= onCommand UI.Command.Restart+			 in Data.Maybe.maybe (+				let+					nPlies	= succ $ Data.Map.size searchDepthByLogicalColour	-- In fully manual play, rollback one ply, in semi-manual play rollback two plies.+				in do+					Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "rolling-back " $ shows nPlies " plies."++					rollBack nPlies+			 ) (+				\nPlies -> if nPlies <= 0+					then do+						System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsErrorPrefix "the number of plies to rollback, must exceed zero."++						eventLoop+					else rollBack nPlies+			 ) maybeNPlies+			onCommand UI.Command.Save	= do+				Data.Maybe.maybe (+					return {-to IO-monad-} $ Text.ShowList.showsErrorPrefix "the file-path at which to save the game, hasn't been defined."+				 ) (+					\(filePath, automatic) -> if automatic+						then return {-to IO-monad-} $ Text.ShowList.showsWarningPrefix "the state of the game is, in accordance with configuration, saved automatically."+						else Control.Exception.catch (+							do+								System.IO.withFile filePath System.IO.WriteMode (`System.IO.hPutStrLn` show game)++								return {-to IO-monad-} . Text.ShowList.showsInfoPrefix . showString "the game-state has been saved in " $ shows filePath "."+						 ) $ \e -> return {-to IO-monad-} . Text.ShowList.showsErrorPrefix $ show (e :: Control.Exception.SomeException)+				 ) (+					Input.IOOptions.getMaybePersistence ioOptions+				 ) >>= System.IO.hPutStrLn System.IO.stderr++				eventLoop+			onCommand (UI.Command.Set setObject)+				| fullyManual	= do+					Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix $ shows UI.Command.setTag " requires an automated opponent."++					return {-to IO-monad-} playState+				| otherwise					= Control.Exception.catchJust (+					\e -> if Data.Exception.isBadData e+						then Just $ show e+						else Nothing+				) (+					do+						Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "setting " $ shows setObject "."++						slave startUTCTime playState {+							State.PlayState.getOptions	= Control.DeepSeq.force $ case setObject of+								UI.SetObject.SearchDepth searchDepth	-> options {+									Input.Options.getSearchOptions	= Input.SearchOptions.setSearchDepth searchDepth $ Input.Options.getSearchOptions options+								}+						}+				) (+					\s -> do+						Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsErrorPrefix s++						eventLoop+				)+			onCommand UI.Command.Swap+				| fullyManual	= do+					Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString " there aren't any " $ shows Input.SearchOptions.searchDepthTag " to swap."++					eventLoop+				| otherwise						= do+					Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "swapping " $ shows Input.SearchOptions.searchDepthTag "."++					return {-to IO-monad-} playState { State.PlayState.getOptions = Input.Options.swapSearchDepth options }++			eventLoop :: IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+			eventLoop	= getLine >>= \line -> do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "received \"" $ showString line "\"."++				case lex line of+					[(nullaryCommand, "")]	-> case nullaryCommand of+						"analyze"+							| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.analyseTag cecpFeatures	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.analyseTag " disabled."++								putStrLn $ mkUnknownCommandError line++								eventLoop+							| analyseMode	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already in " $ shows Input.CECPOptions.analyseModeTag "."++								eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "entering " $ shows Input.CECPOptions.analyseModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getAnalyseMode = True }+									) options+								}+						"black"+							| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.coloursTag cecpFeatures	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.coloursTag " disabled."++								putStrLn $ mkUnknownCommandError line++								eventLoop+							| otherwise	-> return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree game {+								Model.Game.getNextLogicalColour	= minBound+							} playState {+								State.PlayState.getOptions	= Input.Options.swapSearchDepth options+							}+						"bk"	-> do+							putStrLn . unlines . map (+								\(qualifiedMove, onymousResults) -> showChar '\t' . (+									if displaySAN+										then ContextualNotation.StandardAlgebraic.showsMove explicitEnpassant qualifiedMove game+										else Notation.MoveNotation.showsNotation moveNotation qualifiedMove+								) $ (+									case onymousResults of+										[(name, _result)]	-> showString ":\t" . showString name+										_			-> id+								) ""+							 ) $ ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves tryToMatchSwitches game positionHashQualifiedMoveTree++							eventLoop+						"computer"	-> eventLoop	-- No action required.+						"draw"		-> do+							if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.drawTag cecpFeatures+								then do+									Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.drawTag " disabled."++									putStrLn $ mkUnknownCommandError line+								else putStrLn . showString offerTag $ showChar ' ' Input.CECPFeatures.drawTag	-- CAVEAT: the offer may be withdrawn before this can be accepted.++							eventLoop+						"easy"+							| ponderMode	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " $ shows Input.CECPOptions.ponderModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getPonderMode = False }+									) options+								}+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "not currently in " $ shows Input.CECPOptions.ponderModeTag "."++								eventLoop+						"edit"+							| editMode	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already in " $ shows Input.CECPOptions.editModeTag "."++								eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "entering " $ shows Input.CECPOptions.editModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getEditMode = True }+									) options+								}+						"exit"+							| analyseMode	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " $ shows Input.CECPOptions.analyseModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getAnalyseMode = False }+									) options+								}+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "not currently in " $ shows Input.CECPOptions.analyseModeTag "."++								eventLoop+						"force"+							| forceMode	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already in " $ shows Input.CECPOptions.forceModeTag "."++								eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "entering " $ shows Input.CECPOptions.forceModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getForceMode = True }+									) options+								}+						"go"	-> (+							if forceMode+								then do+									Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " $ shows Input.CECPOptions.forceModeTag "."++									return {-to IO-monad-} $ Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getForceMode = False }+									 ) options+								else return {-to IO-monad-} options+						 ) >>= (+							\options' -> if fullyManual+								then do+									Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString " there aren't any " $ shows Input.SearchOptions.searchDepthTag " to swap."++									eventLoop+								else let+									nextLogicalColour	= Model.Game.getNextLogicalColour game+								in if nextLogicalColour `Data.Map.member` searchDepthByLogicalColour+									then return {-to IO-monad-} playState { State.PlayState.getOptions = options' }+									else do+										Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "swapping to play " $ shows nextLogicalColour ", i.e. next."++										return {-to IO-monad-} playState { State.PlayState.getOptions = Input.Options.swapSearchDepth options' }+						 )+						"hard"+							| ponderMode	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already in " $ shows Input.CECPOptions.ponderModeTag "."++								eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "entering " $ shows Input.CECPOptions.ponderModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getPonderMode = True }+									) options+								}+						"hint"	-> onCommand UI.Command.Hint+						"new"	-> onCommand UI.Command.Restart >>= (+							\playState' -> let+								engineLogicalColour	= minBound+								options'		= State.PlayState.getOptions playState'+							in if Data.Map.member engineLogicalColour . Input.SearchOptions.getSearchDepthByLogicalColour $ Input.Options.getSearchOptions options'+								then return {-to IO-monad-} playState'+								else do+									Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "swapping to play " $ shows engineLogicalColour "."++									return {-to IO-monad-} playState { State.PlayState.getOptions = Input.Options.swapSearchDepth options' }+						 )+						"nopost"+							| postMode	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " $ shows Input.CECPOptions.postModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getPostMode = False }+									) options+								}+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "not currently in " $ shows Input.CECPOptions.postModeTag "."++								eventLoop+						"post"+							| postMode	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already in " $ shows Input.CECPOptions.postModeTag "."++								eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "entering " $ shows Input.CECPOptions.postModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getPostMode = True }+									) options+								}+						"quit"		-> onCommand UI.Command.Quit+						"random"	-> eventLoop+						"remove"	-> onCommand . UI.Command.RollBack $ Just 2+						"undo"		-> onCommand . UI.Command.RollBack $ Just 1	-- N.B.: only received in force-mode.+						"white"+							| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.coloursTag cecpFeatures	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.coloursTag " disabled."++								putStrLn $ mkUnknownCommandError line++								eventLoop+							| otherwise	-> return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree game {+								Model.Game.getNextLogicalColour = maxBound+							} playState {+								State.PlayState.getOptions	= Input.Options.swapSearchDepth options+							}+						"xboard"	-> do+							putStrLn ""++							eventLoop	-- No action required.+						"."+							| editMode	-> do+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " $ shows Input.CECPOptions.editModeTag "."++								return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right cecpOptions { Input.CECPOptions.getEditMode = False }+									) options+								}+							| analyseMode	-> Control.Exception.throwIO $ Data.Exception.mkRequestFailure "BishBosh.UI.CECP.readMove.slave.eventLoop:\tunimplemented."+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "not currently in either " . shows Input.CECPOptions.editModeTag . showString " or " $ shows Input.CECPOptions.analyseModeTag "."++								eventLoop+						"?"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						_+							| protocolVersion > 1	-> case nullaryCommand of+								"nps" {-nodes per second-}	-> do+									if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.npsTag cecpFeatures+										then do+											Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.npsTag " disabled."++											putStrLn $ mkUnknownCommandError line+										else Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++									eventLoop+								"pause"+									| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.pauseTag cecpFeatures	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.pauseTag " disabled."++										putStrLn $ mkUnknownCommandError line++										eventLoop+									| Data.Maybe.isJust maybePaused	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "already " $ shows Input.CECPFeatures.pauseTag "d."++										eventLoop+									| otherwise	-> do+										elapsedTime	<- Data.Time.measureElapsedTime startUTCTime++										Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "paused => stopping the clock at " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++										return {-to IO-monad-} playState {+											State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+												Right cecpOptions { Input.CECPOptions.getMaybePaused = Just elapsedTime }+											) options+										}+								"playother"+									| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.playotherTag cecpFeatures	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.playotherTag " disabled."++										putStrLn $ mkUnknownCommandError line++										eventLoop+									| fullyManual	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString " there aren't any " $ shows Input.SearchOptions.searchDepthTag " to swap."++										eventLoop+									| otherwise	-> do+										Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "leaving " . shows Input.CECPOptions.forceModeTag . showString " & swapping to play " $ shows (Model.Game.getNextLogicalColour game) ", i.e. next."++										return {-to IO-monad-} playState {+											State.PlayState.getOptions	= Input.Options.swapSearchDepth $ Input.Options.setEitherNativeUIOrCECPOptions (+												Right cecpOptions {+													Input.CECPOptions.getForceMode	= False	-- N.B.: the engine may not currently be in force-mode.+												}+											) options+										}+								"resume"+									| Just timeTaken <- maybePaused	-> do+										startUTCTime'	<- Data.Time.Clock.getCurrentTime++										Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "resuming => restarting the clock."++										slave (+											Data.Time.Clock.addUTCTime (negate timeTaken) startUTCTime'	-- Restart the clock.+										 ) playState {+											State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+												Right cecpOptions { Input.CECPOptions.getMaybePaused = Nothing }+											) options+										}+									| otherwise		-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "not currently paused."++										eventLoop	-- Recurse.+								_+									| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.usermoveTag cecpFeatures	-> moveCommand nullaryCommand+									| otherwise	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "unrecognised unary command for " . showString protoverTag . Text.ShowList.showsAssociation . shows protocolVersion . showString "; " $ shows line "."++										putStrLn $ mkUnknownCommandError line++										eventLoop+							| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.usermoveTag cecpFeatures	-> moveCommand nullaryCommand+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "unrecognised unary command for " . showString protoverTag . Text.ShowList.showsAssociation . shows protocolVersion . showString "; " $ shows line "."++								putStrLn $ mkUnknownCommandError line++								eventLoop+					[(command, arg)]	-> let+						arg'	= Data.List.Extra.trimStart arg+					 in case command of+						"cores"	-> do+							case reads arg' of+								[(nCores, "")]+									| nCores > 0	-> Control.Concurrent.setNumCapabilities nCores+									| otherwise	-> Control.Exception.throwIO . Data.Exception.mkParseFailure . showString "BishBosh.UI.CECP.readMove.slave.eventLoop:\tthe number of cores must exceed zero; " $ shows arg' "."+								_	-> Control.Exception.throwIO . Data.Exception.mkParseFailure . showString "BishBosh.UI.CECP.readMove.slave.eventLoop:\tfailed to parse an integer from " $ shows arg' "."++							eventLoop+						"egtpath" {-end-game table path-}	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"exclude"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"hover"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"include"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"level"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"lift"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"memory"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"name"	-> do+							Control.Monad.when (Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.nameTag cecpFeatures) $ do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.nameTag " disabled."++								putStrLn $ mkUnknownCommandError line++							eventLoop	-- No action required.+						"option"	-> case lex arg' of+							[("print", '=' : arg'')]	-> onCommand . UI.Command.Print $ case reads arg'' of+								[(printObject, "")]	-> printObject+								_			-> UI.PrintObject.Help+							[("set", arg'')]	-> case lex arg'' of+								[("searchDepth", '=' : arg''')]	-> case reads arg''' of+									[(searchDepth, "")]	-> onCommand . UI.Command.Set $ UI.SetObject.mkSearchDepth searchDepth+									_			-> do+										Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . showString "failed to parse " . shows Input.SearchOptions.searchDepthTag . showString " from " $ shows arg''' "."++										putStrLn $ mkParseFailureError line++										eventLoop+								_				-> do+									Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . showString "failed to parse set-" . shows Input.CECPFeatures.optionTag . showString " from " $ shows arg'' "."++									putStrLn $ mkParseFailureError line++									eventLoop+							_				-> do+								Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . showString "failed to parse " . shows Input.CECPFeatures.optionTag . showString " from " $ shows arg' "."++								putStrLn $ mkParseFailureError line++								eventLoop+						"otim" {-opponent's time-}	-> do+							if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.timeTag cecpFeatures+								then do+									Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.timeTag " disabled."++									putStrLn $ mkUnknownCommandError line+								else Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"protover"	-> do+							putStrLn . showString Input.CECPFeatures.featureTag . showChar ' ' . show $ foldr (+								\l -> Input.CECPFeatures.prependFeature (+									Input.CECPFeatures.optionTag,+									Right $ unwords l+								)+							 ) cecpFeatures [+								[+									UI.Command.printTag,+									Input.CECPFeatures.inputWidget,+									UI.PrintObject.configurationTag+								], [+									UI.Command.setTag,+									Input.SearchOptions.searchDepthTag,+									Input.CECPFeatures.sliderWidget+								] ++ map show [+									Data.Maybe.fromMaybe (+										Control.Exception.throw . Data.Exception.mkNullDatum . showString "BishBosh.UI.CECP.readMove.slave.eventLoop:\tundefined " $ shows Input.Options.tag "."+									) . Data.Maybe.listToMaybe $ Data.Map.elems searchDepthByLogicalColour,+									Input.SearchOptions.minimumSearchDepth,+									7	-- Arbitrary maximum.+								]+							 ]++							case reads arg' of+								[(protocolVersion', "")]	-> return {-to IO-monad-} playState {+									State.PlayState.getOptions	= Input.Options.setEitherNativeUIOrCECPOptions (+										Right $ Input.CECPOptions.setProtocolVersion protocolVersion' cecpOptions+									) options+								}+								_				-> Control.Exception.throwIO . Data.Exception.mkParseFailure . showString "BishBosh.UI.CECP.readMove.slave.eventLoop:\tfailed to parse " . shows Input.CECPOptions.protocolVersionTag . showString " from " $ shows arg' "."+						"put"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"rating"	-> eventLoop+						"result"	-> case reads arg' of+							[(result, _comment)]	-> return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree (+								Model.Game.updateTerminationReasonWith result game+							 ) playState+							_			-> do+								Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsErrorPrefix "failed to parse argument to result."++								putStrLn $ mkParseFailureError line++								eventLoop+						"sd" {-set depth-}	-> case reads arg' of+							[(searchDepth, "")]	-> onCommand . UI.Command.Set $ UI.SetObject.mkSearchDepth searchDepth+							_			-> do+								Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . showString "failed to parse " . shows Input.SearchOptions.searchDepthTag . showString " from " $ shows arg' "."++								putStrLn $ mkParseFailureError line++								eventLoop+						"setscore"	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"st" {-set time-}	-> do+							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"time"	-> do+							if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.timeTag cecpFeatures+								then do+									Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.timeTag " disabled."++									putStrLn $ mkUnknownCommandError line+								else Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsWarningPrefix "unimplemented."++							eventLoop+						"variant"	-> do+							putStrLn $ mkErrorMessage "unexpected variant" arg'++							eventLoop+						_+							| protocolVersion > 1	-> case command of+								"accepted"	-> do+									Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows arg' " accepted."++									eventLoop+								"ics" {-internet chess-server-}	-> do+									if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.icsTag cecpFeatures+										then do+											Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.icsTag " disabled."++											putStrLn $ mkUnknownCommandError line+										else Control.Monad.when (arg' == "-") . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "opponent is local."++									eventLoop+								"ping"	-> do+									if Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.pingTag cecpFeatures+										then do+											Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.pingTag " disabled."++											putStrLn $ mkUnknownCommandError line+										else putStrLn $ showString pongTag arg++									eventLoop+								"rejected"	-> case lex arg' of	-- Any rejection of a String-valued feature because of its syntax, includes the argument.+									[(featureName, "")]+										| Just value	<- featureName `lookup` Input.CECPFeatures.getFeatures cecpFeatures	-> do+											Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows arg' " rejected."++											slave startUTCTime playState {+												State.PlayState.getOptions	= either (+													\i -> if i /= 0+														then \options' -> options' {+															Input.Options.getIOOptions	= Input.IOOptions.updateCECPFeature (arg', Left 0) ioOptions	-- Disable the feature.+														}+														else id+												) (+													const id	-- Though deleting the string-valued feature seems attractive, there may be more than one 'option' feature.+												) value options+											}+										| otherwise	-> do+											Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "rejected " . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows arg' " unrecognised."++											eventLoop+									[(featureName, stringArg)]	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows arg' " rejected because of syntax."++										slave startUTCTime playState {+											State.PlayState.getOptions	= options {+												Input.Options.getIOOptions	= Input.IOOptions.deleteCECPFeature (+													featureName,+													Right $ Data.List.Extra.trimStart stringArg+												) ioOptions+											}+										}+									_	-> eventLoop+								"setboard"+									| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.setboardTag cecpFeatures	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.setboardTag " disabled."++										putStrLn $ mkUnknownCommandError line++										eventLoop+									| otherwise	-> Control.Exception.catchJust (+										\e -> if Data.Exception.isBadData e+											then Just $ show e+											else Nothing+									) (+										case Property.ForsythEdwards.readsFEN arg' of+											[(game', _)]	-> return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree game' playState+											_		-> do+												Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsErrorPrefix "parse-failure."++												putStrLn $ mkParseFailureError line++												eventLoop+									) (+										\s -> do+											Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsErrorPrefix s++											putStrLn $ mkParseFailureError s++											eventLoop+									)+								"usermove"+									| Input.CECPFeatures.isFeatureDisabled Input.CECPFeatures.usermoveTag cecpFeatures	-> do+										Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString Input.CECPFeatures.featureTag . Text.ShowList.showsAssociation $ shows Input.CECPFeatures.usermoveTag " disabled."++										putStrLn $ mkUnknownCommandError line++										eventLoop+									| otherwise	-> moveCommand arg'+								_	-> do+									putStrLn $ mkUnknownCommandError line++									eventLoop+							| otherwise	-> do+								Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "unrecognised command for " . showString protoverTag . Text.ShowList.showsAssociation . shows protocolVersion . showString "; " $ shows (line, command, arg') "."++								putStrLn $ mkUnknownCommandError line++								eventLoop+					_	-> do+						Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsWarningPrefix . showString "unrecognised command for " . showString protoverTag . Text.ShowList.showsAssociation . shows protocolVersion . showString "; " $ shows line "."++						putStrLn $ mkUnknownCommandError line++						eventLoop+				where+					(cecpFeatures, protocolVersion)	= Input.CECPOptions.getCECPFeatures &&& Input.CECPOptions.getProtocolVersion $ cecpOptions++					[analyseMode, editMode, forceMode, ponderMode, postMode]	= map ($ cecpOptions) [+						Input.CECPOptions.getAnalyseMode,+						Input.CECPOptions.getEditMode,+						Input.CECPOptions.getForceMode,+						Input.CECPOptions.getPonderMode,+						Input.CECPOptions.getPostMode+					 ]++					maybePaused	= Input.CECPOptions.getMaybePaused cecpOptions++					moveCommand :: String -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+					moveCommand moveString	= case Notation.MoveNotation.readsQualifiedMove moveNotation moveString of+						[(eitherQualifiedMove, "")]+							| Just errorMessage <- Model.Game.validateEitherQualifiedMove eitherQualifiedMove game	-> do+								Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . shows moveString . showString " is illegal; " $ shows errorMessage "."++								putStrLn $ mkIllegalMoveMessage errorMessage moveString++								eventLoop	-- Recurse.+							| otherwise	-> do+								elapsedTime	<- if forceMode+									then return {-to IO-monad-} 0+									else Data.Time.measureElapsedTime startUTCTime++								let+									game'		= Model.Game.applyEitherQualifiedMove eitherQualifiedMove game+									playState'	= State.PlayState.updateWithManualMove game' playState++								Control.Monad.when (verbosity == maxBound) $ do+									System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString Component.Move.tag . Text.ShowList.showsAssociation . shows (+										Notation.MoveNotation.showNotation moveNotation . Data.Maybe.fromMaybe (+											Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.UI.CECP.readMove.onCommand.moveCommand:\tModel.Game.maybeLastTurn failed."+										) $ Model.Game.maybeLastTurn game'+									 ) . showString " was requested after " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++									case ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMovesForPosition game' positionHashQualifiedMoveTree of+										[]			-> return ()+										onymousQualifiedMoves	-> System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "matches archived game(s):" $ ContextualNotation.QualifiedMoveForest.showsNames (+											Input.IOOptions.getMaybeMaximumPGNNames ioOptions+										 ) (+											concatMap (+												map fst {-Name-} . snd {-[OnymousResult]-}+											) onymousQualifiedMoves+										 ) ""++								return {-to IO-monad-} playState'	-- It's now the other player's move.+						[(_, remainder)]	-> do+							Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . showString "the specified " . showString Component.Move.tag . showString " was correctly formatted, but was followed by unexpected text" . Text.ShowList.showsAssociation $ shows remainder "."++							putStrLn $ mkTooManyParametersError moveString++							eventLoop	-- Recurse.+						_ {-no parse-}		-> do+							Control.Monad.unless (null moveString || verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix . shows moveString . showString " /~ " $ Notation.MoveNotation.showsMoveSyntax moveNotation "."	-- CAVEAT: this error also results from source == destination.++							putStrLn $ mkIllegalMoveMessage "parse-failure" moveString++							eventLoop	-- Recurse.+		in eventLoop+	 ) $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions++-- | Plays the game.+takeTurns :: forall column criterionValue criterionWeight pieceSquareValue positionHash randomGen rankValue row weightedMean x y. (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	weightedMean,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		x,+	Integral		y,+	Ord			positionHash,+	Read			x,+	Read			y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Real			weightedMean,+	Show			column,+	Show			pieceSquareValue,+	Show			row,+	Show			x,+	Show			y,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree x y positionHash+	-> randomGen+	-> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+{-# SPECIALISE takeTurns :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Fractional		rankValue,+	Real			rankValue,+	Show			column,+	Show			row,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree T.X T.Y T.PositionHash+	-> randomGen+	-> State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash rankValue row T.WeightedMean T.X T.Y+	-> IO (State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash rankValue row T.WeightedMean T.X T.Y)+ #-}+takeTurns positionHashQualifiedMoveTree randomGen playState	= do+	mVar	<- Control.Concurrent.newEmptyMVar++	let+		options	= State.PlayState.getOptions playState++		ioOptions		= Input.Options.getIOOptions options+		evaluationOptions	= Input.Options.getEvaluationOptions options+		searchOptions		= Input.Options.getSearchOptions options++		(uiOptions, maybeMaximumPGNNames)	= Input.IOOptions.getUIOptions &&& Input.IOOptions.getMaybeMaximumPGNNames $ ioOptions++		moveNotation	= Input.UIOptions.getMoveNotation uiOptions+		nDecimalDigits	= Input.UIOptions.getNDecimalDigits uiOptions+		verbosity	= Input.UIOptions.getVerbosity uiOptions++		slave :: Maybe (Concurrent.Pondering.Pondering (Component.Move.Move x y)) -> Maybe Component.Move.NMoves -> [randomGen] -> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+		slave maybePondering maybeMaximumPlies ~(randomGen' : randomGens) playState'	= let+			(game', options')		= State.PlayState.getGame &&& State.PlayState.getOptions $ playState'+			searchOptions'			= Input.Options.getSearchOptions options'+			uiOptions'			= Input.IOOptions.getUIOptions $ Input.Options.getIOOptions options'+			cecpOptions'			= either (+				const . Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.UI.CECP.takeTurns.slave:\tunexpectedly found 'NativeUIOptions'."+			 ) id $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions'+			(ponderMode, isPostMode)	= Input.CECPOptions.getPonderMode &&& Input.CECPOptions.getPostMode $ cecpOptions'+		 in Data.Maybe.maybe (+			do+				startUTCTime	<- Data.Time.Clock.getCurrentTime++				Data.Maybe.maybe (+					do+						playState''	<- readMove positionHashQualifiedMoveTree randomGen' startUTCTime playState'	-- Read the user's command or move.++						(,) playState'' `fmap` if playState' `State.PlayState.hasMorePlies` playState''+							then {-rolled-back-} do+								Data.Maybe.maybe (+									return {-to IO-monad-} ()+								 ) (+									\Concurrent.Pondering.MkPondering { Concurrent.Pondering.getThreadId = threadId } -> Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering invalidated by roll-back => "+								 ) maybePondering++								return {-to IO-monad-} Nothing+							else return {-to IO-monad-} maybePondering+				 ) (+					\searchDepth' -> Data.Maybe.maybe (+						do+							Control.Monad.when (+								verbosity > Data.Default.def && not (+									ContextualNotation.PositionHashQualifiedMoveTree.isTerminal positionHashQualifiedMoveTree+								)+							 ) . System.IO.hPutStrLn System.IO.stderr $ Text.ShowList.showsInfoPrefix "failed to find any suitable archived move."++							let+								search ss	= Control.Monad.Reader.runReader (Search.Search.search searchDepth' ss) searchOptions'+								searchResult	= search $ State.PlayState.getSearchState playState'++							Data.Maybe.maybe (+								return {-to IO-monad-} searchResult+							 ) (+								\Concurrent.Pondering.MkPondering {+									Concurrent.Pondering.getPremis		= movePremis,+									Concurrent.Pondering.getThreadId	= threadId+								} -> if Data.Maybe.maybe False ((== movePremis) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove) $ Model.Game.maybeLastTurn game'+									then do+										Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "move-premis validated => waiting on " $ shows threadId "."++										Control.Concurrent.takeMVar mVar+									else do+										Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering invalidated by incorrect move-premis => "++										return {-to IO-monad-} searchResult+							 ) maybePondering >>= (+								\searchResult' -> let+									searchState'	= Search.Search.getSearchState searchResult'+								in case Search.Search.getQuantifiedGames searchResult' of+									quantifiedGames@(quantifiedGame : continuation)	-> let+										bestTurn	= Evaluation.QuantifiedGame.getLastTurn quantifiedGame+									 in do+										elapsedTime	<- bestTurn `seq` Data.Time.measureElapsedTime startUTCTime++										Control.Monad.when (verbosity > Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . (+											if verbosity == maxBound+												then Property.ShowFloat.showsFloatToN nDecimalDigits (+													Control.Monad.Reader.runReader (+														Evaluation.Fitness.evaluateFitness Nothing game'+													) evaluationOptions	:: Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue+												) . Search.Search.showsSeparator	-- Prepend the fitness of the original game prior to the result.+												else id+										 ) . Notation.MoveNotation.showsNotationFloatToNDecimals moveNotation nDecimalDigits searchResult' . showString " in " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++										Control.Monad.when isPostMode . putStrLn $ showsThinking searchDepth' evaluationOptions (+											Evaluation.QuantifiedGame.getFitness $ last quantifiedGames+										 ) elapsedTime (+											Search.Search.getNMovesEvaluated searchResult'+										 ) (+											Text.ShowList.showsDelimitedList (+												showChar ' '+											) id id (+												zipWith (+													\turn originalGame -> if either (+														const . Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.UI.CECP.takeTurns:\tunexpectedly found 'NativeUIOptions'."+													) Input.CECPOptions.getDisplaySAN $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions+														then ContextualNotation.StandardAlgebraic.showsTurn explicitEnpassant turn originalGame+														else Notation.MoveNotation.showsNotation moveNotation turn+												) (+													map Evaluation.QuantifiedGame.getLastTurn quantifiedGames+												) $ game' : map Evaluation.QuantifiedGame.getGame quantifiedGames+											) "."+										 ) ""++										putStrLn . showString moveTag . showChar ' ' $ Notation.MoveNotation.showNotation moveNotation bestTurn	-- Send the move to the GUI.++										(,) (+											State.PlayState.updateWithAutomaticMove (+												Attribute.WeightedMeanAndCriterionValues.getCriterionValues $ Evaluation.QuantifiedGame.getWeightedMeanAndCriterionValues quantifiedGame+											) searchState' playState'+										 ) `fmap` if ponderMode && Input.SearchOptions.getUsePondering searchOptions+											then case continuation of+												quantifiedGame' : _	-> let+													turnPremis	= Evaluation.QuantifiedGame.getLastTurn quantifiedGame'+												 in fmap Just . (+													\positionHashQuantifiedGameTree'' -> Concurrent.Pondering.ponder (+														Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix+													) (+														Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove turnPremis+													) (+														showString "move-premis" . Text.ShowList.showsAssociation $ Notation.MoveNotation.showsNotation moveNotation turnPremis "."+													) (+														search searchState' { Search.SearchState.getPositionHashQuantifiedGameTree = positionHashQuantifiedGameTree'' }+													) mVar+												 ) . Data.Maybe.fromMaybe (+													Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.UI.CECP.takeTurns.slave:\tData.RoseTree.reduce failed."+												 ) . Evaluation.PositionHashQuantifiedGameTree.reduce (+													(== Evaluation.QuantifiedGame.getLastTurn quantifiedGame') . Evaluation.QuantifiedGame.getLastTurn . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame+												 ) $ Search.SearchState.getPositionHashQuantifiedGameTree searchState'+												_		-> return {-to IO-monad-} Nothing+											else return {-to IO-monad-} Nothing+									_	-> Control.Exception.throwIO . Data.Exception.mkRequestFailure . showString "BishBosh.UI.CECP.takeTurns.slave:\tunexpectedly failed to find any moves; " $ shows game' "."	-- A gameTerminationReason should have been defined.+							 )+					 ) (+						\(qualifiedMove, names) -> do+							elapsedTime	<- Data.Time.measureElapsedTime startUTCTime++							Data.Maybe.maybe (+								return {-to IO-monad-} ()+							 ) (+								\Concurrent.Pondering.MkPondering { Concurrent.Pondering.getThreadId = threadId } -> Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering pre-empted by standard-opening match => "+							 ) maybePondering++							let selectedGame	= Model.Game.applyQualifiedMove qualifiedMove game'++							Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "selected " . Notation.MoveNotation.showsNotation moveNotation qualifiedMove . showString " from:" . ContextualNotation.QualifiedMoveForest.showsNames maybeMaximumPGNNames names . showString "\n\tin " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++							Control.Monad.when isPostMode . putStrLn $ showsThinking searchDepth' evaluationOptions (0 :: weightedMean) elapsedTime 0 (+								Data.List.intercalate (+									".\n" ++ replicate 4 ' '	-- Continuations must be preceded by at least 4 spaces.+								) $ Data.Maybe.maybe names (`take` names) maybeMaximumPGNNames+							 ) "."++							putStrLn . showString moveTag . showChar ' ' $ Notation.MoveNotation.showNotation moveNotation qualifiedMove	-- Send the move to the GUI.++							return {-to IO-monad-} (State.PlayState.updateWithManualMove selectedGame playState', Nothing)	-- N.B.: one could ponder, but would have to construct a game-tree, & the chance of a subsequent standard-opening move is high.+					 ) $ ContextualNotation.PositionHashQualifiedMoveTree.maybeRandomlySelectOnymousQualifiedMove randomGen' (+						Input.StandardOpeningOptions.getMatchSwitches $ Input.SearchOptions.getStandardOpeningOptions searchOptions+					 ) game' positionHashQualifiedMoveTree+				 ) (+					if Input.UIOptions.isCECPManualMode uiOptions'+						then Nothing+						else Model.Game.getNextLogicalColour game' `Data.Map.lookup` Input.SearchOptions.getSearchDepthByLogicalColour searchOptions'+				 ) >>= (+					\(playState'', maybePondering') -> do+						Data.Maybe.maybe (+							return {-to IO-monad-} ()+						 ) (+							\(filePath, automatic) -> let+								game''	= State.PlayState.getGame playState''+							in Control.Monad.when (automatic && show game'' /= show game') . Control.Exception.catch (+								System.IO.withFile filePath System.IO.WriteMode (`System.IO.hPrint` game'')+							) $ \e -> System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsErrorPrefix $ show (e :: Control.Exception.SomeException)+						 ) $ Input.IOOptions.getMaybePersistence ioOptions++						if State.PlayState.hasApplicationTerminationBeenRequested playState''+							then return {-to IO-monad-} playState''+							else if Data.Maybe.maybe False (<= 1) maybeMaximumPlies+								then return {-to IO-monad-} playState'' { State.PlayState.getMaybeApplicationTerminationReason = Just State.ApplicationTerminationReason.maximumPlies }+								else slave maybePondering' (fmap pred maybeMaximumPlies) randomGens playState''	-- Tail recurse.+				 )+		 ) (+			\gameTerminationReason -> do+				putStrLn . shows (Model.GameTerminationReason.toResult gameTerminationReason) . showString " {" $ shows gameTerminationReason "}"	-- Send the result to the GUI.++				let+					criterionValueStatistics	= State.PlayState.calculateCriterionValueStatistics playState'++					showsFloat :: Double -> ShowS+					showsFloat	= Numeric.showFFloat $ Just nDecimalDigits++				Control.Monad.when (+					verbosity == maxBound && not (null criterionValueStatistics)+				 ) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "mean & standard-deviation of criterion-values" . Text.ShowList.showsAssociation $ Text.ShowList.showsFormattedList' (+					\(mean, standardDeviation) -> showChar '(' . showsFloat mean . Text.ShowList.showsSeparator . showsFloat standardDeviation . showChar ')'+				 ) criterionValueStatistics "."++				readMove positionHashQualifiedMoveTree randomGen' (+					Control.Exception.throw $ Data.Exception.mkInvalidDatum "BishBosh.UI.CECP.takeTurns.slave:\tundefined startUTCTime."+				 ) playState' {-there're zero valid moves, but the user can issue commands-} >>= slave Nothing maybeMaximumPlies randomGens	-- Tail recurse.++		 ) $ Model.Game.getMaybeTerminationReason game'++	Control.Exception.bracket (+		mapM System.IO.hGetBuffering fileHandles <* mapM_ (`System.IO.hSetBuffering` System.IO.LineBuffering) fileHandles+	 ) (+		mapM_ (uncurry System.IO.hSetBuffering) . zip fileHandles+	 ) . const $ slave Nothing (Input.Options.getMaybeMaximumPlies options) (ToolShed.System.Random.randomGens randomGen) playState where+		fileHandles	= [System.IO.stdin, System.IO.stdout]	-- Those file-handles which need special buffering for the duration of the interaction, by CECP, with the GUI.+
+ src-exe/BishBosh/UI/Raw.hs view
@@ -0,0 +1,621 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Interacts with the user by receiving commands & displaying the game on a raw text-based interface.+-}++module BishBosh.UI.Raw(+-- * Functions+--	readMove,+	takeTurns+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues		as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Component.Move						as Component.Move+import qualified	BishBosh.Component.QualifiedMove				as Component.QualifiedMove+import qualified	BishBosh.Component.Turn						as Component.Turn+import qualified	BishBosh.Concurrent.Pondering					as Concurrent.Pondering+import qualified	BishBosh.ContextualNotation.PGN					as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PositionHashQualifiedMoveTree	as ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest			as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Data.Exception						as Data.Exception+import qualified	BishBosh.Data.Time						as Data.Time+import qualified	BishBosh.Evaluation.Fitness					as Evaluation.Fitness+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree		as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame				as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.IOOptions					as Input.IOOptions+import qualified	BishBosh.Input.NativeUIOptions					as Input.NativeUIOptions+import qualified	BishBosh.Input.Options						as Input.Options+import qualified	BishBosh.Input.SearchOptions					as Input.SearchOptions+import qualified	BishBosh.Input.StandardOpeningOptions				as Input.StandardOpeningOptions+import qualified	BishBosh.Input.UIOptions					as Input.UIOptions+import qualified	BishBosh.Model.Game						as Model.Game+import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.ForsythEdwards				as Property.ForsythEdwards+import qualified	BishBosh.Property.Null						as Property.Null+import qualified	BishBosh.Property.ShowFloat					as Property.ShowFloat+import qualified	BishBosh.Search.Search						as Search.Search+import qualified	BishBosh.Search.SearchState					as Search.SearchState+import qualified	BishBosh.State.ApplicationTerminationReason			as State.ApplicationTerminationReason+import qualified	BishBosh.State.Board						as State.Board+import qualified	BishBosh.State.MaybePieceByCoordinates				as State.MaybePieceByCoordinates+import qualified	BishBosh.State.PlayState					as State.PlayState+import qualified	BishBosh.Text.Show						as Text.Show+import qualified	BishBosh.Text.ShowList						as Text.ShowList+import qualified	BishBosh.Types							as T+import qualified	BishBosh.UI.Command						as UI.Command+import qualified	BishBosh.UI.PrintObject						as UI.PrintObject+import qualified	BishBosh.UI.SetObject						as UI.SetObject+import qualified	Control.Concurrent+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Control.Monad+import qualified	Control.Monad.Reader+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Time.Clock+import qualified	Numeric+import qualified	System.IO+import qualified	System.Random+import qualified	ToolShed.System.Random++{- |+	* Reads a command-sequence from the user, terminating in either a request to move or to exit the game.++	* Since the user can also request roll-back to an earlier game before then requesting a new move, a new game is returned rather than just the requested move.+-}+readMove :: forall column criterionValue criterionWeight pieceSquareValue positionHash randomGen rankValue row weightedMean x y. (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		column,+	Integral		x,+	Integral		y,+	Ord			positionHash,+	Read			x,+	Read			y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Real			weightedMean,+	Show			column,+	Show			pieceSquareValue,+	Show			row,+	Show			x,+	Show			y,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree x y positionHash+	-> randomGen+	-> Data.Time.Clock.UTCTime+	-> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+{-# SPECIALISE readMove :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Fractional		rankValue,+	Integral		column,+	Real			rankValue,+	Show			column,+	Show			row,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree T.X T.Y T.PositionHash+	-> randomGen+	-> Data.Time.Clock.UTCTime+	-> State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash rankValue row T.WeightedMean T.X T.Y+	-> IO (State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash rankValue row T.WeightedMean T.X T.Y)+ #-}+readMove positionHashQualifiedMoveTree randomGen startUTCTime playState	= let+	(game, options)			= State.PlayState.getGame &&& State.PlayState.getOptions $ playState+	(searchOptions, ioOptions)	= Input.Options.getSearchOptions &&& Input.Options.getIOOptions $ options++	searchDepthByLogicalColour	= Input.SearchOptions.getSearchDepthByLogicalColour searchOptions+	fullyManual			= Data.Map.null searchDepthByLogicalColour++	(uiOptions, maybeMaximumPGNNames)	= Input.IOOptions.getUIOptions &&& Input.IOOptions.getMaybeMaximumPGNNames $ ioOptions++	moveNotation	= Input.UIOptions.getMoveNotation uiOptions+	nDecimalDigits	= Input.UIOptions.getNDecimalDigits uiOptions+	verbosity	= Input.UIOptions.getVerbosity uiOptions+ in (+	\nativeUIOptions -> let+		show2D :: Model.Game.Game x y -> String+		show2D	= uncurry State.MaybePieceByCoordinates.show2D (+			snd {-columns-} . Input.NativeUIOptions.getBoardMagnification &&& Input.NativeUIOptions.getColourScheme $ nativeUIOptions+		 ) (+			Notation.MoveNotation.getOrigin moveNotation+		 ) . State.Board.getMaybePieceByCoordinates . Model.Game.getBoard++		onCommand :: UI.Command.Command x y -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+		onCommand UI.Command.Hint	= do+			Control.Monad.unless (Model.Game.isTerminated game) . Data.Maybe.maybe (+				do+					Control.Monad.when (verbosity > Data.Default.def && not (ContextualNotation.PositionHashQualifiedMoveTree.isTerminal positionHashQualifiedMoveTree)) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsInfoPrefix "failed to find any suitable archived move."++					let+						searchResult	= Control.Monad.Reader.runReader (+							Search.Search.search (Input.SearchOptions.getSearchDepth searchOptions) $ State.PlayState.getSearchState playState+						 ) searchOptions++					case Search.Search.getQuantifiedGames searchResult of+						quantifiedGame : _	-> putStrLn . Text.Show.showsInfoPrefix . showString "Try " $ if verbosity == maxBound+							then Notation.MoveNotation.showsNotationFloatToNDecimals moveNotation nDecimalDigits searchResult ""+							else Data.Maybe.maybe (+								Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.UI.Raw.readMove.onCommand:\tzero turns have been made."+							) (+								showChar '"' . flip (Notation.MoveNotation.showsNotation moveNotation) "\"."+							) . Model.Game.maybeLastTurn $ Evaluation.QuantifiedGame.getGame quantifiedGame+						_		-> Control.Exception.throwIO . Data.Exception.mkRequestFailure . showString "BishBosh.UI.Raw.readMove.onCommand:\tunexpectedly failed to find any moves; " $ shows game "."	-- CAVEAT: the game should have terminated.+			 ) (+				\(qualifiedMove, names) -> putStrLn . Text.Show.showsInfoPrefix . showString "Try \"" . Notation.MoveNotation.showsNotation moveNotation qualifiedMove . showString "\" from:" $ ContextualNotation.QualifiedMoveForest.showsNames maybeMaximumPGNNames names ""+			 ) $ ContextualNotation.PositionHashQualifiedMoveTree.maybeRandomlySelectOnymousQualifiedMove randomGen (+				Input.StandardOpeningOptions.getMatchSwitches $ Input.SearchOptions.getStandardOpeningOptions searchOptions+			 ) game positionHashQualifiedMoveTree++			return {-to IO-monad-} playState	-- N.B.: though one could merely call "eventLoop", a new random-generator is desirable in case an alternative hint is requested.+		onCommand (UI.Command.Print printObject)	= do+			case printObject of+				UI.PrintObject.Board		-> putStrLn $ show2D game+				UI.PrintObject.Configuration	-> putStrLn $ Property.ShowFloat.showsFloatToN nDecimalDigits options "."+				UI.PrintObject.FEN		-> putStrLn $ Property.ForsythEdwards.showFEN game+				UI.PrintObject.Game		-> print game+				UI.PrintObject.Help		-> putStrLn . showString "Enter either a move in " . shows moveNotation $ showString "-notation, or:\n" UI.Command.usageMessage+				UI.PrintObject.Moves		-> putStrLn . showString (+					showString Component.Move.tag "s"+				 ) . Text.ShowList.showsAssociation $ Text.ShowList.showsFormattedList' (+					Notation.MoveNotation.showsNotation moveNotation+				 ) (+					Model.Game.listTurnsChronologically game+				 ) "."+				UI.PrintObject.PGN		-> ContextualNotation.PGN.showsGame game >>= putStrLn . ($ "")++			eventLoop+		onCommand UI.Command.Quit		= do+			Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsInfoPrefix "quitting on request."++			return {-to IO-monad-} playState { State.PlayState.getMaybeApplicationTerminationReason = Just State.ApplicationTerminationReason.byRequest }+		onCommand UI.Command.Resign		= do+			Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsInfoPrefix "resigning."++			return {-to IO-monad-} $ State.PlayState.resign playState+		onCommand UI.Command.Restart+			| Property.Null.isNull game	= do+				Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsWarningPrefix "the game is unstarted."++				return {-to IO-monad-} playState+			| otherwise			= do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsInfoPrefix "restarting game."++				return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree Data.Default.def {-game-} playState	-- By exiting the event-loop, the new game will be persisted where appropriate.+		onCommand (UI.Command.RollBack maybeNPlies)	= let+			rollBack :: Component.Move.NMoves -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+			rollBack nPlies+				| (game', _) : _ <- drop (pred nPlies) $ Model.Game.rollBack game	= do+					Control.Monad.when (verbosity == maxBound) . putStrLn $ show2D game'++					return {-to IO-monad-} $ State.PlayState.reconstructPositionHashQuantifiedGameTree game' playState+				| otherwise	= onCommand UI.Command.Restart+		 in Data.Maybe.maybe (+			let+				nPlies	= succ $ Data.Map.size searchDepthByLogicalColour	-- In fully manual play, rollback one ply, in semi-manual play rollback two plies.+			in do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "rolling-back " $ shows nPlies " plies."++				rollBack nPlies+		 ) (+			\nPlies -> if nPlies <= 0+				then do+					System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsErrorPrefix "the number of plies to rollback, must exceed zero."++					eventLoop+				else rollBack nPlies+		 ) maybeNPlies+		onCommand UI.Command.Save	= do+			Data.Maybe.maybe (+				return {-to IO-monad-} $ Text.Show.showsErrorPrefix "the file-path at which to save the game, hasn't been defined."+			 ) (+				\(filePath, automatic) -> if automatic+					then return {-to IO-monad-} $ Text.Show.showsWarningPrefix "the state of the game is, in accordance with configuration, saved automatically."+					else Control.Exception.catch (+						do+							System.IO.withFile filePath System.IO.WriteMode (`System.IO.hPutStrLn` show game)++							return {-to IO-monad-} . Text.Show.showsInfoPrefix . showString "the game-state has been saved in " $ shows filePath "."+					 ) $ \e -> return {-to IO-monad-} . Text.Show.showsErrorPrefix $ show (e :: Control.Exception.SomeException)+			 ) (+				Input.IOOptions.getMaybePersistence ioOptions+			 ) >>= System.IO.hPutStrLn System.IO.stderr++			eventLoop+		onCommand (UI.Command.Set setObject)+			| fullyManual	= do+				System.IO.hPutStrLn System.IO.stderr . Text.Show.showsWarningPrefix $ shows UI.Command.setTag " requires an automated opponent."++				return {-to IO-monad-} playState+			| otherwise					= Control.Exception.catchJust (+				\e -> if Data.Exception.isBadData e+					then Just $ show e+					else Nothing+			) (+				do+					Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "setting " $ shows setObject "."++					readMove positionHashQualifiedMoveTree randomGen startUTCTime playState {+						State.PlayState.getOptions	= Control.DeepSeq.force $ case setObject of+							UI.SetObject.SearchDepth searchDepth	-> options {+								Input.Options.getSearchOptions	= Input.SearchOptions.setSearchDepth searchDepth $ Input.Options.getSearchOptions options+							}+					}+			) (+				\s -> do+					Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsErrorPrefix s++					eventLoop+			)+		onCommand UI.Command.Swap+			| fullyManual	= do+				Control.Monad.when (verbosity >= Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsWarningPrefix . showString " there aren't any " $ shows Input.SearchOptions.searchDepthTag " to swap."++				eventLoop+			| otherwise					= do+				Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "swapping " $ shows Input.SearchOptions.searchDepthTag "."++				return {-to IO-monad-} playState { State.PlayState.getOptions = Input.Options.swapSearchDepth options }++		eventLoop :: IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+		eventLoop	= getLine >>= \line -> case Data.List.Extra.trim line of+			"?"	-> onCommand $ UI.Command.Print UI.PrintObject.Help+			':' : s	-> either (+				\errorMessage -> do+					System.IO.hPutStrLn System.IO.stderr . Text.Show.showsErrorPrefix $ showString errorMessage "."++					eventLoop+			 ) (+				\(command, remainder) -> if null $ Data.List.Extra.trimStart remainder+					then onCommand command+					else do+						System.IO.hPutStrLn System.IO.stderr . showString "unexpected trailing text " $ shows remainder "."++						eventLoop+			 ) . UI.Command.readsCommand $ UI.Command.autoComplete s+			s	-> let+				corrections	= State.PlayState.suggestCorrections s playState+			 in case Notation.MoveNotation.readsQualifiedMove moveNotation s of+				[(eitherQualifiedMove, "")]+					| Just errorMessage <- Model.Game.validateEitherQualifiedMove eitherQualifiedMove game	-> do+						System.IO.hPutStrLn System.IO.stderr . Text.Show.showsErrorPrefix . shows s . showString " is illegal; " $ shows errorMessage "."++						Control.Monad.unless (null corrections) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "did you mean " $ shows corrections " ?"++						eventLoop	-- Recurse.+					| otherwise	-> do+						elapsedTime	<- Data.Time.measureElapsedTime startUTCTime++						let+							game'		= Model.Game.applyEitherQualifiedMove eitherQualifiedMove game+							playState'	= State.PlayState.updateWithManualMove game' playState++						Control.Monad.when (verbosity == maxBound) $ do+							System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString Component.Move.tag . Text.ShowList.showsAssociation . shows (+								Notation.MoveNotation.showNotation moveNotation . Data.Maybe.fromMaybe (+									Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.UI.Raw.readMove.eventLoop:\tModel.Game.maybeLastTurn failed."+								) $ Model.Game.maybeLastTurn game'+							 ) . showString " was requested after " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++							case ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMovesForPosition game' positionHashQualifiedMoveTree of+								[]			-> return {-to IO-monad-} ()+								onymousQualifiedMoves	-> System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "matches archived game(s):" $ ContextualNotation.QualifiedMoveForest.showsNames maybeMaximumPGNNames (+									concatMap (+										map fst {-Name-} . snd {-[OnymousResult]-}+									) onymousQualifiedMoves+								 ) ""++						return {-to IO-monad-} playState'	-- It's now the other player's move.+				[(_, remainder)]		-> do+					System.IO.hPutStrLn System.IO.stderr . Text.Show.showsErrorPrefix . showString "the specified " . showString Component.Move.tag . showString " was correctly formatted, but was followed by unexpected text" . Text.ShowList.showsAssociation $ shows remainder "."++					eventLoop	-- Recurse.+				_ {-no parse-}			-> do+					Control.Monad.unless (null s) $ do+						System.IO.hPutStrLn System.IO.stderr . Text.Show.showsErrorPrefix . shows s . showString " /~ " $ Notation.MoveNotation.showsMoveSyntax moveNotation "."	-- CAVEAT: this error also results from source == destination.++						Control.Monad.unless (null corrections) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "did you mean " $ shows corrections " ?"++					eventLoop	-- Recurse.+	 in do+		putStrLn . showString "Enter either a move in " . shows moveNotation . showString "-notation, or '?' for " $ showString UI.PrintObject.helpTag ":"++		eventLoop+ ) `either` (+	const . Control.Exception.throwIO $ Data.Exception.mkInvalidDatum "BishBosh.UI.Raw.readMove:\tunexpected CECP-options."+ ) $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions++-- | Plays the game.+takeTurns :: forall column criterionValue criterionWeight pieceSquareValue positionHash randomGen rankValue row weightedMean x y. (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	weightedMean,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		column,+	Integral		x,+	Integral		y,+	Ord			positionHash,+	Read			x,+	Read			y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Real			weightedMean,+	Show			column,+	Show			pieceSquareValue,+	Show			row,+	Show			x,+	Show			y,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree x y positionHash+	-> randomGen+	-> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y+	-> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+{-# SPECIALISE takeTurns :: (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row,+	Integral		column,+	Show			column,+	Show			row,+	System.Random.RandomGen	randomGen+ )+	=> ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree T.X T.Y T.PositionHash+	-> randomGen+	-> State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y+	-> IO (State.PlayState.PlayState column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue row T.WeightedMean T.X T.Y)+ #-}+takeTurns positionHashQualifiedMoveTree randomGen playState	= let+	options	= State.PlayState.getOptions playState++	(ioOptions, searchOptions)	= Input.Options.getIOOptions &&& Input.Options.getSearchOptions $ options++	uiOptions	= Input.IOOptions.getUIOptions ioOptions++	moveNotation	= Input.UIOptions.getMoveNotation uiOptions+	nDecimalDigits	= Input.UIOptions.getNDecimalDigits uiOptions+	verbosity	= Input.UIOptions.getVerbosity uiOptions+ in (+	\nativeUIOptions -> do+		mVar	<- Control.Concurrent.newEmptyMVar++		let+			show2D :: Model.Game.Game x y -> String+			show2D	= uncurry State.MaybePieceByCoordinates.show2D (+				snd {-columns-} . Input.NativeUIOptions.getBoardMagnification &&& Input.NativeUIOptions.getColourScheme $ nativeUIOptions+			 ) (+				Notation.MoveNotation.getOrigin moveNotation+			 ) . State.Board.getMaybePieceByCoordinates . Model.Game.getBoard++			slave :: Maybe (Concurrent.Pondering.Pondering (Component.Move.Move x y)) -> Maybe Component.Move.NMoves -> [randomGen] -> State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y -> IO (State.PlayState.PlayState column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y)+			slave maybePondering maybeMaximumPlies ~(randomGen' : randomGens) playState'	= let+				(game', searchOptions')		= State.PlayState.getGame &&& Input.Options.getSearchOptions . State.PlayState.getOptions $ playState'+			 in Data.Maybe.maybe (+				do+					startUTCTime	<- Data.Time.Clock.getCurrentTime++					Data.Maybe.maybe (+						do+							playState''	<- readMove positionHashQualifiedMoveTree randomGen' startUTCTime playState'++							(,) playState'' `fmap` if playState' `State.PlayState.hasMorePlies` playState''+								then {-rolled-back-} do+									Data.Maybe.maybe (+										return {-to IO-monad-} ()+									 ) (+										\Concurrent.Pondering.MkPondering { Concurrent.Pondering.getThreadId = threadId } -> Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering invalidated by roll-back => "+									 ) maybePondering++									return {-to IO-monad-} Nothing+								else return {-to IO-monad-} maybePondering+					 ) (+						\searchDepth' -> Data.Maybe.maybe (+							do+								Control.Monad.when (+									verbosity > Data.Default.def && not (+										ContextualNotation.PositionHashQualifiedMoveTree.isTerminal positionHashQualifiedMoveTree+									)+								 ) . System.IO.hPutStrLn System.IO.stderr $ Text.Show.showsInfoPrefix "failed to find any suitable archived move."++								let+									search ss	= Control.Monad.Reader.runReader (Search.Search.search searchDepth' ss) searchOptions'+									searchResult	= search $ State.PlayState.getSearchState playState'++								Data.Maybe.maybe (+									return {-to IO-monad-} searchResult+								 ) (+									\Concurrent.Pondering.MkPondering {+										Concurrent.Pondering.getPremis		= movePremis,+										Concurrent.Pondering.getThreadId	= threadId+									} -> if Data.Maybe.maybe False ((== movePremis) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove) $ Model.Game.maybeLastTurn game'+										then do+											Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "move-premis validated => waiting on " $ shows threadId "."++											Control.Concurrent.takeMVar mVar+										else do+											Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering invalidated by incorrect move-premis => "++											return {-to IO-monad-} searchResult+								 ) maybePondering >>= (+									\searchResult' -> let+										searchState'	= Search.Search.getSearchState searchResult'+									in case Search.Search.getQuantifiedGames searchResult' of+										quantifiedGame : continuation	-> let+											bestTurn	= Evaluation.QuantifiedGame.getLastTurn quantifiedGame+										 in do+											elapsedTime	<- bestTurn `seq` Data.Time.measureElapsedTime startUTCTime++											System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . (+												if verbosity == maxBound+													then Property.ShowFloat.showsFloatToN nDecimalDigits (+														Control.Monad.Reader.runReader (+															Evaluation.Fitness.evaluateFitness Nothing game'+														) $ Input.Options.getEvaluationOptions options	:: Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue+													) . Search.Search.showsSeparator	-- Prepend the fitness of the original game prior to the result.+													else id+											 ) $ (+												if verbosity > Data.Default.def+													then Notation.MoveNotation.showsNotationFloatToNDecimals moveNotation nDecimalDigits searchResult' . showString " in " . Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime+													else Notation.MoveNotation.showsNotation moveNotation bestTurn+											 ) "."++											let selectedGame	= Evaluation.QuantifiedGame.getGame quantifiedGame++											Control.Monad.unless (verbosity == minBound) . putStrLn $ show2D selectedGame++											(,) (+												State.PlayState.updateWithAutomaticMove (+													Attribute.WeightedMeanAndCriterionValues.getCriterionValues $ Evaluation.QuantifiedGame.getWeightedMeanAndCriterionValues quantifiedGame+												) searchState' playState'+											 ) `fmap` if Input.SearchOptions.getUsePondering searchOptions+												then case continuation of+													quantifiedGame' : _	-> let+														turnPremis	= Evaluation.QuantifiedGame.getLastTurn quantifiedGame'+													 in fmap Just . (+														\positionHashQuantifiedGameTree'' -> Concurrent.Pondering.ponder (+															Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix+														) (+															Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove turnPremis+														) (+															showString "move-premis" . Text.ShowList.showsAssociation $ Notation.MoveNotation.showsNotation moveNotation turnPremis "."+														) (+															search searchState' { Search.SearchState.getPositionHashQuantifiedGameTree = positionHashQuantifiedGameTree'' }+														) mVar+													 ) . Data.Maybe.fromMaybe (+														Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.UI.Raw.takeTurns.slave:\tData.RoseTree.reduce failed."+													 ) . Evaluation.PositionHashQuantifiedGameTree.reduce (+														(== Evaluation.QuantifiedGame.getLastTurn quantifiedGame') . Evaluation.QuantifiedGame.getLastTurn . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame+													 ) $ Search.SearchState.getPositionHashQuantifiedGameTree searchState'+													_		-> return {-to IO-monad-} Nothing+												else return {-to IO-monad-} Nothing+										_	-> Control.Exception.throwIO . Data.Exception.mkRequestFailure . showString "BishBosh.UI.Raw.takeTurns.slave:\tunexpectedly failed to find any moves; " $ shows game' "."	-- A gameTerminationReason should have been defined.+								 )+						 ) (+							\(qualifiedMove, names) -> do+								elapsedTime	<- Data.Time.measureElapsedTime startUTCTime++								Data.Maybe.maybe (+									return {-to IO-monad-} ()+								 ) (+									\Concurrent.Pondering.MkPondering { Concurrent.Pondering.getThreadId = threadId } -> Concurrent.Pondering.abort mVar threadId >>= Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . Text.ShowList.showsInfoPrefix . showString "pondering pre-empted by standard-opening match => "+								 ) maybePondering++								let selectedGame	= Model.Game.applyQualifiedMove qualifiedMove game'++								if verbosity == minBound+									then System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix $ Notation.MoveNotation.showsNotation moveNotation qualifiedMove "."+									else do+										Control.Monad.when (verbosity > Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "selected " . Notation.MoveNotation.showsNotation moveNotation qualifiedMove . showString " from:" . ContextualNotation.QualifiedMoveForest.showsNames (+											Input.IOOptions.getMaybeMaximumPGNNames ioOptions+										 ) names . showString "\n\tin " $ Data.Time.showsTimeAsSeconds nDecimalDigits elapsedTime "."++										putStrLn $ show2D selectedGame++								return {-to IO-monad-} (State.PlayState.updateWithManualMove selectedGame playState', Nothing)	-- N.B.: one could ponder, but would have to construct a game-tree, & the chance of a subsequent standard-opening move is high.+						 ) $ ContextualNotation.PositionHashQualifiedMoveTree.maybeRandomlySelectOnymousQualifiedMove randomGen' (+							Input.StandardOpeningOptions.getMatchSwitches $ Input.SearchOptions.getStandardOpeningOptions searchOptions+						 ) game' positionHashQualifiedMoveTree+					 ) (+						Model.Game.getNextLogicalColour game' `Data.Map.lookup` Input.SearchOptions.getSearchDepthByLogicalColour searchOptions'+					 ) >>= (+						\(playState'', maybePondering') -> do+							Data.Maybe.maybe (+								return {-to IO-monad-} ()+							 ) (+								\(filePath, automatic) -> let+									game''	= State.PlayState.getGame playState''+								in Control.Monad.when (automatic && show game'' /= show game') . Control.Exception.catch (+									System.IO.withFile filePath System.IO.WriteMode (`System.IO.hPrint` game'')+								) $ \e -> System.IO.hPutStrLn System.IO.stderr . Text.Show.showsErrorPrefix $ show (e :: Control.Exception.SomeException)+							 ) $ Input.IOOptions.getMaybePersistence ioOptions++							if State.PlayState.hasApplicationTerminationBeenRequested playState''+								then return {-to IO-monad-} playState''+								else if Data.Maybe.maybe False (<= 1) maybeMaximumPlies+									then return {-to IO-monad-} playState'' { State.PlayState.getMaybeApplicationTerminationReason = Just State.ApplicationTerminationReason.maximumPlies }+									else slave maybePondering' (fmap pred maybeMaximumPlies) randomGens playState''	-- Tail recurse.+					 )+			 ) (+				\gameTerminationReason -> if State.PlayState.hasApplicationTerminationBeenRequested playState'+					then return {-to IO-monad-} playState'+					else {-don't terminate the application-} do+						putStrLn . Text.Show.showsInfoPrefix $ shows gameTerminationReason "."++						let+							criterionValueStatistics	= State.PlayState.calculateCriterionValueStatistics playState'++							showsFloat :: Double -> ShowS+							showsFloat	= Numeric.showFFloat $ Just nDecimalDigits++						Control.Monad.when (+							verbosity == maxBound && not (null criterionValueStatistics)+						 ) . System.IO.hPutStrLn System.IO.stderr . Text.Show.showsInfoPrefix . showString "mean & standard-deviation of criterion-values" . Text.ShowList.showsAssociation $ Text.ShowList.showsFormattedList' (+							\(mean, standardDeviation) -> showChar '(' . showsFloat mean . Text.ShowList.showsSeparator . showsFloat standardDeviation . showChar ')'+						 ) criterionValueStatistics "."++						readMove positionHashQualifiedMoveTree randomGen' (+							Control.Exception.throw $ Data.Exception.mkInvalidDatum "BishBosh.UI.Raw.takeTurns.slave:\tundefined startUTCTime."+						 ) playState' {-there're zero valid moves, but the user can issue commands-} >>= slave Nothing maybeMaximumPlies randomGens	-- Tail recurse.++			 ) $ Model.Game.getMaybeTerminationReason game'++		Control.Monad.unless (verbosity == minBound) . putStrLn . show2D $ State.PlayState.getGame playState++		slave Nothing (Input.Options.getMaybeMaximumPlies options) (ToolShed.System.Random.randomGens randomGen) playState+ ) `either` (+	const . Control.Exception.throwIO $ Data.Exception.mkInvalidDatum "BishBosh.UI.Raw.takeTurns:\tunexpected CECP-options."+ ) $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions+
+ src-exe/Main.hs view
@@ -0,0 +1,431 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Reads the configuration by parsing the command-line arguments.++	* Plays a chess-game as configured.+-}++module Main(main) where++import			BishBosh.Data.Float()+-- import		BishBosh.Data.Ratio()	-- Required if either criterionWeight or criterionValue is Rational.+import			Control.Arrow((&&&), (***))+import			Control.Category((>>>))+import qualified	BishBosh.Concurrent.SignalHandlers		as Concurrent.SignalHandlers+import qualified	BishBosh.ContextualNotation.PGN			as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PGNDatabase		as ContextualNotation.PGNDatabase+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest	as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Input.CommandLineOption		as Input.CommandLineOption+import qualified	BishBosh.Input.IOOptions			as Input.IOOptions+import qualified	BishBosh.Input.Options				as Input.Options+import qualified	BishBosh.Input.PGNOptions			as Input.PGNOptions+import qualified	BishBosh.Input.UIOptions			as Input.UIOptions+import qualified	BishBosh.Input.Verbosity			as Input.Verbosity+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Play					as Play+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.Null				as Property.Null+import qualified	BishBosh.Property.ShowFloat			as Property.ShowFloat+import qualified	BishBosh.State.PlayState			as State.PlayState+import qualified	BishBosh.State.TurnsByLogicalColour		as State.TurnsByLogicalColour+import qualified	BishBosh.Text.Show				as Text.Show+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Exception+import qualified	Control.Monad+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Version+import qualified	Distribution.Verbosity+import qualified	Paths_bishbosh					as Paths	-- Either local stub, or package-instance auto-generated by 'Setup build'.+import qualified	System.Console.GetOpt				as G+import qualified	System.Directory+import qualified	System.Environment+import qualified	System.Exit+import qualified	System.FilePath+import qualified	System.Info+import qualified	System.IO+import qualified	System.Random+import qualified	Text.Printf+import qualified	Text.XML.HXT.Core				as HXT+import qualified	ToolShed.Data.List+import qualified	ToolShed.System.File+import			System.FilePath((</>), (<.>))++#ifdef USE_NARROW_NUMBERS+import			BishBosh.Data.Integral()	-- HXT.XmlPickler.+#endif++#ifdef USE_HXTRELAXNG+import qualified	Text.XML.HXT.RelaxNG+#endif++#ifdef TOOL_VERSION_ghc+import qualified	GHC.Conc+#endif++type Row	= T.Y+type Column	= T.X		-- N.B. there's no requirement to be the same type as Row.+type Options	= Input.Options.Options Column T.CriterionWeight T.PieceSquareValue T.RankValue Row T.X T.Y++writeXMLToFile+	:: HXT.XmlPickler pickleable+	=> System.FilePath.FilePath	-- ^ Destination.+	-> String			-- ^ Root-element.+	-> System.FilePath.FilePath	-- ^ DTD file-path.+	-> pickleable			-- ^ The pickleable.+	-> IO ()+writeXMLToFile destinationFilePath rootElementTag dtdFilePath x	= System.IO.withFile destinationFilePath System.IO.WriteMode (+	`System.IO.hPutStrLn` (+		showString "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE " . showString rootElementTag . showString " SYSTEM " . shows dtdFilePath $ showString ">\n" (+			HXT.showPickled [+				HXT.withIndent HXT.yes	-- CAVEAT: corresponding input-option 'HXT.withRemoveWS' may subsequently be required.+			] x+		)+	)+ )++-- | Entry-point.+main :: IO ()+main	= do+	progName	<- System.Environment.getProgName+	args		<- System.Environment.getArgs+	dataDir		<- fmap System.FilePath.normalise Paths.getDataDir	-- Defined using 'cabal configure --datadir="<dir>" --datasubdir="<dir>"'.+	appUserDataDir	<- System.Directory.getAppUserDataDirectory progName	-- CAVEAT: on Unix/Gnu-Linux, requires the '$HOME' environment-variable to have been defined.+	executablePath	<- fmap System.FilePath.normalise System.Environment.getExecutablePath++	System.Directory.doesDirectoryExist appUserDataDir >>= (+		`Control.Monad.unless` Control.Exception.catch (+			System.Directory.createDirectory appUserDataDir+		) (+			\e -> do+				System.IO.hPutStrLn System.IO.stderr $ shows (e :: Control.Exception.SomeException) "."++				System.Exit.exitFailure+		)+	 )++	let+		author :: String+		author	= "Dr. Alistair Ward"++		inputConfigFilePathFlag :: Input.CommandLineOption.Flag+		inputConfigFilePathFlag	= "inputConfigFilePath"+{-+	Define all permissible command-line options.+	This specification is fairly complicated:+		Each command-line option is categorised as one of:+			an "IO-action", which is subsequently sequenced with other IO-actions, before exiting;+			an "Options-mutator", which if specified, defines a function used to transform 'Input.CommandLineOption.CommandLineOption'.++		Additionally, the command-line options are recorded as they're processed, to enable display of the command-line in the results;+		if one merely displays 'args', then security-sensitive details may be revealed, & it's difficult to find & remove such options, since the associated flag may be truncated to a minimum unique string.+-}+		optDescrList :: [+			G.OptDescr (+				Maybe (String {-flag-}, Maybe String {-optional value-}),	-- Record command-line specifications.+				Input.CommandLineOption.CommandLineOption Options		-- Defines the action to take on receipt of a command-line option.+			) -- Pair.+		 ]+		optDescrList	= [+			G.Option "?"	["help"] (+				G.NoArg (+					Nothing {-N/A-},+					Input.CommandLineOption.mkIOAction printHelp+				)+			) $ showString infoString "print this help, & then exit.",+			G.Option "v"	["version"] (+				G.NoArg (+					Nothing {-N/A-},+					Input.CommandLineOption.mkIOAction printVersion+				)+			) $ showString infoString "print version-information, & then exit.",+			G.Option "i"	[inputConfigFilePathFlag] (+				G.ReqArg (+					Just . (,) inputConfigFilePathFlag . Just &&& Input.CommandLineOption.mkConfigLocationParameter+				) $ mkTypeString filePathString+			) $ showString inputString "define the path to an XML-file from which the configuration can be read.",+			G.Option "r"	[Input.Options.randomSeedTag] (+				G.OptArg (+					Just . (,) Input.Options.randomSeedTag &&& Input.CommandLineOption.mkOptionsMutator . setRandomSeed+				) $ mkTypeString intString+			) . showString executionString . showString "seed the pseudo-random number-generator with the specified integer, to produce a repeatable sequence; if this option is unspecified then the seed is unpredictable, but if only its argument is unspecified then the seed defaults to '" $ shows defaultRandomSeed "'.",+			G.Option "o"	[Input.IOOptions.outputConfigFilePathTag] (+				G.ReqArg (+					Just . (,) Input.IOOptions.outputConfigFilePathTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setOutputConfigFilePath+				) $ mkTypeString filePathString+			) $ showString outputString "define the path to a file into which the unprocessed configuration, formatted in XML, should be written.",+			G.Option ""	[Input.UIOptions.printMoveTreeTag] (+				G.ReqArg (+					Just . (,) Input.UIOptions.printMoveTreeTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setPrintMoveTree+				) $ mkTypeString intString+			) $ showString outputString "draw the tree of all possible moves, each annotated by an evaluation of the fitness of the resulting position, truncated to the specified number of plies.",+			G.Option ""	["checkPickler"] (+				G.NoArg (+					Nothing {-N/A-},+					Input.CommandLineOption.mkIOAction checkPickler+				)+			) $ showString outputString "check the XML-pickler used to read & write configuration-files, & then exit.",+			G.Option ""	["generateDTD"] (+				G.NoArg (+					Nothing {-N/A-},+					Input.CommandLineOption.mkIOAction generateDTD+				)+			) $ showString outputString "generate a rough Document Type Definition (DTD), defining the XML-format of configuration-files, & then exit. CAVEAT: it must be manually amended to identify 'IMPLIED', 'ID', & 'IDREF' attributes.",+			G.Option ""	[Input.Verbosity.tag] (+				G.ReqArg (+					Just . (,) Input.Verbosity.tag . Just &&& Input.CommandLineOption.mkOptionsMutator . setVerbosity+				) . mkTypeString $ Text.ShowList.capitaliseInitial Input.Verbosity.tag+			) . showString outputString . showString "define the log-level; default '" $ shows (Input.UIOptions.getVerbosity defaultUIOptions) "'."+		 ] where+			mkTypeString :: ShowS+			mkTypeString s	= showChar '<' $ showString s ">"++			intString, filePathString, executionString, infoString, inputString, outputString :: String+			intString	= "Int"+			filePathString	= "File-path"+			executionString	= "Execution: "+			infoString	= "Info: "+			inputString	= "Input: "+			outputString	= "Output: "++			defaultUIOptions :: Input.UIOptions.UIOptions Row Column+			defaultUIOptions	= Data.Default.def++			defaultRandomSeed :: Input.Options.RandomSeed+			defaultRandomSeed	= 0++-- Unary options-mutators.+			setPrintMoveTree, setVerbosity, setOutputConfigFilePath	:: String -> Options -> Options+			setPrintMoveTree	= Input.Options.setMaybePrintMoveTree . Just . Input.CommandLineOption.readArg+			setVerbosity		= Input.Options.setVerbosity . Input.CommandLineOption.readArg+			setOutputConfigFilePath	= Input.Options.setMaybeOutputConfigFilePath . Just++			setRandomSeed :: Maybe String -> Options -> Options+			setRandomSeed	= Input.Options.setMaybeRandomSeed . Just . Data.Maybe.maybe defaultRandomSeed Input.CommandLineOption.readBoundedIntegral++-- Nullary I/O-actions.+			printHelp, printVersion :: IO ()+			printHelp	= Control.Monad.void . Text.Printf.printf "Usage:\t%s\nEBNF argument-format:\n\t%-9s = %s;\n\t%-9s = %s;\n\t%-9s = %s;\n" (+				G.usageInfo progName optDescrList+			 ) filePathString (+				showString fileNameTag . showString " ('" . showChar System.FilePath.pathSeparator . showString "' " $ showString fileNameTag ")*"+			 ) intString "[0-9]+" (+				Text.ShowList.capitaliseInitial Input.Verbosity.tag+			 ) $ ToolShed.Data.List.showListWith ('(', '|', ')') Input.Verbosity.range " (* Case-sensitive *)" where+				fileNameTag :: String+				fileNameTag	= "File-name"++			printVersion	= putStrLn (+				showString progName . showChar '-' . showsVersion Paths.version . showString "\n\nCompiled by " . showString System.Info.compilerName . showChar '-' . showsVersion System.Info.compilerVersion . showString ".\n\nCopyright (C) 2018 " . showString author . showString ".\nThis program comes with ABSOLUTELY NO WARRANTY.\nThis is free software, and you are welcome to redistribute it under certain conditions.\n\nWritten by " $ showString author "."+			 ) >> System.Exit.exitSuccess where+				showsVersion :: Data.Version.Version -> ShowS+				showsVersion	= foldr (.) id . Data.List.intersperse (showChar '.') . map shows . Data.Version.versionBranch++			checkPickler, generateDTD :: IO ()+			checkPickler	= Control.Monad.void . HXT.runX $ HXT.constA (Data.Default.def :: Options) >>> HXT.checkPickler HXT.xpickle++			generateDTD	= Control.Monad.void . HXT.runX $ HXT.constA (undefined :: Options) >>> HXT.xpickleWriteDTD HXT.xpickle [+				HXT.withTrace 0 {-valid values in closed interval [0, 4]-}+			 ] "-" {-stdout-}	-- CAVEAT: this DTD requires manual correction of defaulted attributes, which are erroneously defined as 'REQUIRED' rather than 'IMPLIED'.++#ifdef USE_UNIX+	Concurrent.SignalHandlers.handleSignals+#endif++-- Use the list of possible options, to process the actual list of arguments.+	case G.getOpt G.RequireOrder optDescrList args of+		(commandLineOptions, [{-non-options-}], [{-errors-}])+			| not $ null ioActions				-> sequence_ ioActions >> System.Exit.exitSuccess+			| Just configFilePath <- maybeConfigFilePath	-> let+{-+	The strategy is to either parse XML for the input-options, then over-ride them with each of the command-line options-mutators,+	but regrettably "verbosity" (a command-line option) is needed while doing so.+	This is resolved by reading the "verbosity" from the command-line first.+-}+					preVerbosity :: Distribution.Verbosity.Verbosity+					preVerbosity+						| null verbosityArgs	= Data.Default.def+						| otherwise		= Input.CommandLineOption.readArg $ head verbosityArgs+						where+							verbosityArgs :: [String]+							verbosityArgs	= Input.CommandLineOption.getArgs (+								map (showString Input.CommandLineOption.longFlagPrefix) . drop 4 {-those prefixes ambiguous with "version"-} $ Data.List.inits Input.Verbosity.tag	-- Generate all unique abbreviations.+							 ) args++				in do+					fileExists	<- System.Directory.doesFileExist configFilePath++					if not fileExists+						then do+							cwd	<- System.Directory.getCurrentDirectory++							Control.Exception.throwIO . Data.Exception.mkSearchFailure . showString "no such file " . shows configFilePath $ (+								if preVerbosity == maxBound && System.FilePath.isRelative configFilePath+									then showString "; CWD=" . shows cwd+									else id+							 ) "."	-- This error would be trapped by HXT.xunpickleDocument, but it doesn't set the exit-status.+						else let+							configDir :: System.FilePath.FilePath+							configDir	= dataDir </> "config"++							inputSysConfig :: HXT.SysConfigList+							inputSysConfig	= [+								HXT.withRemoveWS HXT.yes,						-- Remove white-space, e.g. any indentation which might have been introduced by 'HXT.withIndent'.+								HXT.withStrictInput HXT.yes,						-- Read the input file strictly (cf. lazily), this ensures file-closure even if not completely read.+#ifdef USE_HXTRELAXNG+								Text.XML.HXT.RelaxNG.withRelaxNG $ configDir </> progName <.> "rng"	-- Validate against the referenced RelaxNG schema.+#else+								HXT.withValidate HXT.yes						-- Validate against any DTD referenced from the specified XML-file.+#endif+							 ]++							maximumTraceLevel :: Int+							maximumTraceLevel	= 2	-- CAVEAT: HXT trace-levels 3 & 4 are too verbose.++							processInputOptions :: Options -> IO Options+							processInputOptions options	= let+								options' :: Options+								options'	= (+									\o -> (+										if Data.Maybe.isNothing . Input.IOOptions.getMaybePersistence $ Input.Options.getIOOptions o+											then Input.Options.setMaybePersistence $ Just (+												appUserDataDir </> System.FilePath.takeBaseName configFilePath <.> "txt",+												True	-- Automatic.+											)+											else id+									) o+								 ) $ foldr ($) options optionsMutators	-- Sequentially mutate the configuration, using each of the options-mutators specified on the command-line.++								ioOptions				= Input.Options.getIOOptions options'+								(maybeOutputConfigFilePath, uiOptions)	= Input.IOOptions.getMaybeOutputConfigFilePath &&& Input.IOOptions.getUIOptions $ ioOptions+								verbosity				= Input.UIOptions.getVerbosity uiOptions+								(showsInfoPrefix, showsWarningPrefix)	= const (+									Text.Show.showsInfoPrefix,+									Text.Show.showsWarningPrefix+								 ) `either` const (+									Text.ShowList.showsInfoPrefix,+									Text.ShowList.showsWarningPrefix+								 ) $ Input.UIOptions.getEitherNativeUIOrCECPOptions uiOptions+							 in do+#ifdef TOOL_VERSION_ghc+								numProcessors	<- GHC.Conc.getNumProcessors++								Control.Monad.when (verbosity /= minBound && numProcessors > 1 && GHC.Conc.numCapabilities == 1) . System.IO.hPutStrLn System.IO.stderr . showsWarningPrefix . showString "this application typically benefits from " . shows numProcessors . showString " CPU-cores; try '" . showString progName . showChar ' ' $ showString (unwords args) " +RTS -N'."+#endif+								Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . showsInfoPrefix . showString Input.Options.tag . Text.ShowList.showsAssociation $ Property.ShowFloat.showsFloatToN (Input.UIOptions.getNDecimalDigits uiOptions) options' "."++								Control.Monad.when (Data.Maybe.isJust maybeOutputConfigFilePath) $ let+									Just outputConfigFilePath	= maybeOutputConfigFilePath+								 in Control.Exception.catch (+									writeXMLToFile outputConfigFilePath Input.Options.tag (+										configDir </> progName <.> "dtd"+									) options {-the original-}+								 ) $ \e -> Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . showsWarningPrefix . showString "failed to write the configuration in XML, to " . showString Input.IOOptions.outputConfigFilePathTag . Text.ShowList.showsAssociation . shows outputConfigFilePath . showString "; " $ shows (e :: Control.Exception.SomeException) "."	-- This error isn't fatal, so continue.++								randomGen	<- Data.Maybe.maybe (+									do+										Control.Monad.when (verbosity > Data.Default.def) . System.IO.hPutStrLn System.IO.stderr $ showsWarningPrefix "seeding the pseudo-random number-generator from the operating-system; the result will not typically be repeatable."++										System.Random.getStdGen+								 ) (+									return {-to IO-monad-} . System.Random.mkStdGen	-- Seed the pseudo-random number-generator with the specified integer.+								 ) $ Input.Options.getMaybeRandomSeed options'++								playState	<- uncurry (Play.play randomGen) . (,) options' =<< (	-- Artificially construct a pair, to reduce the strictness & thus allow the UI to be rendered while PGN-databases are evaluated in the background.+									\qualifiedMoveForest -> do+										Control.Monad.when (verbosity == maxBound && not (Property.Null.isNull qualifiedMoveForest)) $ mapM_ (+											System.IO.hPutStrLn System.IO.stderr . showsInfoPrefix . ($ ".")+										 ) [+											showString "resulting tree contains (nGames, nMoves)" . Text.ShowList.showsAssociation . shows (ContextualNotation.QualifiedMoveForest.count qualifiedMoveForest),	-- CAVEAT: application stalls during this call.++											showString "the minimum number of pieces remaining in any of the archived games" . Text.ShowList.showsAssociation . shows (ContextualNotation.QualifiedMoveForest.findMinimumPieces qualifiedMoveForest)+										 ]++										return {-to IO-monad-} qualifiedMoveForest+								 ) =<< Control.Monad.foldM (+									\qualifiedMoveForest pgnOptions -> let+										(pgnDatabaseFilePath, minimumPlies)	= Input.PGNOptions.getDatabaseFilePath &&& Input.PGNOptions.getMinimumPlies $ pgnOptions+										searchPath				= Data.List.nub $ [+											".",	-- CWD.+											dataDir	-- The installation-directory.+										 ] ++ Data.List.unfoldr (+											\filePath -> let+												directory	= System.FilePath.takeDirectory filePath+											in if directory `elem` map return {-to List-monad-} ['.', System.FilePath.pathSeparator]+												then Nothing+												else Just (directory, directory)+										 ) executablePath+									in either (+										Control.Exception.throwIO . Data.Exception.mkParseFailure+									) (+										(+											\pgnDatabase -> do+												Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . showsInfoPrefix . showString "read PGN-database" . Text.ShowList.showsAssociation . shows pgnDatabaseFilePath . showString " containing (nGames, nMoves)" . Text.ShowList.showsAssociation $ shows (+													Data.List.foldl' (+														\acc pgn -> let+															acc'@(nGames, nPlies)	= succ *** (+																+ State.TurnsByLogicalColour.getNPlies (Model.Game.getTurnsByLogicalColour $ ContextualNotation.PGN.getGame pgn)+															 ) $ acc+														in nGames `seq` nPlies `seq` acc'+													) (0 :: Model.Game.NGames, 0) pgnDatabase+												 ) "."	-- CAVEAT: this stalls rendering of a native UI.++												return {-to IO-monad-} $ ContextualNotation.QualifiedMoveForest.mergePGNDatabase pgnDatabase qualifiedMoveForest+										) . if minimumPlies == 0+											then id+											else filter $ (>= minimumPlies) . State.TurnsByLogicalColour.getNPlies . Model.Game.getTurnsByLogicalColour . ContextualNotation.PGN.getGame+									) =<< Data.Maybe.maybe (+										Control.Exception.throwIO . Data.Exception.mkSearchFailure . showString "failed to locate " . shows pgnDatabaseFilePath . showString " in " $ shows searchPath "."+									) (+										\absolutePGNDatabaseFilePath -> ContextualNotation.PGNDatabase.parseIO absolutePGNDatabaseFilePath (+											Input.PGNOptions.getIsStrictlySequential pgnOptions+										) (+											Input.PGNOptions.getValidateMoves pgnOptions+										) (+											Input.PGNOptions.getIdentificationTags pgnOptions+										)+									) . Data.Maybe.listToMaybe =<< ToolShed.System.File.locate pgnDatabaseFilePath searchPath+								 ) Property.Empty.empty {-QualifiedMoveForest-} (Input.IOOptions.getPGNOptionsList ioOptions)++								let+									maybeApplicationTerminationReason	= State.PlayState.getMaybeApplicationTerminationReason (playState :: State.PlayState.PlayState Column T.CriterionValue T.CriterionWeight T.PieceSquareValue T.PositionHash T.RankValue Row T.WeightedMean T.X T.Y)+								 in Control.Monad.when (+									verbosity /= minBound && Data.Maybe.isJust maybeApplicationTerminationReason+								 ) . System.IO.hPutStrLn System.IO.stderr . showsInfoPrefix . showString "application terminated " $ shows (Data.Maybe.fromJust maybeApplicationTerminationReason) "."++								return {-to IO-monad-} options'+						in Control.Monad.void {-discard the state returned by processInputOptions-} . HXT.runX $ HXT.setTraceLevel (fromEnum preVerbosity `min` maximumTraceLevel) >>> HXT.xunpickleDocument HXT.xpickle inputSysConfig configFilePath >>> HXT.traceMsg (fromEnum preVerbosity `min` maximumTraceLevel) (showString Input.Options.tag " parsed") >>> HXT.arrIO processInputOptions+			| otherwise	-> Control.Exception.throwIO . Data.Exception.mkInsufficientData $ shows (Input.CommandLineOption.longFlagPrefix ++ inputConfigFilePathFlag) " must be specified."+			where+				ioActions		:: [IO ()]+				optionsMutators		:: [Options -> Options]+				maybeConfigFilePath	:: Maybe String+				(ioActions, optionsMutators, maybeConfigFilePath)	= Input.CommandLineOption.partition3 $ map snd commandLineOptions	-- Categorise the specified command-line options.+		(_, nonOptions, [])	-> Control.Exception.throwIO . Data.Exception.mkRedundantData . showString "unexpected command-line arguments; " $ shows nonOptions "."+		(_, _, errors)		-> Control.Exception.throwIO . Data.Exception.mkParseFailure $ concat errors+
+ src-lib/BishBosh/Attribute/CaptureMoveSortAlgorithm.hs view
@@ -0,0 +1,61 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the algorithm used to sort the immediately available capture-/move/s, before the evaluating the fitness of the resulting positions.+-}++module BishBosh.Attribute.CaptureMoveSortAlgorithm(+-- * Types+-- ** Data-types+	CaptureMoveSortAlgorithm(..),+-- * Constants+	tag,+	range+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "captureMoveSortAlgorithm"++-- | The algorithm by which moves are sorted.+data CaptureMoveSortAlgorithm+	= MVVLVA	-- ^ <https://chessprogramming.wikispaces.com/MVV-LVA>.+	| SEE		-- ^ <https://chessprogramming.wikispaces.com/Static+Exchange+Evaluation>.+	deriving (Eq, Read, Show)++instance Control.DeepSeq.NFData CaptureMoveSortAlgorithm where+	rnf _	= ()++instance Data.Default.Default CaptureMoveSortAlgorithm where+	def	= MVVLVA++-- | Constant.+range :: [CaptureMoveSortAlgorithm]+range	= [MVVLVA, SEE]++instance HXT.XmlPickler CaptureMoveSortAlgorithm where+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range+
+ src-lib/BishBosh/Attribute/ColourScheme.hs view
@@ -0,0 +1,158 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the physical colour used to represent each component of the display.+-}++module BishBosh.Attribute.ColourScheme (+-- * Types+-- ** Data-types+	ColourScheme(+--		MkColourScheme,+		getDarkPieceColour,+		getLightPieceColour,+		getDarkSquareColour,+		getLightSquareColour+	),+-- * Constants+	tag,+--	darkSquareColourTag,+--	lightSquareColourTag,+--	darkPieceColourTag,+--	lightPieceColourTag,+-- * Functions+-- ** Constructor+--	mkColourScheme+) where++import qualified	BishBosh.Attribute.PhysicalColour	as Attribute.PhysicalColour+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Text.ShowList			as Text.ShowList+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT++-- | Used to qualify XML.+tag :: String+tag	= "colourScheme"++darkPieceColourTag, darkSquareColourTag, lightPieceColourTag, lightSquareColourTag :: String+[darkPieceColourTag, darkSquareColourTag, lightPieceColourTag, lightSquareColourTag]	= [showString brightness $ showString component "Colour" | brightness <- ["dark", "light"], component <- ["Piece", "Square"]] -- List-comprehension.++-- | Defines the command-line options.+data ColourScheme	= MkColourScheme {+	getDarkPieceColour	:: Attribute.PhysicalColour.PhysicalColour,	-- ^ The physical colour of the dark pieces.+	getLightPieceColour	:: Attribute.PhysicalColour.PhysicalColour,	-- ^ The physical colour of the light pieces.+	getDarkSquareColour	:: Attribute.PhysicalColour.PhysicalColour,	-- ^ The physical colour of the dark squares of the board.+	getLightSquareColour	:: Attribute.PhysicalColour.PhysicalColour	-- ^ The physical colour of the light squares of the board.+} deriving Eq++instance Control.DeepSeq.NFData ColourScheme where+	rnf MkColourScheme {+		getDarkPieceColour	= darkPieceColour,+		getLightPieceColour	= lightPieceColour,+		getDarkSquareColour	= darkSquareColour,+		getLightSquareColour	= lightSquareColour+	} = Control.DeepSeq.rnf (+		darkPieceColour,+		lightPieceColour,+		darkSquareColour,+		lightSquareColour+	 )++instance Show ColourScheme where+	showsPrec _ MkColourScheme {+		getDarkPieceColour	= darkPieceColour,+		getLightPieceColour	= lightPieceColour,+		getDarkSquareColour	= darkSquareColour,+		getLightSquareColour	= lightSquareColour+	} = Text.ShowList.showsAssociationList' $ map (Control.Arrow.second shows) [+		(+			darkPieceColourTag,+			darkPieceColour+		), (+			lightPieceColourTag,+			lightPieceColour+		), (+			darkSquareColourTag,+			darkSquareColour+		), (+			lightSquareColourTag,+			lightSquareColour+		)+	 ]++instance Data.Default.Default ColourScheme where+	def = MkColourScheme {+		getDarkPieceColour	= Attribute.PhysicalColour.blue,+		getLightPieceColour	= Attribute.PhysicalColour.yellow,+		getDarkSquareColour	= Attribute.PhysicalColour.black,+		getLightSquareColour	= Attribute.PhysicalColour.white+	}++instance HXT.XmlPickler ColourScheme where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d) -> mkColourScheme a b c d,	-- Construct.+		\MkColourScheme {+			getDarkPieceColour	= darkPieceColour,+			getLightPieceColour	= lightPieceColour,+			getDarkSquareColour	= darkSquareColour,+			getLightSquareColour	= lightSquareColour+		} -> (+			darkPieceColour,+			lightPieceColour,+			darkSquareColour,+			lightSquareColour+		) -- Deconstruct.+	 ) $ HXT.xp4Tuple (+		getDarkPieceColour def `HXT.xpDefault` HXT.xpAttr darkPieceColourTag HXT.xpickle+	 ) (+		getLightPieceColour def `HXT.xpDefault` HXT.xpAttr lightPieceColourTag HXT.xpickle+	 ) (+		getDarkSquareColour def `HXT.xpDefault` HXT.xpAttr darkSquareColourTag HXT.xpickle+	 ) (+		getLightSquareColour def `HXT.xpDefault` HXT.xpAttr lightSquareColourTag HXT.xpickle+	 ) where+		def :: ColourScheme+		def	= Data.Default.def++-- | Smart constructor.+mkColourScheme+	:: Attribute.PhysicalColour.PhysicalColour	-- ^ Dark piece.+	-> Attribute.PhysicalColour.PhysicalColour	-- ^ Light piece.+	-> Attribute.PhysicalColour.PhysicalColour	-- ^ Dark square.+	-> Attribute.PhysicalColour.PhysicalColour	-- ^ Light square.+	-> ColourScheme+mkColourScheme darkPieceColour lightPieceColour darkSquareColour lightSquareColour+	| darkPieceColour `elem` bgColours		= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Attribute.ColourScheme.mkColourScheme:\t" . showString darkPieceColourTag . Text.ShowList.showsAssociation . shows darkPieceColour . showString " must differ from the physical colour of both squares; " $ shows bgColours "."+	| lightPieceColour `elem` bgColours		= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Attribute.ColourScheme.mkColourScheme:\t" . showString lightPieceColourTag . Text.ShowList.showsAssociation . shows lightPieceColour . showString " must differ from the physical colour of both squares; " $ shows bgColours "."+	| darkSquareColour == lightSquareColour		= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Attribute.ColourScheme.mkColourScheme:\tthe physical colours of " . shows lightSquareColourTag . showString " & " $ shows darkSquareColourTag ", must differ."+	| otherwise					= MkColourScheme {+		getDarkPieceColour	= darkPieceColour,+		getLightPieceColour	= lightPieceColour,+		getDarkSquareColour	= darkSquareColour,+		getLightSquareColour	= lightSquareColour+	}+	where+		bgColours	= [darkSquareColour, lightSquareColour]+
+ src-lib/BishBosh/Attribute/CriterionValue.hs view
@@ -0,0 +1,93 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the value of a single /criterion/, which quantifies the significance of some concept;+	many such criteria may exist, & their weighted-mean drives automated selection of /move/s.++	* Each /criterion-value/ is normalised into the /signed closed unit-interval/.++ [@CAVEAT@]++	* While this data-type could implement the classes 'Num', 'Fractional' & 'Real', these interfaces would allow one to construct invalid instances.+-}++module BishBosh.Attribute.CriterionValue(+-- * Types+-- ** Data-types+	CriterionValue(),+-- * Constants+	zero,+-- * Functions+	calculateWeightedMean,+-- ** Constructor+	mkCriterionValue+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.CriterionWeight			as Attribute.CriterionWeight+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues	as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Types						as T+import qualified	Control.Exception+import qualified	Factory.Math.Statistics++-- | Quantifies some criterion; the larger the signed value, the better.+newtype CriterionValue criterionValue	= MkCriterionValue criterionValue deriving (Eq, Show)++instance Num criterionValue => Bounded (CriterionValue criterionValue) where+	minBound	= MkCriterionValue $ negate 1+	maxBound	= MkCriterionValue 1++-- | Smart constructor.+mkCriterionValue :: (+	Num	criterionValue,+	Ord	criterionValue+ ) => criterionValue -> CriterionValue criterionValue+mkCriterionValue criterionValue	= Control.Exception.assert (abs criterionValue <= 1) $ MkCriterionValue criterionValue++-- | Constant.+zero :: Num criterionValue => CriterionValue criterionValue+zero	= MkCriterionValue 0++{- |+	* Calculates the /weighted mean/ of the specified 'CriterionValue's using the corresponding /criterion-weight/s.++	* Also writes individual unweighted 'CriterionValue's, to facilitate post-analysis;+	if the corresponding weight is @0@, evaluation of the criterion is, for efficiency, avoided.++	* CAVEAT: if all weights are @0@, then the result is indeterminate.+-}+calculateWeightedMean :: (+	Fractional	weightedMean,+	Real		criterionValue,+	Real		criterionWeight+ ) => [(CriterionValue criterionValue, Attribute.CriterionWeight.CriterionWeight criterionWeight)] -> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue+{-# SPECIALISE calculateWeightedMean :: [(CriterionValue T.CriterionValue, Attribute.CriterionWeight.CriterionWeight T.CriterionWeight)] -> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues T.WeightedMean T.CriterionValue #-}+calculateWeightedMean assocs	= uncurry Attribute.WeightedMeanAndCriterionValues.mkWeightedMeanAndCriterionValues $ (+	Factory.Math.Statistics.getWeightedMean &&& map fst+ ) [+	(bareCriterionValue, bareCriterionWeight) |+		(MkCriterionValue bareCriterionValue, criterionWeight)	<- assocs,+		let bareCriterionWeight	= Attribute.CriterionWeight.deconstruct criterionWeight,+		bareCriterionWeight /= 0+ ] -- List-comprehension.+
+ src-lib/BishBosh/Attribute/CriterionWeight.hs view
@@ -0,0 +1,90 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the weight associated with some /criterion/.++	* Each weighting is constrained to the unsigned /closed unit-interval/; negative values aren't permitted.++	* If the /criterion/ is considered unimportant, then its weight can be set to '0', whilst concepts of great significance can be set to '1'.++ [@CAVEAT@]++	* While this data-type could implement the classes 'Functor', 'Num', 'Fractional' & 'Real', these interfaces allow one to construct invalid instances.+-}++module BishBosh.Attribute.CriterionWeight(+-- * Types+-- ** Data-types+	CriterionWeight(+--		MkCriterionWeight,+		deconstruct+	),+-- * Functions+-- ** Constructor+	mkCriterionWeight+) where++import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Data.Num		as Data.Num+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Quantifies the relative significance, of a criterion; the larger the value, the more significant the criterion is relative to other criteria.+newtype CriterionWeight criterionWeight	= MkCriterionWeight {+	deconstruct	:: criterionWeight+} deriving (Eq, Ord)++instance Show criterionWeight => Show (CriterionWeight criterionWeight) where+	showsPrec _ (MkCriterionWeight criterionWeight)	= shows criterionWeight++instance Num criterionWeight => Bounded (CriterionWeight criterionWeight) where+	minBound	= MkCriterionWeight 0+	maxBound	= MkCriterionWeight 1++instance Num criterionWeight => Data.Default.Default (CriterionWeight criterionWeight) where+	def	= minBound++instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (CriterionWeight criterionWeight) where+	rnf (MkCriterionWeight criterionWeight)	= Control.DeepSeq.rnf criterionWeight++instance (+	HXT.XmlPickler	criterionWeight,+	Num		criterionWeight,+	Ord		criterionWeight,+	Show		criterionWeight+ ) => HXT.XmlPickler (CriterionWeight criterionWeight) where+	xpickle	= HXT.xpWrap (mkCriterionWeight, deconstruct) HXT.xpickle++-- | Smart constructor.+mkCriterionWeight :: (+	Num	criterionWeight,+	Ord	criterionWeight,+	Show	criterionWeight+ ) => criterionWeight -> CriterionWeight criterionWeight+mkCriterionWeight criterionWeight+	| Data.Num.inClosedUnitInterval criterionWeight	= MkCriterionWeight criterionWeight+	| otherwise					= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Attribute.CriterionWeight.mkCriterionWeight:\tweight" . Text.ShowList.showsAssociation $ shows criterionWeight " must be within the closed unit-interval, '[0,1]'."+
+ src-lib/BishBosh/Attribute/Direction.hs view
@@ -0,0 +1,269 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes a /direction/ in two parts; the sense of change in the /x/ coordinate & the sense of change in the /y/ coordinate.++	* The IO-format uses a more concise & familiar format based on 8 points of the compass.++	* CAVEAT: this separation of /direction/ into orthogonal components is driven by the typical use-case,+	but requires that one guards against accidental construction of a degenerate 9th /direction/ which defines neither a change in the /x/ coordinate nor the /y/ coordinate.+-}++module BishBosh.Attribute.Direction(+-- * Types+-- ** Type-synonyms+	NDirections,+	ByDirection,+-- ** Data-types+	Direction(+--		MkDirection,+		getXDirection,+		getYDirection+	),+-- * Constants+	nw,+	n,+	ne,+	w,+	e,+	sw,+	s,+	se,+	tag,+	nDistinctDirections,+	parallels,+	diagonals,+	range,+	opposites,+-- * Functions+--	reverseOrdering,+	advanceDirection,+	attackDirectionsForPawn,+	listArrayByDirection,+-- ** Constructor+	mkDirection,+-- ** Predicates+	areAligned+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Property.Orientated		as Property.Orientated+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.List.Extra+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "direction"++-- | Constant direction.+nw :: Direction+nw	= MkDirection LT GT++-- | Constant direction.+n :: Direction+n	= MkDirection EQ GT++-- | Constant direction.+ne :: Direction+ne	= MkDirection GT GT++-- | Constant direction.+w :: Direction+w	= MkDirection LT EQ++-- | Constant direction.+e :: Direction+e	= MkDirection GT EQ++-- | Constant direction.+sw :: Direction+sw	= MkDirection LT LT++-- | Constant direction.+s :: Direction+s	= MkDirection EQ LT++-- | Constant direction.+se :: Direction+se	= MkDirection GT LT++-- | A number of /direction/s.+type NDirections	= Int	-- N.B.: 'Data.Int.Int8' saves neither time nor space.++-- | Define a /direction/ by the sense of change to /x/ & /y/ coordinates.+data Direction	= MkDirection {+	getXDirection	:: Ordering,	-- ^ The sense of the change in the /x/-coordinate.+	getYDirection	:: Ordering	-- ^ The sense of the change in the /y/-coordinate.+} deriving (Eq, Ord)++instance Bounded Direction where+	minBound	= sw+	maxBound	= ne+{-+instance Control.DeepSeq.NFData Direction where+	rnf MkDirection {+		getXDirection	= xDirection,+		getYDirection	= yDirection+	} = Control.DeepSeq.rnf (xDirection, yDirection)+-}+instance Show Direction where+	showsPrec _ MkDirection {+		getXDirection	= xDirection,+		getYDirection	= yDirection+	} = (+		case yDirection of+			LT	-> showChar 'S'+			EQ	-> id+			GT	-> showChar 'N'+	 ) . (+		case xDirection of+			LT	-> showChar 'W'+			EQ	-> id+			GT	-> showChar 'E'+	 )++instance Read Direction where+	readsPrec _ ss	= let+		s'	= Data.List.Extra.trimStart ss+	 in case Data.List.Extra.upper s' of+		'S' : remainder	-> case remainder of+			'W' : _	-> [(sw, drop 2 s')]+			'E' : _	-> [(se, drop 2 s')]+			_	-> [(s, tail s')]+		'N' : remainder	-> case remainder of+			'W' : _	-> [(nw, drop 2 s')]+			'E' : _	-> [(ne, drop 2 s')]+			_	-> [(n, tail s')]+		'W' : _	-> [(w, tail s')]+		'E' : _	-> [(e, tail s')]+		_	-> []	-- No parse.++-- | Get the opposite.+reverseOrdering :: Ordering -> Ordering+reverseOrdering LT	= GT+reverseOrdering GT	= LT+reverseOrdering _	= EQ++instance Property.Opposable.Opposable Direction where+	getOpposite MkDirection {+		getXDirection	= xDirection,+		getYDirection	= yDirection+	} = MkDirection {+		getXDirection	= reverseOrdering xDirection,+		getYDirection	= reverseOrdering yDirection+	}++instance Property.Orientated.Orientated Direction where+	isDiagonal MkDirection { getXDirection = xDirection, getYDirection = yDirection }	= xDirection /= EQ && yDirection /= EQ+	isParallel MkDirection { getXDirection = xDirection, getYDirection = yDirection }	= xDirection == EQ || yDirection == EQ+	isStraight										= const True++instance Property.Reflectable.ReflectableOnX Direction where+	reflectOnX direction@MkDirection { getYDirection = yDirection }	= direction {+		getYDirection	= reverseOrdering yDirection+	}++instance Property.Reflectable.ReflectableOnY Direction where+	reflectOnY direction@MkDirection { getXDirection = xDirection }	= direction {+		getXDirection	= reverseOrdering xDirection+	}++instance HXT.XmlPickler Direction where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Data.Array.IArray.Ix Direction where+	range (lower, upper)						= Control.Exception.assert (lower == minBound && upper == maxBound) range+	inRange (lower, upper) _					= Control.Exception.assert (lower == minBound && upper == maxBound) True+	index (lower, upper) (MkDirection xDirection yDirection)	= Control.Exception.assert (lower == minBound && upper == maxBound) $ case xDirection of+		LT	-> case yDirection of+			LT	-> 0+			EQ	-> 1+			GT	-> 2+		EQ	-> case yDirection of+			LT	-> 3+			EQ	-> Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.Attribute.Direction.index:\tundefined direction."+			GT	-> 4+		GT	-> case yDirection of+			LT	-> 5+			EQ	-> 6+			GT	-> 7++-- | Smart-constructor.+mkDirection+	:: Ordering	-- ^ The sense of the change in the /x/-coordinate.+	-> Ordering	-- ^ The sense of the change in the /y/-coordinate.+	-> Direction+mkDirection EQ EQ			= Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.Attribute.Direction.mkDirection:\till-defined."+mkDirection xDirection yDirection	= MkDirection xDirection yDirection++-- | The ordered /direction/s in which a @Rook@ can move.+parallels :: [Direction]+parallels	= [w, s, n, e]++-- | The ordered /direction/s in which a @Bishop@ can move.+diagonals :: [Direction]+diagonals	= [sw, nw, se, ne]++-- | The ordered /direction/s in which /royalty/ can move.+range :: [Direction]+range	= [sw, w, nw, s, n, se, e, ne]++-- | The constant number of distinct /direction/s.+nDistinctDirections :: NDirections+nDistinctDirections	= length range++{- |+	* Returns a list of /direction/s, each paired with its anti-parallel.++	* CAVEAT: each /direction/ only appears once in the list, on an arbitrary side of a pair.+-}+opposites :: [(Direction, Direction)]+opposites	= map (id &&& Property.Opposable.getOpposite) [sw, w, nw, s]++-- | The /y/-direction in which a @Pawn@ of the specified /logical colour/ advances.+advanceDirection :: Attribute.LogicalColour.LogicalColour -> Ordering+advanceDirection Attribute.LogicalColour.Black	= LT	-- Black moves down.+advanceDirection _				= GT	-- White moves up.++-- | The /direction/s in which a @Pawn@ can attack.+attackDirectionsForPawn :: Attribute.LogicalColour.LogicalColour -> [Direction]+attackDirectionsForPawn logicalColour	= map (`MkDirection` advanceDirection logicalColour) [LT, GT]++-- | Whether the two /direction/s specified, are either parallel or anti-parallel.+areAligned :: Direction -> Direction -> Bool+areAligned direction	= uncurry (||) . ((== direction) &&& (== Property.Opposable.getOpposite direction))++-- | A boxed array indexed by /direction/, of arbitrary elements.+type ByDirection	= Data.Array.IArray.Array {-Boxed-} Direction++-- | Array-constructor.+listArrayByDirection :: Data.Array.IArray.IArray a e => [e] -> a Direction e+listArrayByDirection	= Data.Array.IArray.listArray (minBound, maxBound)+
+ src-lib/BishBosh/Attribute/LogicalColour.hs view
@@ -0,0 +1,124 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the data-type which represents the logical (rather than physical) colour of the two players & of /piece/s.++	* N.B.: conceptually different from the logical colour of squares on the board.+-}++module BishBosh.Attribute.LogicalColour(+-- * Types+-- ** Type-synonyms+	ByLogicalColour,+-- ** Data-types+	LogicalColour(..),+-- * Constants+--	tag,+	range,+	nDistinctLogicalColours,+-- * Functions+-- ** Constructor+	listArrayByLogicalColour,+-- ** Predicates+	isBlack+--	isWhite+) where++import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.List.Extra+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "logicalColour"++-- | The /logical colour/ associated with a player or a piece.+data LogicalColour+	= Black+	| White+	deriving (+		Bounded,+		Enum,+		Eq,+		Ord,+		Read,+		Show+	)++instance Control.DeepSeq.NFData LogicalColour where+	rnf _	= ()++instance Data.Array.IArray.Ix LogicalColour where+	range (lower, upper)			= Control.Exception.assert (lower == minBound && upper == maxBound) range+	inRange (lower, upper) logicalColour	= Control.Exception.assert (logicalColour >= lower && logicalColour <= upper) True+	index (lower, upper)			= Control.Exception.assert (lower == minBound && upper == maxBound) . fromEnum++-- | The constant ascending range of /logical colour/s.+range :: [LogicalColour]+range	= [minBound, maxBound]++-- | The constant number of distinct /logical colour/s.+nDistinctLogicalColours :: Int+nDistinctLogicalColours	= length range++instance HXT.XmlPickler LogicalColour where+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Property.Opposable.Opposable LogicalColour where+	getOpposite Black	= White+	getOpposite _		= Black++instance Property.ForsythEdwards.ReadsFEN LogicalColour where+	readsFEN s	= case Data.List.Extra.trimStart s of+		'b' : remainder	-> [(Black, remainder)]+		'w' : remainder	-> [(White, remainder)]+		_		-> []++instance Property.ForsythEdwards.ShowsFEN LogicalColour where+	showsFEN logicalColour	= showChar $ case logicalColour of+		Black	-> 'b'+		White	-> 'w'++-- | Whether the specified /logical colour/ is @Black@.+isBlack :: LogicalColour -> Bool+{-# INLINE isBlack #-}+isBlack Black	= True+isBlack _	= False++-- | Whether the specified /logical colour/ is @White@.+isWhite :: LogicalColour -> Bool+isWhite	= not . isBlack++-- | A boxed array indexed by /logical colour/, of arbitrary elements.+type ByLogicalColour	= Data.Array.IArray.Array LogicalColour++-- | Array-constructor.+listArrayByLogicalColour :: Data.Array.IArray.IArray a e => [e] -> a LogicalColour e+{-# INLINE listArrayByLogicalColour #-}+listArrayByLogicalColour	= Data.Array.IArray.listArray (minBound, maxBound)+
+ src-lib/BishBosh/Attribute/LogicalColourOfSquare.hs view
@@ -0,0 +1,56 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the data-type which represents the logical (rather than physical) colour of the squares on a chess-board.++	* N.B.: conceptually different from the logical colour of pieces.+-}++module BishBosh.Attribute.LogicalColourOfSquare(+-- * Types+-- ** Data-types+	LogicalColourOfSquare(),+-- * Constants+	black,+	white,+-- * Predicates+	isBlack+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour++newtype LogicalColourOfSquare	= MkLogicalColourOfSquare {+	deconstruct	:: Attribute.LogicalColour.LogicalColour+} deriving (Eq, Bounded)++-- | Constant.+black :: LogicalColourOfSquare+black	= MkLogicalColourOfSquare Attribute.LogicalColour.Black++-- | Constant.+white :: LogicalColourOfSquare+white	= MkLogicalColourOfSquare Attribute.LogicalColour.White++-- | Whether the specified /logical colour/ is @Black@.+isBlack :: LogicalColourOfSquare -> Bool+isBlack MkLogicalColourOfSquare { deconstruct = logicalColour }	= Attribute.LogicalColour.isBlack logicalColour
+ src-lib/BishBosh/Attribute/MoveType.hs view
@@ -0,0 +1,234 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Categorises /move/s, & provides ancillary information as required.+-}++module BishBosh.Attribute.MoveType(+-- * Types+-- ** Type-synonyms+--	IsShort,+-- ** Data-types+	MoveType(+		Castle,+		EnPassant,+		Normal+	),+-- * Constants+	tag,+	shortCastle,+	longCastle,+	enPassant,+-- * Functions+	nPiecesMutator,+-- ** Constructors+	mkMaybeNormalMoveType,+	mkNormalMoveType,+-- ** Predicates+	isCastle,+	isEnPassant,+--	isNormal,+	isCapture,+	isPromotion,+	isQuiet,+	isAcyclic,+-- ** Query+	getMaybeExplicitlyTakenRank,+	getMaybeImplicitlyTakenRank+) where++import qualified	BishBosh.Attribute.Rank	as Attribute.Rank+import qualified	BishBosh.Text.ShowList	as Text.ShowList+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.List.Extra+import qualified	Data.Maybe++-- | Used to qualify output.+tag :: String+tag	= "moveType"++-- | Self-documentation.+type IsShort	= Bool++-- | Constant value required to denote a /short castle/.+shortCastle :: MoveType+shortCastle	= Castle True++-- | Constant value required to denote a /long castle/.+longCastle :: MoveType+longCastle	= Castle False++-- | Constant.+enPassant :: MoveType+enPassant	= EnPassant++-- | Classifies the distinct types of /move/.+data MoveType+	= Castle IsShort	-- ^ Castling between the @King@ & one of its @Rook@s.+	| EnPassant		-- ^ Capture by a @Pawn@ of a @Pawn@ as it advanced two squares.+	| Normal {+		_getMaybeTakenRank	:: Maybe Attribute.Rank.Rank,	-- ^ The /rank/ of any opposing /piece/ which was just taken.+		_getMaybePromotionRank	:: Maybe Attribute.Rank.Rank	-- ^ The /rank/ of any /piece/ to which a @Pawn@ was just promoted.+	}+	deriving Eq++instance Show MoveType where+	showsPrec _ (Castle isShort)				= showString "Castle (short" . Text.ShowList.showsAssociation . shows isShort . showChar ')'+	showsPrec _ EnPassant					= showString "En-passant"+	showsPrec _ (Normal maybeTakenRank maybePromotionRank)	= Text.ShowList.showsAssociationList' $ Data.Maybe.catMaybes [+		fmap ((,) "takenRank" . shows) maybeTakenRank,+		fmap ((,) "promotionRank" . shows) maybePromotionRank+	 ]++instance Read MoveType where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		'C' : 'a' : 's' : 't' : 'l' : 'e' : s1	-> [+			(Castle isShort, remainder) |+				("(", s2)		<- lex s1,+				("short", s3)		<- lex s2,+				("=", s4)		<- lex s3,+				(isShort, s5)		<- reads s4,+				(")", remainder)	<- lex s5+		 ] -- List-comprehension.+		'E' : 'n' : '-' : 'p' : 'a' : 's' : 's' : 'a' : 'n' : 't' : remainder	-> [(EnPassant, remainder)]+		_ -> [+			(normalMoveType, remainder) |+				("{", s1)			<- lex s,+				(maybeTakenRank, s2)		<- case [+					pair |+						("takenRank", s11)	<- lex s1,+						("=", s12)		<- lex s11,+						pair			<- reads s12+				] of+					[]	-> [(Nothing, s1)]	-- Infer that nothing was taken.+					parsed	-> map (Control.Arrow.first Just) parsed,+				s3	<- return $ case lex s2 of+					[(",", s21)]	-> s21+					_		-> s2,+				(maybePromotionRank, s4)	<- case [+					pair |+						("promotionRank", s31)	<- lex s3,+						("=", s32)		<- lex s31,+						pair			<- reads s32+				] of+					[]	-> [(Nothing, s3)]	-- Infer that there was no promotion.+					parsed	-> map (Control.Arrow.first Just) parsed,+				("}", remainder)		<- lex s4,+				normalMoveType			<- Data.Maybe.maybeToList $ mkMaybeNormalMoveType maybeTakenRank maybePromotionRank+		 ] -- List-comprehension.++instance Control.DeepSeq.NFData MoveType where+	rnf (Castle isShort)	= Control.DeepSeq.rnf isShort+	rnf (Normal t p)	= Control.DeepSeq.rnf (t, p)+	rnf _			= ()++instance Data.Default.Default MoveType where+	def	= Normal Nothing Nothing++instance Attribute.Rank.Promotable MoveType where+	getMaybePromotionRank (Normal _ maybePromotionRank)	= maybePromotionRank+	getMaybePromotionRank _					= Nothing++-- | Smart-constructor for normal move-types.+mkMaybeNormalMoveType+	:: Maybe Attribute.Rank.Rank	-- ^ The /rank/ of any opposing /piece/ which was just taken.+	-> Maybe Attribute.Rank.Rank	-- ^ The /rank/ to which a @Pawn@ was just promoted.+	-> Maybe MoveType		-- ^ Maybe the required /move-type/.+mkMaybeNormalMoveType maybeTakenRank maybePromotionRank+	| Data.Maybe.maybe True {-nothing taken-} (/= Attribute.Rank.King) maybeTakenRank+	, Data.Maybe.maybe True {-nothing promoted-} (+		`elem` Attribute.Rank.promotionProspects+	) maybePromotionRank	= Just $ Normal maybeTakenRank maybePromotionRank+	| otherwise		= Nothing++-- | Smart-constructor for normal move-types.+mkNormalMoveType+	:: Maybe Attribute.Rank.Rank	-- ^ The /rank/ of any opposing /piece/ which is to be taken.+	-> Maybe Attribute.Rank.Rank	-- ^ The /rank/ to which a @Pawn@ is to be promoted.+	-> MoveType+mkNormalMoveType maybeTakenRank maybePromotionRank	= Control.Exception.assert (+	Data.Maybe.maybe True {-nothing taken-} (+		/= Attribute.Rank.King+	) maybeTakenRank && Data.Maybe.maybe True {-nothing promoted-} (+		`elem` Attribute.Rank.promotionProspects+	) maybePromotionRank+ ) $ Normal maybeTakenRank maybePromotionRank++-- | Predicate.+isCastle :: MoveType -> Bool+isCastle (Castle _)	= True+isCastle _		= False++-- | Predicate.+isEnPassant :: MoveType -> Bool+isEnPassant EnPassant	= True+isEnPassant _		= False++-- | Whether the /move/ was neither @EnPassant@ nor @Castle@.+isNormal :: MoveType -> Bool+isNormal (Normal _ _)	= True+isNormal _		= False++-- | Whether a piece was captured, including @Pawn@s taken En-passant.+isCapture :: MoveType -> Bool+{-# INLINE isCapture #-}+isCapture (Normal (Just _) _)	= True+isCapture moveType		= isEnPassant moveType++-- | Whether the /move/ includes @Pawn@-promotion.+isPromotion :: MoveType -> Bool+isPromotion (Normal _ (Just _))	= True+isPromotion _			= False++-- | <https://chessprogramming.wikispaces.com/Quiet+Moves>.+isQuiet :: MoveType -> Bool+isQuiet (Normal Nothing Nothing)	= True+isQuiet	moveType			= isCastle moveType++{- |+	* Whether the /move/ can't be a member of a repeated cycle.++	* CAVEAT: one can't infer from a negative result that the move can be repeated, since the mover may have been a @Pawn@.+-}+isAcyclic :: MoveType -> Bool+isAcyclic (Normal Nothing Nothing)	= False+isAcyclic _				= True++-- | Query whether a /piece/ was explicitly taken, excluding @Pawn@s taken En-passant.+getMaybeExplicitlyTakenRank :: MoveType -> Maybe Attribute.Rank.Rank+getMaybeExplicitlyTakenRank (Normal maybeTakenRank _)	= maybeTakenRank+getMaybeExplicitlyTakenRank _				= Nothing++-- | Query whether a /piece/ was taken either explicitly, or implicitly during En-passant.+getMaybeImplicitlyTakenRank :: MoveType -> Maybe Attribute.Rank.Rank+getMaybeImplicitlyTakenRank EnPassant	= Just Attribute.Rank.Pawn+getMaybeImplicitlyTakenRank moveType	= getMaybeExplicitlyTakenRank moveType++-- | Returns the mutator required to adjust the number of pieces after a move.+nPiecesMutator :: Enum nPieces => MoveType -> (nPieces -> nPieces)+{-# INLINE nPiecesMutator #-}+nPiecesMutator moveType+	| isCapture moveType	= pred+	| otherwise		= id+
+ src-lib/BishBosh/Attribute/PhysicalColour.hs view
@@ -0,0 +1,140 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the data-type which represents the physical (rather than logical) colour of the /board/ & of /piece/s.++	* The number of physical colours used to represent the /board/ & /piece/s can be greater than the two /logical colour/s required,+	but is limited in practice, since the terminal (optionally) used to render the image, typically can't cope with with a large number.+-}++module BishBosh.Attribute.PhysicalColour(+-- * Types+-- ** Type-synonyms+--	ANSIColourCode,+-- ** Data-types+	PhysicalColour(..),+-- * Constants+	black,+	red,+	green,+	yellow,+	blue,+	magenta,+	cyan,+	white,+	range,+-- * Functions+--	toANSIColourCode,+	mkFgColourCode,+	mkBgColourCode,+	selectGraphicsRendition,+	bracket+) where++import qualified	Control.DeepSeq+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Defines the physical colours which can typically be rendered by a terminal.+data PhysicalColour+	= Black+	| Red+	| Green+	| Yellow+	| Blue+	| Magenta+	| Cyan+	| White+	deriving (Enum, Eq, Read, Show)++instance Control.DeepSeq.NFData PhysicalColour where+	rnf _	= ()++instance Bounded PhysicalColour where+	minBound	= black+	maxBound	= white++instance HXT.XmlPickler PhysicalColour where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++-- | Constant.+black :: PhysicalColour+black	= Black++-- | Constant.+red :: PhysicalColour+red	= Red++-- | Constant.+green :: PhysicalColour+green	= Green++-- | Constant.+yellow :: PhysicalColour+yellow	= Yellow++-- | Constant.+blue :: PhysicalColour+blue	= Blue++-- | Constant.+magenta :: PhysicalColour+magenta	= Magenta++-- | Constant.+cyan :: PhysicalColour+cyan	= Cyan++-- | Constant.+white :: PhysicalColour+white	= White++-- | The constant complete range of values.+range :: [PhysicalColour]+range	= [minBound .. maxBound]++-- | A colour-code, as used by terminal-emulators; <https://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape-codes>.+type ANSIColourCode	= Int++-- | Offset the specified colour-code, so that it applies to the foreground.+mkFgColourCode :: PhysicalColour -> ANSIColourCode+mkFgColourCode	= (+ 30) . toANSIColourCode++-- | Offset the specified colour-code, so that it applies to the background.+mkBgColourCode :: PhysicalColour -> ANSIColourCode+mkBgColourCode	= (+ 40) . toANSIColourCode++-- | Translate.+toANSIColourCode :: PhysicalColour -> ANSIColourCode+toANSIColourCode	= fromEnum	-- CAVEAT: the order of the data-constructors has been defined with this in mind.++-- | Generate the escape-sequence required to change a terminal to the specified physical colour.+selectGraphicsRendition :: Bool -> ANSIColourCode -> String+selectGraphicsRendition isBold parameter	= showString "\x1b[" . shows parameter $ (if isBold then showString ";1" else id) "m"++-- | Render the specified string according to instructions, then revert to default.+bracket :: String -> String -> ShowS+bracket graphicsRendition s	= showString graphicsRendition . showString s . showString (+	selectGraphicsRendition False 0+ )+
+ src-lib/BishBosh/Attribute/Rank.hs view
@@ -0,0 +1,202 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data-type which represents the rank of a chess-/piece/; cf. a row of the /board/.+-}++module BishBosh.Attribute.Rank(+-- * Type-classes+	Promotable(..),+-- * Types+-- ** Type-synonyms+	EvaluateRank,+--	NRanks,+	ByRank,+-- ** Data-types+	Rank(..),+-- * Constants+	tag,+	flank,+	promotionProspects,+	defaultPromotionRank,+	plodders,+	fixedAttackRange,+	individuallySufficientMaterial,+--	royalty+	pieces,+	nobility,+	range,+	expendable,+	nDistinctRanks,+-- * Functions+	compareByLVA,+-- ** Constructor+	listArrayByRank+) where++import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Char+import qualified	Data.List+import qualified	Data.Ord+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "rank"++-- | That part of the difference between chess-/piece/s which is independent of their /logical colour/.+data Rank+	= Pawn+	| Rook+	| Knight+	| Bishop+	| Queen+	| King+	deriving (+		Bounded,+		Enum,+		Eq,+		Ord+	)++instance Control.DeepSeq.NFData Rank where+	rnf _	= ()++instance Data.Array.IArray.Ix Rank where+{-+	range				= uncurry enumFromTo+	inRange (lower, upper) rank	= rank >= lower && rank <= upper+	index (lower, _) rank		= fromEnum rank - fromEnum lower+-}+	range (lower, upper)		= Control.Exception.assert (lower == minBound && upper == maxBound) range+	inRange (lower, upper) rank	= Control.Exception.assert (rank >= lower && rank <= upper) True+	index (lower, upper)		= Control.Exception.assert (lower == minBound && upper == maxBound) . fromEnum++instance Show Rank where+	showsPrec _ rank	= showChar $ case rank of+		Pawn	-> 'p'+		Rook	-> 'r'+		Knight	-> 'n'+		Bishop	-> 'b'+		Queen	-> 'q'+		King	-> 'k'++instance Read Rank where+	readsPrec _ (c : s)+		| Data.Char.isSpace c	= reads s	-- Consume.+		| otherwise		= map (flip (,) s) $ case Data.Char.toLower c of+			'p'	-> [Pawn]+			'r'	-> [Rook]+			'n'	-> [Knight]+			'b'	-> [Bishop]+			'q'	-> [Queen]+			'k'	-> [King]+			_	-> []	-- No parse.+	readsPrec _ _	= []	-- No parse.++instance HXT.XmlPickler Rank where+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++-- | The distinct /rank/s of the constant ordered range of those /piece/s of which each side has two.+flank :: [Rank]+flank			= [Rook, Knight, Bishop]++-- | The constant list of distinct /rank/ to which a @Pawn@ may legally be promoted; though there's no point in promotion to other than @Queen@ or @Knight@.+promotionProspects :: [Rank]+promotionProspects	= Queen : flank++-- | Constant /rank/ to which a @Pawn@ is, in the absence of instruction, promoted.+defaultPromotionRank :: Rank+defaultPromotionRank	= Queen++-- | The subset of ranks which can only move in single steps.+plodders :: [Rank]+plodders		= [Pawn, King]++-- | The subset of ranks which attack over a fixed range.+fixedAttackRange :: [Rank]+fixedAttackRange	= Knight : plodders++-- | The subset of ranks which (unsupported) are sufficient to force checkmate.+individuallySufficientMaterial :: [Rank]+individuallySufficientMaterial	= [Pawn, Rook, Queen]++-- | A subset of /rank/s.+royalty :: [Rank]+royalty		= [Queen, King]++-- | A subset of /rank/s, which excludes @ Pawn @.+pieces :: [Rank]+pieces		= flank ++ royalty++-- | The /rank/s of the constant ordered back row of /piece/s, including duplicates.+nobility :: [Rank]+nobility	= pieces ++ reverse flank++-- | The constant ascending list of all /rank/s.+range :: [Rank]+range		= [minBound .. maxBound]++-- | Those ranks which can be taken.+expendable :: [Rank]+expendable	= Data.List.delete King range++-- | The type of a function which returns a Rank's value.+type EvaluateRank rankValue	= Rank -> rankValue++{- |+	* Compares the rank-value of aggressors.++	* N.B.: a @King@ is always considered most valuable, regardless of the evaluation-function supplied.+-}+compareByLVA+	:: Ord rankValue+	=> EvaluateRank rankValue+	-> Rank+	-> Rank+	-> Ordering+compareByLVA evaluateRank rankL rankR+	| rankL == rankR	= EQ+	| rankL == King		= GT+	| rankR == King		= LT+	| otherwise		= Data.Ord.comparing evaluateRank rankL rankR++-- | A number of arbitrary ranks.+type NRanks	= Int++-- | The constant number of distinct /rank/s.+nDistinctRanks :: NRanks+nDistinctRanks	= length range++-- | A boxed array indexed by /rank/, of arbitrary values.+type ByRank	= Data.Array.IArray.Array Rank++-- | Array-constructor.+listArrayByRank :: Data.Array.IArray.IArray a e => [e] -> a Rank e+listArrayByRank	= Data.Array.IArray.listArray (minBound, maxBound)++-- | An interface to which data which can represent @Pawn@-promotion, can implement.+class Promotable a where+	getMaybePromotionRank	:: a -> Maybe Rank+
+ src-lib/BishBosh/Attribute/RankValues.hs view
@@ -0,0 +1,140 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* The relative values of the various /rank/s of chess-piece.++	* <https://en.wikipedia.org/wiki/Chess_piece_relative_value#Hans_Berliner.27s_system Chess-piece relative values>+-}++module BishBosh.Attribute.RankValues(+-- * Types+-- ** Data-types+	RankValues(),+-- * Constants+	tag,+-- * Functions+	findRankValue,+	calculateMaximumTotalValue,+-- ** Constructor+	fromAssocs+) where++import			Control.Arrow((***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Data.Num		as Data.Num+import qualified	BishBosh.Property.ShowFloat	as Property.ShowFloat+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag	= "rankValues"++{- |+	* The constant value associated with each /rank/; the higher, the more valuable it is considered to be.++	* N.B.: only relative values are significant; the absolute value associated with any /rank/ is irrelevant, but typically @Pawn = 1@.++	* CAVEAT: a @King@ can never be taken, but assigning the value /infinity/ creates problems, so typically it has the value @0@.+-}+newtype RankValues rankValue	= MkRankValues {+	deconstruct	:: Attribute.Rank.ByRank rankValue+} deriving (Eq, Read, Show)++instance Real rankValue => Property.ShowFloat.ShowFloat (RankValues rankValue) where+	showsFloat fromDouble	= Text.ShowList.showsAssociationList' . map (show *** fromDouble . realToFrac) . Data.Array.IArray.assocs . deconstruct++-- Derived from Larry Kaufman's values; <https://chessprogramming.wikispaces.com/Point+Value>.+instance (+	Fractional	rankValue,+	Ord		rankValue,+	Show		rankValue+ ) => Data.Default.Default (RankValues rankValue) where+	def = fromAssocs [+		(+			Attribute.Rank.Pawn,	0.1+		), (+			Attribute.Rank.Rook,	0.525+		), (+			Attribute.Rank.Knight,	0.35+		), (+			Attribute.Rank.Bishop,	0.35+		), (+			Attribute.Rank.Queen,	1+		), (+			Attribute.Rank.King,	0	-- N.B.: move-selection is independent of this value (since it can't be taken), so it can be defined arbitrarily.+		)+	 ]++instance Control.DeepSeq.NFData rankValue => Control.DeepSeq.NFData (RankValues rankValue) where+	rnf (MkRankValues byRank)	= Control.DeepSeq.rnf byRank++instance (+	Fractional	rankValue,+	HXT.XmlPickler	rankValue,+	Ord		rankValue,+	Show		rankValue+ ) => HXT.XmlPickler (RankValues rankValue) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpWrap (+		fromAssocs,				-- Construct from an association-list.+		Data.Array.IArray.assocs . deconstruct	-- Deconstruct to an association-list.+	 ) . HXT.xpList1 . HXT.xpElem tag $ HXT.xpickle {-rank-} `HXT.xpPair` HXT.xpAttr "value" HXT.xpickle++-- | Smart-constructor.+fromAssocs :: (+	Fractional	rankValue,+	Ord		rankValue,+	Show		rankValue+ ) => [(Attribute.Rank.Rank, rankValue)] -> RankValues rankValue+fromAssocs assocs+	| not $ Data.Set.null undefinedRanks	= Control.Exception.throw . Data.Exception.mkInsufficientData . showString "BishBosh.Attribute.RankValues.fromAssocs:\tranks" . Text.ShowList.showsAssociation $ shows (Data.Set.toList undefinedRanks) " are undefined."+	| any (+		not . Data.Num.inClosedUnitInterval . snd {-rank-value-}+	) assocs				= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Attribute.RankValues.fromAssocs:\tall values must be within the closed unit-interval, [0,1]; " $ shows assocs "."+	| otherwise				= MkRankValues byRank+	where+		undefinedRanks	= Data.Set.fromAscList Attribute.Rank.range `Data.Set.difference` Data.Set.fromList (map fst assocs)+		byRank		= Data.Array.IArray.array (minBound, maxBound) assocs++-- | Query.+findRankValue :: Attribute.Rank.Rank -> RankValues rankValue -> rankValue+findRankValue rank (MkRankValues byRank)	= byRank ! rank++{- |+	* The maximum total rank-value one side can have.++	* CAVEAT: assumes that zero pieces have been captured, all @Pawn@s have been queened, & that this is the most valuable /rank/ of /piece/.+-}+calculateMaximumTotalValue :: Num rankValue => RankValues rankValue -> rankValue+calculateMaximumTotalValue (MkRankValues byRank)	= 9 {-accounting for all possible promotions-} * (byRank ! Attribute.Rank.Queen) + 2 * Data.List.foldl' (+	\acc -> (+ acc) . (byRank !)+ ) 0 Attribute.Rank.flank+
+ src-lib/BishBosh/Attribute/WeightedMeanAndCriterionValues.hs view
@@ -0,0 +1,83 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The unweighted values of each criterion used to assess the fitness of a position, & the resulting weighted mean.+-}++module BishBosh.Attribute.WeightedMeanAndCriterionValues(+-- * Types+-- ** Data-types+	WeightedMeanAndCriterionValues(+--		MkWeightedMeanAndCriterionValues,+		getWeightedMean,+		getCriterionValues+	),+-- * Constants+	criterionValuesTag,+	weightedMeanTag,+-- * Functions+	negateWeightedMean,+-- ** Constructor+	mkWeightedMeanAndCriterionValues+) where++import qualified	BishBosh.Property.ShowFloat	as Property.ShowFloat+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq++-- | Qualifies output.+criterionValuesTag :: String+criterionValuesTag	= "criterion-values"++-- | Qualifies output.+weightedMeanTag :: String+weightedMeanTag		= "weighted-mean"++-- | A /weighted mean/ & the individual unweighted criterion-value from which it was composed.+data WeightedMeanAndCriterionValues weightedMean criterionValue	= MkWeightedMeanAndCriterionValues {+	getWeightedMean		:: weightedMean,	-- ^ The weighted mean of a list of criterion-values.+	getCriterionValues	:: [criterionValue]	-- ^ The unweighted 'CriterionValue's from which the weighted mean was composed.+} deriving (Eq, Show)++instance Control.DeepSeq.NFData weightedMean => Control.DeepSeq.NFData (WeightedMeanAndCriterionValues weightedMean criterionValue) where+	rnf MkWeightedMeanAndCriterionValues { getWeightedMean = weightedMean }	= Control.DeepSeq.rnf weightedMean	-- The other field is a prerequisite.++instance (Real criterionValue, Real weightedMean) => Property.ShowFloat.ShowFloat (WeightedMeanAndCriterionValues weightedMean criterionValue) where+	showsFloat fromDouble MkWeightedMeanAndCriterionValues {+		getWeightedMean		= weightedMean,+		getCriterionValues	= criterionValues+	} = Text.ShowList.showsAssociationList' [+		(weightedMeanTag, fromDouble $ realToFrac weightedMean),+		(criterionValuesTag, Text.ShowList.showsFormattedList' (fromDouble . realToFrac) criterionValues)+	 ]++-- | Constructor+mkWeightedMeanAndCriterionValues :: weightedMean -> [criterionValue] -> WeightedMeanAndCriterionValues weightedMean criterionValue+mkWeightedMeanAndCriterionValues	= MkWeightedMeanAndCriterionValues++{- |+	* Negate the weightedMean, but leave the criterion-values unaltered.++	* This can be used to assess the fitness of a position from the perspective of one's opponent.+-}+negateWeightedMean :: Num weightedMean => WeightedMeanAndCriterionValues weightedMean criterionValue -> WeightedMeanAndCriterionValues weightedMean criterionValue+negateWeightedMean weightedMeanAndCriterionValues@MkWeightedMeanAndCriterionValues { getWeightedMean = weightedMean }	= weightedMeanAndCriterionValues { getWeightedMean = negate weightedMean }+
+ src-lib/BishBosh/Cartesian/Abscissa.hs view
@@ -0,0 +1,128 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes the /x/-axis by which the /board/ is indexed.++	* N.B. this coordinate-system is for internal use only, and doesn't attempt to replicate any standard Chess-notation.+-}++module BishBosh.Cartesian.Abscissa(+-- * Types+	ByAbscissa,+-- * Constants+	xOrigin,+	xLength,+	xMin,+	xMax,+--	xBounds,+	xRange,+	centre,+-- * Functions+	reflect,+	translate,+	maybeTranslate,+	getAdjacents,+-- ** Constructors+	listArrayByAbscissa,+-- ** Predicates+	inBounds+) where++import qualified	BishBosh.Types	as T+import qualified	Control.Exception+import qualified	Data.Array.IArray++-- | The constant length of the /x/-axis.+xOrigin :: Int+xOrigin	= 0++-- | The constant length of the /x/-axis.+xLength :: T.Distance+xLength	= 8++-- | The constant lower bound of the abscissa.+xMin :: Enum x => x+xMin	= toEnum xOrigin++-- | The constant upper bound of the abscissa.+xMax :: Enum x => x+xMax	= toEnum $ xOrigin + fromIntegral (pred {-fence-post-} xLength)++-- | The constant bounds of the abscissa.+xBounds :: Enum x => (x, x)+xBounds	= (xMin, xMax)++-- | The constant list of abscissa.+xRange :: Enum x => [x]+xRange	= uncurry enumFromTo xBounds++{- |+	* The constant centre of the span.++	* CAVEAT: no square actually exists at this fractional value.+-}+centre :: Fractional centre => centre+centre	= fromIntegral (uncurry (+) xBounds :: T.X) / 2++-- | Reflects about the mid-point of the axis.+reflect :: Enum x => x -> x+reflect	= toEnum . (+	+ (2 * xOrigin + fromIntegral (pred xLength))+ ) . negate . fromEnum++-- | Predicate.+inBounds :: (Enum x, Ord x) => x -> Bool+{-# INLINE inBounds #-}+inBounds x	= x >= xMin && x <= xMax++-- | Translate the specified ordinate.+translate :: (Enum x, Ord x) => (x -> x) -> x -> x+translate transformation	= (\x -> Control.Exception.assert (inBounds x) x) . transformation++-- | Where legal, translate the specified abscissa.+maybeTranslate :: (Enum x, Ord x) => (x -> x) -> x -> Maybe x+maybeTranslate transformation	= (+	\x -> if inBounds x+		then Just x+		else Nothing+ ) . transformation++-- | Get the abscissae immediately left & right.+getAdjacents :: (Enum x, Eq x) => x -> [x]+{-# INLINE getAdjacents #-}+getAdjacents x+	| x == xMin	= [succ x]+	| x == xMax	= [pred x]+	| otherwise	= [pred x, succ x]++-- | A boxed array indexed by /coordinates/, of arbitrary elements.+type ByAbscissa x	= Data.Array.IArray.Array {-Boxed-} x++-- | Array-constructor.+listArrayByAbscissa :: (+	Data.Array.IArray.IArray	a e,+	Data.Array.IArray.Ix		x,+	Enum				x+ ) => [e] -> a x e+listArrayByAbscissa	= Data.Array.IArray.listArray xBounds+
+ src-lib/BishBosh/Cartesian/Coordinates.hs view
@@ -0,0 +1,616 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRaPTION@]	The location of a square on the board.+-}++module BishBosh.Cartesian.Coordinates(+-- * Types+-- ** Data-types+	Coordinates(+--		MkCoordinates,+		getX,+		getY+	),+-- ** Type-synonyms+--	Transformation,+	ByCoordinates,+-- * Constants+	topLeft,+	bottomRight,+	nSquares,+--	range,+--	extrapolationsByCoordinatesByDirection,+--	interpolationsBySourceByDestination,+	radiusSquared,+-- * Functions+--	(>||<),+	extrapolate,+--	extrapolateInt,+	interpolate,+--	interpolateInt,+	range,+	getLogicalColourOfSquare,+	kingsStartingCoordinates,+	rooksStartingCoordinates,+	measureDistance,+	translate,+	maybeTranslate,+	translateX,+	maybeTranslateX,+	translateY,+	maybeTranslateY,+	getAdjacents,+	advance,+--	maybeAdvance,+	retreat,+	maybeRetreat,+--	rotate,+-- ** Constructors+	mkCoordinates,+	mkMaybeCoordinates,+	fromIx,+	mkRelativeCoordinates,+	listArrayByCoordinates,+-- ** Predicates+--	inBounds,+	isPawnsFirstRank,+	isEnPassantRank,+	areSquaresIsochromatic+) where++import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.LogicalColourOfSquare	as Attribute.LogicalColourOfSquare+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Ordinate			as Cartesian.Ordinate+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.Property.Rotatable			as Property.Rotatable+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Maybe+import qualified	Factory.Math.Power++-- | The /coordinates/ of a square on the board.+data Coordinates x y	= MkCoordinates {+	getX	:: x,	-- ^ Abscissa.+	getY	:: y	-- ^ Ordinate.+} deriving Eq++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (Coordinates x y) where+	rnf MkCoordinates { getX = x, getY = y }	= Control.DeepSeq.rnf (x, y)++instance (Show x, Show y) => Show (Coordinates x y) where+	showsPrec _ MkCoordinates { getX = x, getY = y }	= shows (x, y)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y+ ) => Read (Coordinates x y) where+	readsPrec _ s	= [+		(coordinates, remainder) |+			((x, y), remainder)	<- reads s,+			coordinates		<- Data.Maybe.maybeToList $ mkMaybeCoordinates x y+	 ] -- List-comprehension.++instance (Ord x, Ord y) => Ord (Coordinates x y) where+	{-# SPECIALISE instance Ord (Coordinates T.X T.Y) #-}+	MkCoordinates { getX = x, getY = y } `compare` MkCoordinates { getX = x', getY = y' }	= (y, x) `compare` (y', x')	-- N.B.: x is less significant than y, as required by the implementation of 'Data.Array.IArray.Ix.inRange'.++instance (Enum x, Enum y) => Bounded (Coordinates x y) where+	minBound = MkCoordinates {+		getX	= Cartesian.Abscissa.xMin,+		getY	= Cartesian.Ordinate.yMin+	} -- Bottom Left.+	maxBound = MkCoordinates {+		getX	= Cartesian.Abscissa.xMax,+		getY	= Cartesian.Ordinate.yMax+	} -- Top Right.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Data.Array.IArray.Ix (Coordinates x y) where+	{-# SPECIALISE instance Data.Array.IArray.Ix (Coordinates T.X T.Y) #-}+	range (lower, upper)			= Control.Exception.assert (lower == minBound && upper == maxBound) range+	inRange (lower, upper) coordinates	= Control.Exception.assert (coordinates >= lower && coordinates <= upper) True+	index (lower, upper) MkCoordinates {+		getX	= x,+		getY	= y+	} = Control.Exception.assert (+		lower == minBound && upper == maxBound+	 ) $ fromIntegral Cartesian.Abscissa.xLength * (+		fromEnum y - Cartesian.Ordinate.yOrigin+	 ) + (+		fromEnum x - Cartesian.Abscissa.xOrigin+	 )++instance Enum y => Property.Reflectable.ReflectableOnX (Coordinates x y) where+	reflectOnX coordinates@MkCoordinates { getY = y }	= coordinates { getY = Cartesian.Ordinate.reflect y }++instance Enum x => Property.Reflectable.ReflectableOnY (Coordinates x y) where+	reflectOnY coordinates@MkCoordinates { getX = x }	= coordinates { getX = Cartesian.Abscissa.reflect x }++instance (Enum x, Enum y) => Property.Rotatable.Rotatable (Coordinates x y) where+	rotate90	= rotate Attribute.Direction.w+	rotate180	= rotate Attribute.Direction.s+	rotate270	= rotate Attribute.Direction.e++-- | Constant.+topLeft :: (Enum x, Enum y) => Coordinates x y+topLeft = MkCoordinates {+	getX	= Cartesian.Abscissa.xMin,+	getY	= Cartesian.Ordinate.yMax+}++-- | Constant.+bottomRight :: (Enum x, Enum y) => Coordinates x y+bottomRight = MkCoordinates {+	getX	= Cartesian.Abscissa.xMax,+	getY	= Cartesian.Ordinate.yMin+}++-- | The constant number of squares on the board.+nSquares :: Int+nSquares	= fromIntegral $ Cartesian.Abscissa.xLength * Cartesian.Ordinate.yLength++-- | Generates a raster over all the board's /coordinates/.+range :: (Enum x, Enum y) => [Coordinates x y]+{-# SPECIALISE range :: [Coordinates T.X T.Y] #-}+range	= [+	MkCoordinates {+		getX	= x,+		getY	= y+	} |+		y	<- Cartesian.Ordinate.yRange,+		x	<- Cartesian.Abscissa.xRange+ ] -- List-comprehension.++-- | Predicate.+inBounds :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> x+	-> y+	-> Bool+{-# INLINE inBounds #-}+inBounds x y	= Cartesian.Abscissa.inBounds x && Cartesian.Ordinate.inBounds y++-- | Constructor.+mkCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> x	-- ^ Abscissa.+	-> y	-- ^ Ordinate.+	-> Coordinates x y+mkCoordinates x y	= Control.Exception.assert (inBounds x y) $ MkCoordinates x y++-- | Safe constructor.+mkMaybeCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> x	-- ^ Abscissa.+	-> y	-- ^ Ordinate.+	-> Maybe (Coordinates x y)+mkMaybeCoordinates x y+	| inBounds x y	= Just MkCoordinates { getX = x, getY = y }+	| otherwise	= Nothing++{- |+	* Construct from the specified array-index.++	* CAVEAT: assumes that the array is indexed by the whole range of /coordinates/.+-}+fromIx :: (Enum x, Enum y) => Int -> Coordinates x y+fromIx	= (+	\(y, x) -> MkCoordinates {+		getX	= toEnum $ x + Cartesian.Abscissa.xOrigin,+		getY	= toEnum $ y + Cartesian.Ordinate.yOrigin+	}+ ) . (`divMod` fromIntegral Cartesian.Abscissa.xLength)++-- | Translate the specified /coordinates/.+translate :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => ((x, y) -> (x, y)) -> Coordinates x y -> Coordinates x y+translate transformation MkCoordinates {+	getX	= x,+	getY	= y+} = uncurry mkCoordinates $ transformation (x, y)++-- | Where legal, translate the specified /coordinates/.+maybeTranslate :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> ((x, y) -> (x, y))	-- ^ Translation.+	-> Coordinates x y+	-> Maybe (Coordinates x y)+{-# INLINE maybeTranslate #-}+maybeTranslate transformation MkCoordinates {+	getX	= x,+	getY	= y+} = uncurry mkMaybeCoordinates $ transformation (x, y)++-- | Translate the specified abscissa.+translateX :: (Enum x, Ord x) => (x -> x) -> Transformation x y+translateX transformation coordinates@MkCoordinates { getX = x }	= coordinates { getX = Cartesian.Abscissa.translate transformation x }++-- | Where legal, translate the /x/-component of the specified /coordinates/.+maybeTranslateX+	:: (Enum x, Ord x)+	=> (x -> x)	-- ^ Translation.+	-> Coordinates x y+	-> Maybe (Coordinates x y)+maybeTranslateX transformation coordinates@MkCoordinates { getX = x }	= (\x' -> coordinates { getX = x' }) `fmap` Cartesian.Abscissa.maybeTranslate transformation x++-- | Translate the specified ordinate.+translateY :: (Enum y, Ord y) => (y -> y) -> Transformation x y+translateY transformation coordinates@MkCoordinates { getY = y }	= coordinates { getY = Cartesian.Ordinate.translate transformation y }++-- | Where legal, translate the /y/-component of the specified /coordinates/.+maybeTranslateY+	:: (Enum y, Ord y)+	=> (y -> y)	-- ^ Translation.+	-> Coordinates x y+	-> Maybe (Coordinates x y)+maybeTranslateY transformation coordinates@MkCoordinates { getY = y }	= (\y' -> coordinates { getY = y' }) `fmap` Cartesian.Ordinate.maybeTranslate transformation y++-- | Construct /coordinates/ relative to 'minBound'.+mkRelativeCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> ((x, y) -> (x, y))	-- ^ Translation.+	-> Coordinates x y+mkRelativeCoordinates	= (`translate` minBound)++-- | Move one step towards the opponent.+advance+	:: (Enum y, Ord	y)+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /piece/ which is to advance.+	-> Transformation x y+{-# INLINE advance #-}+advance logicalColour	= translateY $ if Attribute.LogicalColour.isBlack logicalColour+	then pred+	else succ++-- | Where legal, move one step towards the opponent.+maybeAdvance+	:: (Enum y, Ord	y)+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /piece/ which is to advance.+	-> Coordinates x y				-- ^ The location from which to advanced.+	-> Maybe (Coordinates x y)+maybeAdvance logicalColour	= maybeTranslateY $ if Attribute.LogicalColour.isBlack logicalColour+	then pred+	else succ++-- | Move one step away from the opponent.+retreat+	:: (Enum y, Ord	y)+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /piece/ which is to retreat.+	-> Transformation x y+retreat	= advance . Property.Opposable.getOpposite++-- | Where legal, move one step away from the opponent.+maybeRetreat+	:: (Enum y, Ord y)+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /piece/ which is to retreat.+	-> Coordinates x y				-- ^ The location from which to retreat.+	-> Maybe (Coordinates x y)+maybeRetreat	= maybeAdvance . Property.Opposable.getOpposite++-- | Get the /coordinates/ immediately left & right.+getAdjacents :: (Enum x, Eq x) => Coordinates x y -> [Coordinates x y]+getAdjacents coordinates@MkCoordinates { getX = x }	= map (\x' -> coordinates { getX = x' }) $ Cartesian.Abscissa.getAdjacents x++infix 6 >||<	-- Just greater than (:).++-- | Alternative to @ zipWith $ curry MkCoordinates @.+(>||<) :: [x] -> [y] -> [Coordinates x y]+{-# INLINE (>||<) #-}+(x' : xs) >||< (y' : ys)	= MkCoordinates { getX = x', getY = y' } : xs >||< ys	-- Recurse.+_ >||< _			= []	-- To avoid unnecessary evaluation, 'zipWith' encodes two patterns for this, but is slightly slower.++{- |+	* Generates a line of /coordinates/, starting just after the specified source & proceeding in the specified /direction/ to the edge of the board.++	* CAVEAT: this is a performance-hotspot (it's also responsible for the allocation of a third of the application's memory); refactor => re-profile.+	In consequence, it is typically automatically avoided using a rewrite-rule to lookup an array of the results from all possible calls.+-}+extrapolate+	:: (Enum x, Enum y)+	=> Attribute.Direction.Direction	-- ^ The direction in which to proceed.+	-> Coordinates x y			-- ^ The point from which to start.+	-> [Coordinates x y]+{-# NOINLINE extrapolate #-}	-- Ensure the rewrite-rule triggers.+{-# RULES "extrapolate/Int" extrapolate = extrapolateInt #-}	-- CAVEAT: the call-stack leading here must be specialised to ensure this rule triggers.+extrapolate direction MkCoordinates {+	getX	= x,+	getY	= y+} = (+	case Attribute.Direction.getXDirection direction of+		GT	-> [succ x .. Cartesian.Abscissa.xMax]+		LT	-> let startX = pred x in startX `seq` [startX, pred startX .. Cartesian.Abscissa.xMin]+		EQ	-> repeat x+ ) >||< (+	case Attribute.Direction.getYDirection direction of+		GT	-> [succ y .. Cartesian.Ordinate.yMax]+		LT	-> let startY = pred y in startY `seq` [startY, pred startY .. Cartesian.Ordinate.yMin]+		EQ	-> repeat y+ )++-- | A specialisation of 'extrapolate'.+extrapolateInt :: Attribute.Direction.Direction -> Coordinates T.X T.Y -> [Coordinates T.X T.Y]+extrapolateInt direction coordinates	= extrapolationsByCoordinatesByDirection ! coordinates ! direction++-- | The constant lists of /coordinates/, extrapolated from every /coordinate/ in the /board/, in every /direction/.+extrapolationsByCoordinatesByDirection :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => ByCoordinates x y (Attribute.Direction.ByDirection [Coordinates x y])+{-# SPECIALISE extrapolationsByCoordinatesByDirection :: ByCoordinates T.X T.Y (Attribute.Direction.ByDirection [Coordinates T.X T.Y]) #-}	-- To promote memoisation.+extrapolationsByCoordinatesByDirection	= listArrayByCoordinates [+	Attribute.Direction.listArrayByDirection [+		(+			case Attribute.Direction.getXDirection direction of+				GT	-> [succ x .. Cartesian.Abscissa.xMax]+				LT	-> let startX = pred x in startX `seq` [startX, pred startX .. Cartesian.Abscissa.xMin]+				EQ	-> repeat x+		) >||< (+			case Attribute.Direction.getYDirection direction of+				GT	-> [succ y .. Cartesian.Ordinate.yMax]+				LT	-> let startY = pred y in startY `seq` [startY, pred startY .. Cartesian.Ordinate.yMin]+				EQ	-> repeat y+		) | direction	<- Attribute.Direction.range+	] | MkCoordinates { getX = x, getY = y }	<- range+ ] -- List-comprehension.++{- |+	* Generates a line of /coordinates/ covering the half open interval @(source, destination]@.++	* CAVEAT: the destination-/coordinates/ must be a valid @Queen@'s /move/ from the source; so that all intermediate points lie on a square of the board.+-}+interpolate :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Coordinates x y	-- ^ Source.+	-> Coordinates x y	-- ^ Destination.+	-> [Coordinates x y]+{-# NOINLINE interpolate #-}	-- Ensure the rewrite-rule triggers.+{-# RULES "interpolate/Int" interpolate = interpolateInt #-}	-- CAVEAT: the call-stack leading here must be specialised to ensure this rule triggers.+interpolate source@MkCoordinates {+	getX	= x,+	getY	= y+} destination@MkCoordinates {+	getX	= x',+	getY	= y'+}+	| source == destination	= []	-- CAVEAT: an invalid move.+	| otherwise		= (+		case x' `compare` x of+			GT	-> [succ x .. x']+			LT	-> let startX = pred x in startX `seq` [startX, pred startX .. x']+			EQ	-> repeat x+	) >||< (+		case y' `compare` y of+			GT	-> [succ y .. y']+			LT	-> let startY = pred y in startY `seq` [startY, pred startY .. y']+			EQ	-> repeat y+	)++-- | A specialisation of 'interpolate'.+interpolateInt :: Coordinates T.X T.Y -> Coordinates T.X T.Y -> [Coordinates T.X T.Y]+interpolateInt coordinatesSource coordinatesDestination	= interpolationsBySourceByDestination ! coordinatesSource ! coordinatesDestination++-- | The list of /coordinates/, between every permutation of source & destination on the /board/.+interpolationsBySourceByDestination :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => ByCoordinates x y (ByCoordinates x y [Coordinates x y])+{-# SPECIALISE interpolationsBySourceByDestination :: ByCoordinates T.X T.Y (ByCoordinates T.X T.Y [Coordinates T.X T.Y]) #-}	-- To promote memoisation.+interpolationsBySourceByDestination	= listArrayByCoordinates [+	listArrayByCoordinates [+		if source == destination+			then []+			else (+				case x' `compare` x of+					GT	-> [succ x .. x']+					LT	-> let startX = pred x in startX `seq` [startX, pred startX .. x']+					EQ	-> repeat x+			) >||< (+				case y' `compare` y of+					GT	-> [succ y .. y']+					LT	-> let startY = pred y in startY `seq` [startY, pred startY .. y']+					EQ	-> repeat y+			)+		| destination@MkCoordinates { getX = x', getY = y' }	<- range+	] | source@MkCoordinates { getX = x, getY = y }	<- range+ ] -- List-comprehension.++-- | The type of a function which changes one set of /coordinates/ to another.+type Transformation x y	= Coordinates x y -> Coordinates x y++{- |+	* Rotates the specified /coordinates/, so that the @Black@ pieces start on the specified side of the board; a /direction/ of @N@ involves no change.++	* CAVEAT: one can only request an integral multiple of 90 degrees.+-}+rotate :: (Enum x, Enum y) => Attribute.Direction.Direction -> Transformation x y+rotate direction coordinates@MkCoordinates {+	getX	= x,+	getY	= y+} = case Attribute.Direction.getXDirection &&& Attribute.Direction.getYDirection $ direction of+	(EQ, GT)	-> coordinates+	(LT, EQ)	-> MkCoordinates {+		getX	= toEnum $ Cartesian.Abscissa.xOrigin + fromIntegral yDistance',+		getY	= toEnum $ Cartesian.Ordinate.yOrigin + fromIntegral xDistance+	} -- +90 degrees, i.e. anti-clockwise.+	(EQ, LT)	-> MkCoordinates {+		getX	= toEnum $ Cartesian.Abscissa.xOrigin + fromIntegral xDistance',+		getY	= toEnum $ Cartesian.Ordinate.yOrigin + fromIntegral yDistance'+	} -- 180 degrees.+	(GT, EQ)	-> MkCoordinates {+		getX	= toEnum $ Cartesian.Abscissa.xOrigin + fromIntegral yDistance,+		getY	= toEnum $ Cartesian.Ordinate.yOrigin + fromIntegral xDistance'+	} -- -90 degrees, i.e. clockwise.+	_		-> Control.Exception.throw . Data.Exception.mkRequestFailure . showString "BishBosh.Cartesian.Coordinates.rotate:\tunable to rotate to direction" . Text.ShowList.showsAssociation $ shows direction "."+	where+		xDistance, xDistance', yDistance, yDistance'	:: T.Distance+		xDistance	= fromIntegral $ fromEnum x - Cartesian.Abscissa.xOrigin+		yDistance	= fromIntegral $ fromEnum y - Cartesian.Ordinate.yOrigin+		xDistance'	= pred Cartesian.Abscissa.xLength - xDistance+		yDistance'	= pred Cartesian.Ordinate.yLength - yDistance++{- |+	* Measures the signed distance between source & destination /coordinates/.++	* CAVEAT: beware the potential fence-post error.+-}+measureDistance :: (+	Enum	x,+	Enum	y,+	Num	distance+ )+	=> Coordinates x y	-- ^ Source.+	-> Coordinates x y	-- ^ Destination.+	-> (distance, distance)+{-# INLINE measureDistance #-}+measureDistance MkCoordinates {+	getX	= x,+	getY	= y+} MkCoordinates {+	getX	= x',+	getY	= y'+} = (fromIntegral $ fromEnum x' - fromEnum x, fromIntegral $ fromEnum y' - fromEnum y)++-- | The constant square of the radius of all coordinates.+radiusSquared :: (+	Fractional	radiusSquared,+	Integral	x,+	Integral	y+ ) => ByCoordinates x y radiusSquared+{-# SPECIALISE radiusSquared :: ByCoordinates T.X T.Y T.RadiusSquared #-}+radiusSquared	= listArrayByCoordinates [+	Factory.Math.Power.square (+		fromIntegral (x :: T.X) - Cartesian.Abscissa.centre+	) + Factory.Math.Power.square (+		fromIntegral (y :: T.Y) - Cartesian.Ordinate.centre+	) | MkCoordinates {+		getX	= x,+		getY	= y+	} <- range+ ] -- List-comprehension.++-- | The /logical colour/ of the specified square.+getLogicalColourOfSquare :: (Enum x, Enum y) => Coordinates x y -> Attribute.LogicalColourOfSquare.LogicalColourOfSquare+getLogicalColourOfSquare coordinates+	| even xDistance == even yDistance	= Attribute.LogicalColourOfSquare.black+	| otherwise				= Attribute.LogicalColourOfSquare.white+	where+		xDistance, yDistance	:: T.Distance+		(xDistance, yDistance)	= measureDistance minBound coordinates++-- | Whether the specified squares have the same logical colour.+areSquaresIsochromatic :: (Enum x, Enum y) => [Coordinates x y] -> Bool+areSquaresIsochromatic	= uncurry (||) . (all (== minBound) &&& all (== maxBound)) . map getLogicalColourOfSquare++-- | The conventional starting /coordinates/ for both @King@s.+kingsStartingCoordinates :: (Enum x, Enum y) => Attribute.LogicalColour.LogicalColour -> Coordinates x y+kingsStartingCoordinates logicalColour	= MkCoordinates {+	getX	= toEnum $ Cartesian.Abscissa.xOrigin + 4,+	getY	= Cartesian.Ordinate.firstRank logicalColour+}++-- | The conventional starting /coordinates/ for each @Rook@.+rooksStartingCoordinates :: (Enum x, Enum y) => Attribute.LogicalColour.LogicalColour -> [Coordinates x y]+rooksStartingCoordinates Attribute.LogicalColour.Black	= [topLeft, maxBound]+rooksStartingCoordinates _				= [minBound, bottomRight]++-- | Whether the specified /coordinates/ are where a @Pawn@ of the specified /logical colour/ starts.+isPawnsFirstRank+	:: (Enum y, Eq y)+	=> Attribute.LogicalColour.LogicalColour+	-> Coordinates x y+	-> Bool+{-# INLINE isPawnsFirstRank #-}+isPawnsFirstRank logicalColour MkCoordinates { getY = y }	= y == Cartesian.Ordinate.pawnsFirstRank logicalColour++-- | Whether a @Pawn@ is currently on the appropriate /rank/ to take an opponent's @Pawn@ /en-passant/.+isEnPassantRank+	:: (Enum y, Eq y)+	=> Attribute.LogicalColour.LogicalColour+	-> Coordinates x y+	-> Bool+isEnPassantRank logicalColour MkCoordinates { getY = y }	= y == Cartesian.Ordinate.enPassantRank logicalColour++-- | A boxed array indexed by /coordinates/, of arbitrary elements.+type ByCoordinates x y	= Data.Array.IArray.Array (Coordinates x y)++-- | Array-constructor.+listArrayByCoordinates :: (+	Data.Array.IArray.IArray	a e,+	Enum				x,+	Enum				y,+	Ord				x,+	Ord				y+ ) => [e] -> a (Coordinates x y) e+listArrayByCoordinates	= Data.Array.IArray.listArray (minBound, maxBound)+
+ src-lib/BishBosh/Cartesian/Ordinate.hs view
@@ -0,0 +1,131 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes the /y/-axis by which the /board/ is indexed.++	* N.B. this coordinate-system is for internal use only, and doesn't attempt to replicate any standard Chess-notation.+-}++module BishBosh.Cartesian.Ordinate(+-- * Constants+	yOrigin,+	yLength,+	yMin,+	yMax,+--	yBounds,+	yRange,+	centre,+-- * Functions+	firstRank,+	lastRank,+	pawnsFirstRank,+	enPassantRank,+	reflect,+	translate,+	maybeTranslate,+-- ** Predicates+	inBounds+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Types				as T+import qualified	Control.Exception++-- | The constant length of the /y/-axis.+yOrigin :: Int+yOrigin	= Cartesian.Abscissa.xOrigin	-- N.B. it doesn't need to the same.++-- | The constant length of the /y/-axis.+yLength :: T.Distance+yLength	= Cartesian.Abscissa.xLength	-- Because the board's square.++-- | The constant lower bound of the ordinate.+yMin :: Enum y => y+yMin	= toEnum yOrigin++-- | The constant upper bound of the ordinate.+yMax :: Enum y => y+yMax	= toEnum $ yOrigin + fromIntegral (pred {-fence-post-} yLength)++-- | The constant bounds of the ordinate.+yBounds :: Enum y => (y, y)+yBounds	= (yMin, yMax)++-- | The constant list of ordinates.+yRange :: Enum y => [y]+yRange	= uncurry enumFromTo yBounds++{- |+	* The constant centre of the span.++	* CAVEAT: no square actually exists at this fractional value.+-}+centre :: Fractional centre => centre+centre	= fromIntegral (uncurry (+) yBounds :: T.Y) / 2++-- | The /rank/ from which /piece/s conventionally start.+firstRank :: Enum y => Attribute.LogicalColour.LogicalColour -> y+firstRank Attribute.LogicalColour.Black	= yMax+firstRank _				= yMin++-- | The final /rank/; i.e. the one on which a @Pawn@ is promoted.+lastRank :: Enum y => Attribute.LogicalColour.LogicalColour -> y+lastRank	= firstRank . Property.Opposable.getOpposite++-- | The /rank/ from which @Pawn@s conventionally start.+pawnsFirstRank :: Enum y => Attribute.LogicalColour.LogicalColour -> y+{-# INLINE pawnsFirstRank #-}+pawnsFirstRank Attribute.LogicalColour.Black	= pred yMax+pawnsFirstRank _				= succ yMin++-- | The /rank/ from which a @Pawn@ may capture /en-passant/.+enPassantRank :: Enum y => Attribute.LogicalColour.LogicalColour -> y+{-# INLINE enPassantRank #-}+enPassantRank Attribute.LogicalColour.Black	= toEnum $ yOrigin + 3+enPassantRank _					= toEnum $ yOrigin + 4++-- | Reflects about the mid-point of the axis.+reflect :: Enum y => y -> y+reflect	= toEnum . (+	+ (2 * yOrigin + fromIntegral (pred yLength))+ ) . negate . fromEnum++-- | Predicate.+inBounds :: (Enum y, Ord y) => y -> Bool+{-# INLINE inBounds #-}+inBounds y	= y >= yMin && y <= yMax++-- | Translate the specified ordinate.+translate :: (Enum y, Ord y) => (y -> y) -> y -> y+translate transformation	= (\y -> Control.Exception.assert (inBounds y) y) . transformation++-- | Where legal, translate the specified ordinate.+maybeTranslate :: (Enum y, Ord y) => (y -> y) -> y -> Maybe y+maybeTranslate transformation	= (+	\y -> if inBounds y+		then Just y+		else Nothing+ ) . transformation+
+ src-lib/BishBosh/Cartesian/Vector.hs view
@@ -0,0 +1,238 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes a line's magnitude & direction, irrespective of its position.+-}++module BishBosh.Cartesian.Vector(+-- * Types+-- ** Type-synonyms+	VectorInt,+-- ** Data-types+	Vector(+--		MkVector,+		getXDistance,+		getYDistance+	),+-- * Constants+	attackVectorsForKnight,+	attackVectorsForKing,+-- * Functions+	attackVectorsForPawn,+	translate,+	maybeTranslate,+	toMaybeDirection,+-- ** Constructor+	mkVector,+	measureDistance,+-- ** Predicates+	isDiagonal,+	isParallel,+	isStraight,+	isPawnAttack,+	isKnightsMove,+	isKingsMove,+	matchesPawnDoubleAdvance+) where++import			Control.Arrow((***))+import qualified	BishBosh.Attribute.Direction		as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Property.Orientated		as Property.Orientated+import qualified	BishBosh.Types				as T+import qualified	Control.Exception++-- | The distance between two /coordinates/.+data Vector distance = MkVector {+	getXDistance	:: !distance,+	getYDistance	:: !distance+} deriving (Eq, Show)++instance Num distance => Property.Opposable.Opposable (Vector distance) where+	getOpposite (MkVector xDistance yDistance)	= MkVector (negate xDistance) (negate yDistance)++-- | Smart constructor.+mkVector :: (Num distance, Ord distance) => distance -> distance -> Vector distance+{-# INLINE mkVector #-}+mkVector xDistance yDistance	= Control.Exception.assert (+	(+		xDistance /= 0 || yDistance /= 0	-- Which would be neither a valid chess-move nor have a direction.+	) && abs xDistance < fromIntegral Cartesian.Abscissa.xLength && abs yDistance < fromIntegral Cartesian.Ordinate.yLength+ ) $ MkVector xDistance yDistance++-- | Construct a /vector/ by measuring the signed distance between source-/coordinates/ & destination.+measureDistance :: (+	Enum	x,+	Enum	y,+	Num	distance,+	Ord	distance+ )+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Source.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> Vector distance+{-# INLINE measureDistance #-}+measureDistance source destination	= uncurry mkVector $ Cartesian.Coordinates.measureDistance source destination++-- | Whether the specified /vector/ is at 45 degrees to an edge of the board, i.e. any move a @Bishop@ could make.+isDiagonal :: (Eq distance, Num distance) => Vector distance -> Bool+{-# INLINE isDiagonal #-}	-- N.B.: highly effective.+isDiagonal (MkVector xDistance yDistance)	= abs xDistance == abs yDistance++-- | Whether the specified /vector/ is parallel to an edge of the board, i.e. any move a @Rook@ could make.+isParallel :: (Eq distance, Num distance) => Vector distance -> Bool+{-# INLINE isParallel #-}+isParallel (MkVector xDistance yDistance)	= xDistance == 0 || yDistance == 0++-- | Whether the specified /vector/ is either parallel or at 45 degrees to an edge of the board, i.e. any move a @Queen@ could make.+isStraight :: (Eq distance, Num distance) => Vector distance -> Bool+{-# INLINE isStraight #-}+isStraight vector	= isParallel vector || isDiagonal vector++-- | A suitable concrete type.+type VectorInt	= Vector T.Distance++instance (Eq distance, Num distance) => Property.Orientated.Orientated (Vector distance) where+	{-# SPECIALISE instance Property.Orientated.Orientated VectorInt #-}+	isDiagonal	= isDiagonal+	isParallel	= isParallel++{- |+	* The list of attack-vectors for a @Pawn@.++	* N.B.: the @Pawn@'s ability to advance without taking, isn't dealt with here.+-}+attackVectorsForPawn :: Num distance => Attribute.LogicalColour.LogicalColour -> [Vector distance]+attackVectorsForPawn logicalColour	= [+	MkVector x $ (+		if Attribute.LogicalColour.isBlack logicalColour+			then negate	-- Black moves down.+			else id		-- White moves up.+	) 1 | x	<- [negate 1, 1]+ ] -- List-comprehension.++-- | The constant list of attack-vectors for a @Knight@.+attackVectorsForKnight :: Num distance => [Vector distance]+attackVectorsForKnight	= [+	MkVector (fX xDistance) (fY $ 3 - xDistance) |+		fX		<- [negate, id],+		fY		<- [negate, id],+		xDistance	<- [1, 2]+ ] -- List-comprehension.++-- | The constant list of attack-vectors for a @King@.+attackVectorsForKing :: (Eq distance, Num distance) => [Vector distance]+attackVectorsForKing	= [+	MkVector xDistance yDistance |+		xDistance	<- [negate 1, 0, 1],+		yDistance	<- [negate 1, 0, 1],+		xDistance /= 0 || yDistance /= 0+ ] -- List-comprehension.++{- |+	* Whether the specified /vector/ might represent an attack (rather than an advance) by a @Pawn@.++	* CAVEAT: if the move started at the first rank, then it can't be a @Pawn@, but that's unknown.+-}+isPawnAttack :: (Eq distance, Num distance) => Attribute.LogicalColour.LogicalColour -> Vector distance -> Bool+{-# INLINE isPawnAttack #-}+isPawnAttack logicalColour (MkVector xDistance yDistance)	= abs xDistance == 1 && yDistance == (+	if Attribute.LogicalColour.isBlack logicalColour+		then negate+		else id+ ) 1++-- | Whether the specified /vector/ represents a move a @Knight@ could make.+isKnightsMove :: (Eq distance, Num distance) => Vector distance -> Bool+{-# INLINE isKnightsMove #-}+isKnightsMove (MkVector xDistance yDistance)	= case abs xDistance of+	1	-> absYDistance == 2+	2	-> absYDistance == 1+	_	-> False+	where+		absYDistance	= abs yDistance++-- | Whether the specified /vector/ represents a move a @King@ could make.+isKingsMove :: (Num distance, Ord distance) => Vector distance -> Bool+isKingsMove (MkVector 0 0)			= False+isKingsMove (MkVector xDistance yDistance)	= abs xDistance <= 1 && abs yDistance <= 1++{- |+	* Whether the specified /vector/ matches a @Pawn@'s initial double-advance move.++	* CAVEAT: passing this test doesn't guarantee that it is a @Pawn@'s double-advance move, since the move may not relate to a @Pawn@, or could be invalid.+-}+matchesPawnDoubleAdvance+	:: (Eq distance, Num distance)+	=> Attribute.LogicalColour.LogicalColour+	-> Vector distance+	-> Bool+matchesPawnDoubleAdvance logicalColour (MkVector xDistance yDistance)	= xDistance == 0 && yDistance == (+	if Attribute.LogicalColour.isBlack logicalColour+		then negate+		else id+ ) 2++-- | Translate the specified /coordinates/ by the specified /vector/.+translate :: (+	Enum		x,+	Enum		y,+	Integral	distance,+	Ord		x,+	Ord		y+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> Vector distance+	-> Cartesian.Coordinates.Coordinates x y+translate coordinates (MkVector xDistance yDistance)	= Cartesian.Coordinates.translate (+	toEnum . (+ fromIntegral xDistance) . fromEnum *** toEnum . (+ fromIntegral yDistance) . fromEnum+ ) coordinates++-- | Where legal, translate the specified /coordinates/ by the specified /vector/.+maybeTranslate :: (+	Enum		x,+	Enum		y,+	Integral	distance,+	Ord		x,+	Ord		y+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> Vector distance+	-> Maybe (Cartesian.Coordinates.Coordinates x y)+{-# INLINE maybeTranslate #-}+maybeTranslate coordinates (MkVector xDistance yDistance)	= Cartesian.Coordinates.maybeTranslate (+	toEnum . (+ fromIntegral xDistance) . fromEnum *** toEnum . (+ fromIntegral yDistance) . fromEnum+ ) coordinates++{- |+	* Where possible, converts the specified /vector/ into a /direction/.++	* @Nothing@ is returned for those /vector/s which don't translate into a legal /direction/ (e.g. a @Knight@'s move).+-}+toMaybeDirection :: (Num distance, Ord distance) => Vector distance -> Maybe Attribute.Direction.Direction+{-# INLINE toMaybeDirection #-}+toMaybeDirection vector@(MkVector xDistance yDistance)+	| isStraight vector	= Just $ Attribute.Direction.mkDirection (compare xDistance 0) (compare yDistance 0)+	| otherwise		= Nothing+
+ src-lib/BishBosh/Component/EitherQualifiedMove.hs view
@@ -0,0 +1,64 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the type returned when reading a move encoded in a string, using any of a variety of notations.++	* The internal representation of a /move/ is merely a pair of coordinates, but in various chess-notations, additional information is provided.++	* The quantity of additional information is dependent of the specific notation:+		some identify Castling, En-passant, promotion /rank/, taken /rank/;+		some merely define the /rank/ to which a @Pawn@ should be promoted.+-}++module BishBosh.Component.EitherQualifiedMove(+-- * Types+-- ** Data-types+	EitherQualifiedMove(+--		MkEitherQualifiedMove,+		getMove,+		getPromotionRankOrMoveType+	),+-- * Functions+-- ** Constructors+	mkPartiallyQualifiedMove,+	mkFullyQualifiedMove+) where++import qualified	BishBosh.Attribute.MoveType	as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Component.Move		as Component.Move++-- | As returned by 'Notation.MoveNotation.readsQualifiedMove'.+data EitherQualifiedMove x y	= MkEitherQualifiedMove {+	getMove				:: Component.Move.Move x y,+	getPromotionRankOrMoveType	:: Either (Maybe Attribute.Rank.Rank) Attribute.MoveType.MoveType	-- ^ Either the optional /rank/ to which a @Pawn@ should be promoted, or the complete /move-type/.+}++-- | Constructor for notations which don't encode sufficient information to reliably re-construct the /move-type/, but merely the rank to which a @Pawn@ is to be promoted.+mkPartiallyQualifiedMove :: Component.Move.Move x y -> Maybe Attribute.Rank.Rank -> EitherQualifiedMove x y+mkPartiallyQualifiedMove move	= MkEitherQualifiedMove move . Left++-- | Constructor for notations which encode sufficient information to reliably re-construct the /move-type/.+mkFullyQualifiedMove :: Component.Move.Move x y -> Attribute.MoveType.MoveType -> EitherQualifiedMove x y+mkFullyQualifiedMove move	= MkEitherQualifiedMove move . Right+
+ src-lib/BishBosh/Component/Move.hs view
@@ -0,0 +1,238 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines one move (actually just a half move AKA "ply") of a /piece/.+-}++module BishBosh.Component.Move(+-- * Types+-- ** Type-synonyms+	NMoves,+	NPlies,+	Move(+--		MkMove,+		getSource,+		getDestination+	),+-- * Constants+	tag,+	nPliesPerMove,+	castlingMovesByLogicalColour,+-- * Functions+	measureDistance,+	interpolate,+	getDeltaRadiusSquared,+-- ** Constructors+	mkMove,+-- ** Predicates+	isPawnDoubleAdvance+) where++import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Property.Orientated		as Property.Orientated+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	BishBosh.Types				as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Ord++-- | Used to qualify XML.+tag :: String+tag	= "move"++{- |+	* A number of moves.++	* CAVEAT: this may be a number of plies or /full/ moves (i.e. a ply by @White@ & a ply by @Black@)+-}+type NMoves	= Int++-- | A number of half-moves into a /game/.+type NPlies	= NMoves++-- | The constant number of plies per move.+nPliesPerMove :: NMoves+nPliesPerMove	= 2++{- |+	* A move of a /piece/.++	* Most modern chess-notations (except Standard Algebraic) start with similar information, but also define ancillary information which is captured in /MoveType/.+-}+data Move x y	= MkMove {+	getSource	:: Cartesian.Coordinates.Coordinates x y,+	getDestination	:: Cartesian.Coordinates.Coordinates x y+} deriving Eq++instance (Ord x, Ord y) => Ord (Move x y) where+	{-# SPECIALISE instance Ord (Move T.X T.Y) #-}+	move@MkMove { getSource = source } `compare` move'@MkMove { getSource = source' }	= case source `compare` source' of+		EQ		-> Data.Ord.comparing getDestination move move'+		ordering	-> ordering++instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (Move x y) where+	rnf MkMove {+		getSource	= source,+		getDestination	= destination+	} = Control.DeepSeq.rnf (source, destination)++instance (Show x, Show y) => Show (Move x y) where+	showsPrec _ MkMove {+		getSource	= source,+		getDestination	= destination+	} = shows (source, destination)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y+ ) => Read (Move x y) where+	readsPrec _	= map (Control.Arrow.first $ uncurry mkMove) . reads++instance Property.Opposable.Opposable (Move x y) where+	getOpposite (MkMove source destination)	= MkMove destination source++instance (Enum x, Enum y) => Property.Orientated.Orientated (Move x y) where+	isDiagonal	= (Property.Orientated.isDiagonal :: Cartesian.Vector.VectorInt -> Bool) . measureDistance+	isParallel	= (Property.Orientated.isParallel :: Cartesian.Vector.VectorInt -> Bool) . measureDistance++instance Enum y => Property.Reflectable.ReflectableOnX (Move x y) where+	reflectOnX MkMove {+		getSource	= source,+		getDestination	= destination+	} = MkMove {+		getSource	= Property.Reflectable.reflectOnX source,+		getDestination	= Property.Reflectable.reflectOnX destination+	}++instance Enum x => Property.Reflectable.ReflectableOnY (Move x y) where+	reflectOnY MkMove {+		getSource	= source,+		getDestination	= destination+	} = MkMove {+		getSource	= Property.Reflectable.reflectOnY source,+		getDestination	= Property.Reflectable.reflectOnY destination+	}++-- | Smart constructor.+mkMove+	:: (Eq x, Eq y)+	=> Cartesian.Coordinates.Coordinates x y+	-> Cartesian.Coordinates.Coordinates x y+	-> Move x y+{-# INLINE mkMove #-}+mkMove source destination	= Control.Exception.assert (source /= destination) $ MkMove source destination++-- | Measures the signed distance between the ends of the move.+measureDistance :: (+	Enum	x,+	Enum	y,+	Num	distance,+	Ord	distance+ ) => Move x y -> Cartesian.Vector.Vector distance+{-# SPECIALISE measureDistance :: Move T.X T.Y -> Cartesian.Vector.VectorInt #-}+measureDistance	MkMove {+	getSource	= source,+	getDestination	= destination+} = Cartesian.Vector.measureDistance source destination++-- | Generates a line of /coordinates/ covering the half open interval @(source, destination]@.+interpolate :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Move x y -> [Cartesian.Coordinates.Coordinates x y]+{-# SPECIALISE interpolate :: Move T.X T.Y -> [Cartesian.Coordinates.Coordinates T.X T.Y] #-}+interpolate move@MkMove {+	getSource	= source,+	getDestination	= destination+} = Control.Exception.assert (Property.Orientated.isStraight move) $ Cartesian.Coordinates.interpolate source destination++-- | Defines by /logical colour/, the list of (/move-type/, @King@'s move, & @Rook@'s move) for each type of Castle.+castlingMovesByLogicalColour :: (+	Enum	x,+	Enum	y,+	Eq	y,+	Ord	x+ ) => Attribute.LogicalColour.ByLogicalColour [(Attribute.MoveType.MoveType, Move x y, Move x y)]+castlingMovesByLogicalColour	= Attribute.LogicalColour.listArrayByLogicalColour $ map (+	\logicalColour -> let+		kingsStartingCoordinates	= Cartesian.Coordinates.kingsStartingCoordinates logicalColour+		kingsMove translation		= mkMove kingsStartingCoordinates $ translateX translation kingsStartingCoordinates+	in [+		(+			Attribute.MoveType.shortCastle,+			kingsMove (+ 2),+			uncurry mkMove . (id &&& translateX (subtract 2)) $ if Attribute.LogicalColour.isBlack logicalColour+				then maxBound+				else Cartesian.Coordinates.bottomRight+		), (+			Attribute.MoveType.longCastle,+			kingsMove $ subtract 2,+			uncurry mkMove . (id &&& translateX (+ 3)) $ if Attribute.LogicalColour.isBlack logicalColour+				then Cartesian.Coordinates.topLeft+				else minBound+		) -- Triple.+	]+ ) Attribute.LogicalColour.range where+	translateX :: (Enum x, Ord x) => (Int -> Int) -> Cartesian.Coordinates.Coordinates x y -> Cartesian.Coordinates.Coordinates x y+	translateX translation	= Cartesian.Coordinates.translateX $ toEnum . translation . fromEnum++{- |+	* Whether the specified /move/ is a @Pawn@'s initial double-advance.++	* CAVEAT: failing this test guarantees that the move isn't a @Pawn@'s double-advance,+	but passing only guarantees that it is, if it was a @Pawn@ which moved & that the /move/ is valid.+-}+isPawnDoubleAdvance+	:: (Enum x, Enum y, Eq y)+	=> Attribute.LogicalColour.LogicalColour	-- Defines the side whose move is referenced.+	-> Move x y+	-> Bool+isPawnDoubleAdvance logicalColour move	= Cartesian.Coordinates.isPawnsFirstRank logicalColour (+	getSource move+ ) && Cartesian.Vector.matchesPawnDoubleAdvance logicalColour (+	measureDistance move :: Cartesian.Vector.VectorInt+ )++-- | Measure the change in the square of the radius from the centre of the board, resulting from the specified move.+getDeltaRadiusSquared :: (+	Fractional	radiusSquared,+	Integral	x,+	Integral	y+ ) => Move x y -> radiusSquared+{-# SPECIALISE getDeltaRadiusSquared :: Move T.X T.Y -> T.RadiusSquared #-}+getDeltaRadiusSquared MkMove {+	getSource	= source,+	getDestination	= destination+} = Cartesian.Coordinates.radiusSquared ! destination - Cartesian.Coordinates.radiusSquared ! source+
+ src-lib/BishBosh/Component/Piece.hs view
@@ -0,0 +1,425 @@+{-# OPTIONS_GHC -fno-warn-unused-binds #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data-type which represents any chess-piece.+-}++module BishBosh.Component.Piece(+-- * Types+-- ** Type-synonyms+	NPieces,+	ByPiece,+	LocatedPiece,+-- ** Data-types+	Piece(+--		MkPiece,+		getLogicalColour,+		getRank+	),+-- * Constants+--	tag,+	nPiecesPerSide,+	range,+--	attackVectorsByPiece,+	attackDirectionsByPiece,+--	attackDestinationsByCoordinatesByRankByLogicalColour,+-- * Functions+	findAttackDestinations,+--	findAttackDestinationsInt,+-- ** Mutators+	promote,+-- ** Constructors+	mkBishop,+	mkKing,+	mkKnight,+	mkPawn,+	mkPiece,+	mkQueen,+	mkRook,+	listArrayByPiece,+-- ** Predicates+	canAttackAlong,+	canMoveBetween,+	isBlack,+	isFriend,+--	isPeer,+	isPawn,+	isKnight,+--	isBishop,+--	isRook,+--	isQueen,+	isKing,+	isPawnPromotion+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Direction		as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector+import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Types				as T+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Char+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "piece"++-- | A number of /piece/s.+type NPieces	= Int	-- N.B.: 'Data.Int.Int8' saves neither time nor space.++-- | The initial number of pieces per side in a standard opening position; some of which are duplicates.+nPiecesPerSide :: NPieces+nPiecesPerSide	= fromIntegral Cartesian.Abscissa.xLength * 2 {-rows-}++-- | A Chess-piece has a /logical colour/ & a /rank/.+data Piece	= MkPiece {+	getLogicalColour	:: Attribute.LogicalColour.LogicalColour,+	getRank			:: Attribute.Rank.Rank+} deriving (Bounded, Eq, Ord)++instance Control.DeepSeq.NFData Piece where+	rnf MkPiece {+		getLogicalColour	= logicalColour,+		getRank			= rank+	} = Control.DeepSeq.rnf (logicalColour, rank)++instance Data.Array.IArray.Ix Piece where+	range (lower, upper)		= Control.Exception.assert (lower == minBound && upper == maxBound) range+	inRange (lower, upper) piece	= Control.Exception.assert (piece >= lower && piece <= upper) True+	index (lower, upper) MkPiece {+		getLogicalColour	= logicalColour,+		getRank			= rank+	} = Control.Exception.assert (lower == minBound && upper == maxBound) $ fromEnum logicalColour * Attribute.Rank.nDistinctRanks + fromEnum rank++instance Read Piece where+	readsPrec _	= Property.ForsythEdwards.readsFEN++instance Show Piece where+	showsPrec _	= Property.ForsythEdwards.showsFEN++instance Property.ForsythEdwards.ReadsFEN Piece where+	readsFEN s	= case Data.List.Extra.trimStart s of+		c : remainder	-> (+			MkPiece (+				if Data.Char.isUpper c+					then Attribute.LogicalColour.White+					else Attribute.LogicalColour.Black+			) *** const remainder+		 ) `map` reads [c]+		_		-> []	-- No parse.++instance Property.ForsythEdwards.ShowsFEN Piece where+	showsFEN piece@MkPiece { getRank = rank }	= showString . map (+		if isBlack piece+			then Data.Char.toLower	-- Only required for independence from the specific implementation of Read for Rank.+			else Data.Char.toUpper+	 ) $ show rank++instance HXT.XmlPickler Piece where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Property.Opposable.Opposable Piece where+	getOpposite piece@MkPiece {+		getLogicalColour	= logicalColour+	} = piece {+		getLogicalColour	= Property.Opposable.getOpposite logicalColour+	}++-- | Constructor.+mkPiece :: Attribute.LogicalColour.LogicalColour -> Attribute.Rank.Rank -> Piece+mkPiece	= MkPiece++-- | Constructor.+mkPawn :: Attribute.LogicalColour.LogicalColour -> Piece+mkPawn		= (`MkPiece` Attribute.Rank.Pawn)++-- | Constructor.+mkRook :: Attribute.LogicalColour.LogicalColour -> Piece+mkRook		= (`MkPiece` Attribute.Rank.Rook)++-- | Constructor.+mkKnight :: Attribute.LogicalColour.LogicalColour -> Piece+mkKnight	= (`MkPiece` Attribute.Rank.Knight)++-- | Constructor.+mkBishop:: Attribute.LogicalColour.LogicalColour -> Piece+mkBishop	= (`MkPiece` Attribute.Rank.Bishop)++-- | Constructor.+mkQueen :: Attribute.LogicalColour.LogicalColour -> Piece+mkQueen		= (`MkPiece` Attribute.Rank.Queen)++-- | Constructor.+mkKing :: Attribute.LogicalColour.LogicalColour -> Piece+mkKing		= (`MkPiece` Attribute.Rank.King)++-- | The constant ascending range of /piece/s.+range :: [Piece]+range	= [+	MkPiece {+		getLogicalColour	= logicalColour,+		getRank			= rank+	} |+		logicalColour	<- Attribute.LogicalColour.range,+		rank		<- Attribute.Rank.range+ ] -- List-comprehension.++{- |+	* Changes the /rank/ of the specified /piece/, leaving the /logical colour/ unchanged.++	* CAVEAT: only legal if the /rank/ was a @Pawn@, & becomes neither a @Pawn@ nor a @King@.+-}+promote :: Attribute.Rank.Rank -> Piece -> Piece+promote newRank piece	= piece { getRank = newRank }++{- |+	* The constant /vector/s over which the specified type of /piece/ can attack.++	* CAVEAT: only defined for 'Attribute.Rank.fixedAttackRange'.++	* CAVEAT: it doesn't identify @Pawn@-advances, since these aren't attacks.+-}+attackVectorsByPiece :: (Num distance, Ord distance) => Data.Map.Map Piece [Cartesian.Vector.Vector distance]+attackVectorsByPiece	= Data.Map.fromAscList [+	(piece, vectors) |+		(piece, Just vectors) <- map (+			id &&& (+				\piece -> case getRank piece of+					Attribute.Rank.Pawn	-> Just . Cartesian.Vector.attackVectorsForPawn $ getLogicalColour piece+					Attribute.Rank.Knight	-> Just Cartesian.Vector.attackVectorsForKnight+					Attribute.Rank.King	-> Just Cartesian.Vector.attackVectorsForKing+					_			-> Nothing	-- These ranks attack over any distance.+			)+		) range+ ] -- List-comprehension.++{- |+	* The destinations available to those pieces with attack-vectors; @Pawn@, @Knight@, @King@.++	* CAVEAT: the destinations for a @Pawn@, are only those corresponding to diagonal attacks.++	* CAVEAT: this function has no knowledge of the /board/, & therefore of the position of any other piece.+-}+attackDestinationsByCoordinatesByRankByLogicalColour :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Cartesian.Coordinates.ByCoordinates x y (Data.Map.Map Piece [Cartesian.Coordinates.Coordinates x y])+{-# SPECIALISE attackDestinationsByCoordinatesByRankByLogicalColour :: Cartesian.Coordinates.ByCoordinates T.X T.Y (Data.Map.Map Piece [Cartesian.Coordinates.Coordinates T.X T.Y]) #-}	-- To promote memoisation.+attackDestinationsByCoordinatesByRankByLogicalColour	= Cartesian.Coordinates.listArrayByCoordinates $ map (+	\source -> Data.Map.fromList [+		(+			piece,+			Data.Maybe.mapMaybe (Cartesian.Vector.maybeTranslate source) (attackVectorsByPiece Data.Map.! piece :: [Cartesian.Vector.VectorInt])+		) |+			logicalColour	<- Attribute.LogicalColour.range,+			rank		<- Attribute.Rank.fixedAttackRange,+			let piece	= mkPiece logicalColour rank+	] -- List-comprehension.+ ) Cartesian.Coordinates.range++-- | Calls 'attackVectorsByPiece' to find the destinations which the specified /piece/ can attack from the specified position.+findAttackDestinations :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y	-- ^ The source from which the attack originates.+	-> Piece+	-> [Cartesian.Coordinates.Coordinates x y]	-- ^ The destinations which can be attacked.+{-# NOINLINE findAttackDestinations #-}	-- Ensure the rewrite-rule triggers.+{-# RULES "findAttackDestinations/Int" findAttackDestinations = findAttackDestinationsInt #-}	-- CAVEAT: the call-stack leading to this function must be specialised to ensure this triggers.+findAttackDestinations source piece	= Data.Maybe.mapMaybe (Cartesian.Vector.maybeTranslate source) (attackVectorsByPiece Data.Map.! piece :: [Cartesian.Vector.VectorInt])++-- | A specialisation of 'findAttackDestinations', more efficiently implemented by calling 'attackDestinationsByCoordinatesByRankByLogicalColour'.+findAttackDestinationsInt :: Cartesian.Coordinates.Coordinates T.X T.Y -> Piece -> [Cartesian.Coordinates.Coordinates T.X T.Y]+findAttackDestinationsInt coordinates piece	= attackDestinationsByCoordinatesByRankByLogicalColour ! coordinates Data.Map.! piece++{- |+	* Find the constant directions of the straight lines along which each type of /piece/ can attack.++	* CAVEAT: not defined for a @Knight@.+-}+attackDirectionsByPiece :: Data.Map.Map Piece [Attribute.Direction.Direction]+attackDirectionsByPiece	= Data.Map.fromAscList [+	(+		piece,+		case getRank piece of+			Attribute.Rank.Pawn	-> Attribute.Direction.attackDirectionsForPawn $ getLogicalColour piece+			Attribute.Rank.Rook	-> Attribute.Direction.parallels+			Attribute.Rank.Bishop	-> Attribute.Direction.diagonals+			_ {-royalty-}		-> Attribute.Direction.range+	) |+		piece	<- range,+		not $ isKnight piece	-- The moves of which have no defined direction.+ ] -- List-comprehension.++{- |+	* Whether a /piece/ at the specified /coordinates/ could attack the target at the specified /coordinates/.++	* N.B.: doesn't require that the specified /piece/ actually exists at the target-location, nor that the victim's /logical colour/ is opposite from the attacker's.++	* N.B.: can't detect any blocking /piece/s which might invalidate the attack.++	* CAVEAT: it won't confirm the ability of a @Pawn@ to advance, since that doesn't constitute an attack.+-}+canAttackAlong+	:: (Enum x, Enum y)+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Source (attacker's location).+	-> Cartesian.Coordinates.Coordinates x y	-- ^ Destination (victim's location).+	-> Piece					-- ^ Attacker.+	-> Bool+canAttackAlong source destination piece@MkPiece { getRank = rank }	= (+	case rank of+		Attribute.Rank.Pawn	-> Cartesian.Vector.isPawnAttack $ getLogicalColour piece+		Attribute.Rank.Knight	-> Cartesian.Vector.isKnightsMove+		Attribute.Rank.Bishop	-> Cartesian.Vector.isDiagonal+		Attribute.Rank.Rook	-> Cartesian.Vector.isParallel+		Attribute.Rank.Queen	-> Cartesian.Vector.isStraight+		Attribute.Rank.King	-> Cartesian.Vector.isKingsMove+ ) (+	Cartesian.Vector.measureDistance source destination	:: Cartesian.Vector.VectorInt+ )++{- |+	* Whether the specified /piece/ can move between the specified /coordinates/.++	* N.B.: can't detect any blocking pieces.+-}+canMoveBetween :: (+	Enum	x,+	Enum	y,+	Eq	y+ )+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Source.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> Piece+	-> Bool+{-# SPECIALISE canMoveBetween :: Cartesian.Coordinates.Coordinates T.X T.Y -> Cartesian.Coordinates.Coordinates T.X T.Y -> Piece -> Bool #-}+canMoveBetween source destination piece@MkPiece { getRank = rank }	= (+	case rank of+		Attribute.Rank.Pawn	-> \distance -> let+			logicalColour	= getLogicalColour piece+		 in Cartesian.Vector.isPawnAttack logicalColour distance || Cartesian.Vector.getXDistance distance == 0 && (+			let+				y'	= (+					if Attribute.LogicalColour.isBlack logicalColour+						then negate+						else id+				 ) $ Cartesian.Vector.getYDistance distance+			in y' == 1 || Cartesian.Coordinates.isPawnsFirstRank logicalColour source && y' == 2+		 )+		Attribute.Rank.Knight	-> Cartesian.Vector.isKnightsMove+		Attribute.Rank.Bishop	-> Cartesian.Vector.isDiagonal+		Attribute.Rank.Rook	-> Cartesian.Vector.isParallel+		Attribute.Rank.Queen	-> Cartesian.Vector.isStraight+		Attribute.Rank.King	-> Cartesian.Vector.isKingsMove+ ) (+	Cartesian.Vector.measureDistance source destination	:: Cartesian.Vector.VectorInt+ )++-- | Whether a move qualifies for @Pawn@-promotion.+isPawnPromotion+	:: (Enum y, Eq y)+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> Piece+	-> Bool+isPawnPromotion destination MkPiece {+	getLogicalColour	= logicalColour,+	getRank			= Attribute.Rank.Pawn+}			= Cartesian.Ordinate.lastRank logicalColour == Cartesian.Coordinates.getY destination+isPawnPromotion _ _	= False++-- | Whether the specified /piece/ is @Black@.+{-# INLINE isBlack #-}+isBlack :: Piece -> Bool+isBlack MkPiece { getLogicalColour = Attribute.LogicalColour.Black }	= True+isBlack _								= False++-- | Whether the specified /piece/s have the same /logical colour/.+{-# INLINE isFriend #-}+isFriend :: Piece -> Piece -> Bool+isFriend MkPiece { getLogicalColour = logicalColour } MkPiece { getLogicalColour = logicalColour' }	= logicalColour == logicalColour'++-- | Whether the specified /piece/s have the same /rank/.+isPeer :: Piece -> Piece -> Bool+isPeer MkPiece { getRank = rank } MkPiece { getRank = rank' }	= rank == rank'++-- | Whether the specified /piece/ is a @Pawn@.+{-# INLINE isPawn #-}+isPawn :: Piece -> Bool+isPawn MkPiece { getRank = Attribute.Rank.Pawn }	= True+isPawn _						= False++-- | Whether the specified /piece/ is a @Knight@.+{-# INLINE isKnight #-}+isKnight :: Piece -> Bool+isKnight MkPiece { getRank = Attribute.Rank.Knight }	= True+isKnight _						= False++-- | Whether the specified /piece/ is a @Bishop@.+isBishop :: Piece -> Bool+isBishop MkPiece { getRank = Attribute.Rank.Bishop }	= True+isBishop _						= False++-- | Whether the specified /piece/ is a @Rook@.+isRook :: Piece -> Bool+isRook MkPiece { getRank = Attribute.Rank.Rook }	= True+isRook _						= False++-- | Whether the specified /piece/ is a @Queen@.+isQueen :: Piece -> Bool+isQueen MkPiece { getRank = Attribute.Rank.Queen }	= True+isQueen _						= False++-- | Whether the specified /piece/ is a @King@.+{-# INLINE isKing #-}+isKing :: Piece -> Bool+isKing MkPiece { getRank = Attribute.Rank.King }	= True+isKing _						= False++-- | A boxed array indexed by /piece/, of unspecified elements.+type ByPiece	= Data.Array.IArray.Array {-Boxed-} Piece++-- | Array-constructor.+listArrayByPiece :: Data.Array.IArray.IArray a e => [e] -> a Piece e+listArrayByPiece	= Data.Array.IArray.listArray (minBound, maxBound)++-- | Self-documentation.+type LocatedPiece x y	= (Cartesian.Coordinates.Coordinates x y, Piece)+
+ src-lib/BishBosh/Component/PieceSquareArray.hs view
@@ -0,0 +1,97 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the relative value of a specific rank of piece, occupying a specific coordinate on the board, at a specific stage in the game.+-}++module BishBosh.Component.PieceSquareArray(+-- * Types+-- ** Type-synonyms+	InterpolatedPieceSquareValues,+--	InterpolatedPieceSquareValuesByCoordinates,+	FindPieceSquareValue,+-- ** Data-types+	PieceSquareArray,+-- * Functions+	findPieceSquareValue,+-- ** Constructor+	mkPieceSquareArray+) where++import			BishBosh.Data.Bool()+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	Control.DeepSeq+import qualified	Data.Array.IArray++-- | Either a single /pieceSquareValue/ or an array of values indexed by the total number of pieces remaining on the board.+type InterpolatedPieceSquareValues pieceSquareValue	= Either pieceSquareValue (Data.Array.IArray.Array Component.Piece.NPieces pieceSquareValue)++-- | Self-documentation.+type InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue	= Cartesian.Coordinates.ByCoordinates x y (InterpolatedPieceSquareValues pieceSquareValue)++-- | The value for each type of /piece/ of occupying each coordinate, at each stage in the lifetime of the game.+newtype PieceSquareArray x y pieceSquareValue		= MkPieceSquareArray {+	deconstruct	:: Attribute.Rank.ByRank (InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue)+} deriving (Eq, Show)++instance (+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (PieceSquareArray x y pieceSquareValue) where+	rnf MkPieceSquareArray { deconstruct = byRank }	= Control.DeepSeq.rnf byRank++-- | Constructor.+mkPieceSquareArray :: (Attribute.Rank.Rank -> InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue) -> PieceSquareArray x y pieceSquareValue+mkPieceSquareArray	= MkPieceSquareArray . Attribute.Rank.listArrayByRank . (`map` Attribute.Rank.range)++-- | The type of a function which can find the appropriate piece-square value.+type FindPieceSquareValue x y pieceSquareValue+	= Attribute.LogicalColour.LogicalColour		-- ^ The piece's logical colour.+	-> Attribute.Rank.Rank				-- ^ The piece's rank.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The piece's location.+	-> pieceSquareValue++-- | Find the piece-square value, at a stage in the game's lifetime defined by the total number of piece remaining, for the specified /piece/ & /coordinates/.+findPieceSquareValue :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Component.Piece.NPieces			-- ^ The progress through the game.+	-> Attribute.LogicalColour.LogicalColour	-- ^ The piece's logical colour.+	-> Attribute.Rank.Rank				-- ^ The piece's rank.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The piece's location.+	-> PieceSquareArray x y pieceSquareValue+	-> pieceSquareValue+-- {-# SPECIALISE findPieceSquareValue :: Component.Piece.NPieces -> Attribute.LogicalColour.LogicalColour -> Attribute.Rank.Rank -> Cartesian.Coordinates.Coordinates T.X T.Y -> PieceSquareArray T.X T.Y pieceSquareValue -> pieceSquareValue #-}+{-# INLINE findPieceSquareValue #-}+findPieceSquareValue nPieces logicalColour rank coordinates MkPieceSquareArray { deconstruct = byRank }	= either id (! nPieces) $ byRank ! rank ! (+	if Attribute.LogicalColour.isBlack logicalColour+		then Property.Reflectable.reflectOnX+		else id+ ) coordinates
+ src-lib/BishBosh/Component/QualifiedMove.hs view
@@ -0,0 +1,78 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Qualifies a /move/ with a /move-type/.+-}++module BishBosh.Component.QualifiedMove(+-- * Types+-- ** Data-types+	QualifiedMove(+--		MkQualifiedMove,+		getMove,+		getMoveType+	),+-- * Functions+-- ** Constructors+	mkQualifiedMove+) where++import qualified	BishBosh.Attribute.MoveType	as Attribute.MoveType+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Property.Reflectable	as Property.Reflectable+import qualified	Control.Arrow+import qualified	Control.DeepSeq++-- | A move qualified by its /movetype/.+data QualifiedMove x y	= MkQualifiedMove {+	getMove		:: Component.Move.Move x y,+	getMoveType	:: Attribute.MoveType.MoveType+} deriving Eq++instance (Show x, Show y) => Show (QualifiedMove x y) where+	showsPrec _ MkQualifiedMove {+		getMove		= move,+		getMoveType	= moveType+	} = shows (move, moveType)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y+ ) => Read (QualifiedMove x y) where+	readsPrec _	= map (Control.Arrow.first $ uncurry MkQualifiedMove) . reads++instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (QualifiedMove x y) where+	rnf MkQualifiedMove {+		getMove		= move,+		getMoveType	= moveType+	} = Control.DeepSeq.rnf (move, moveType)++instance Enum y => Property.Reflectable.ReflectableOnX (QualifiedMove x y) where+	reflectOnX qualifiedMove@MkQualifiedMove { getMove = move }	= qualifiedMove { getMove = Property.Reflectable.reflectOnX move }++-- | Constructor.+mkQualifiedMove	:: Component.Move.Move x y -> Attribute.MoveType.MoveType -> QualifiedMove x y+mkQualifiedMove	= MkQualifiedMove+
+ src-lib/BishBosh/Component/Turn.hs view
@@ -0,0 +1,178 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The details of a player's turn.+-}++module BishBosh.Component.Turn(+-- * Types+-- ** Data-types+	Turn(+--		MkTurn,+		getQualifiedMove,+		getRank,+		getIsRepeatableMove+	),+-- * Functions+	compareByLVA,+	compareByMVVLVA,+-- ** Constructor+	mkTurn,+-- ** Predicates+	isCapture,+	isPawnDoubleAdvance+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Ord++{- |+	* Defines one turn of a player.++	* Additional data is recorded to facilitate both rollback & recording of the /move/ in various conventional notations.+-}+data Turn x y	= MkTurn {+	getQualifiedMove	:: Component.QualifiedMove.QualifiedMove x y,+	getRank			:: Attribute.Rank.Rank,	-- ^ The /rank/ of /piece/ that was moved, prior to any promotion.+	getIsRepeatableMove	:: Bool			-- ^ Whether this move can ever recur; without rolling-back.+}++instance (Eq x, Eq y) => Eq (Turn x y) where+	MkTurn {+		getQualifiedMove	= qualifiedMove,+		getRank			= rank+	} == MkTurn {+		getQualifiedMove	= qualifiedMove',+		getRank			= rank'+	} = (qualifiedMove, rank) == (qualifiedMove', rank')	-- 'getIsRepeatableMove' can be derived.++instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (Turn x y) where+	rnf MkTurn {+		getQualifiedMove	= qualifiedMove,+		getRank			= rank,+		getIsRepeatableMove	= isRepeatableMove+	} = Control.DeepSeq.rnf (qualifiedMove, rank, isRepeatableMove)++instance (Show x, Show y) => Show (Turn x y) where+	showsPrec _ MkTurn {+		getQualifiedMove	= qualifiedMove,+		getRank			= rank+--		getIsRepeatableMove	= isRepeatableMove+	} = shows (+		qualifiedMove,+		rank+--		isRepeatableMove	-- Derived.+	 ) -- Represent as a tuple.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y+ ) => Read (Turn x y) where+	readsPrec _	= map (Control.Arrow.first $ uncurry mkTurn) . reads++instance Enum y => Property.Reflectable.ReflectableOnX (Turn x y) where+	reflectOnX turn@MkTurn { getQualifiedMove = qualifiedMove } = turn { getQualifiedMove = Property.Reflectable.reflectOnX qualifiedMove }++-- | Smart constructor.+mkTurn+	:: Component.QualifiedMove.QualifiedMove x y+	-> Attribute.Rank.Rank+	-> Turn x y+mkTurn qualifiedMove rank = MkTurn {+	getQualifiedMove	= qualifiedMove,+	getRank			= rank,+	getIsRepeatableMove	= rank /= Attribute.Rank.Pawn {-can't retreat-} && not (+		Attribute.MoveType.isAcyclic $ Component.QualifiedMove.getMoveType qualifiedMove+	) -- Infer.+}++-- | Convenience.+isCapture :: Turn x y -> Bool+isCapture MkTurn { getQualifiedMove = qualifiedMove }	= Attribute.MoveType.isCapture $ Component.QualifiedMove.getMoveType qualifiedMove++-- | Whether the /turn/ represents a @Pawn@'s initial two-square advance.+isPawnDoubleAdvance :: (+	Enum	x,+	Enum	y,+	Eq	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- Defines the side whose /turn/ is referenced.+	-> Turn x y+	-> Bool+isPawnDoubleAdvance logicalColour MkTurn {+	getRank			= Attribute.Rank.Pawn,+	getQualifiedMove	= qualifiedMove+} = Component.Move.isPawnDoubleAdvance logicalColour (Component.QualifiedMove.getMove qualifiedMove) && Component.QualifiedMove.getMoveType qualifiedMove == Data.Default.def+isPawnDoubleAdvance _ _	= False++-- | Forwards the request to 'Attribute.Rank.compareByLVA'.+compareByLVA+	:: Ord rankValue+	=> Attribute.Rank.EvaluateRank rankValue+	-> Turn x y+	-> Turn x y+	-> Ordering+compareByLVA evaluateRank MkTurn { getRank = rankL } MkTurn { getRank = rankR }	= Attribute.Rank.compareByLVA evaluateRank rankL rankR++{- |+	* Compares /turn/s by <http://chessprogramming.wikispaces.com/MVV-LVA>.++	* This orders the most valuable victim of an attack first, but when victims are of equal rank, orders the least valuable aggressor first.++	* N.B.: the order of non-capture moves (including promotions) isn't defined.++	* CAVEAT: no account is made for any defenders of the attacked piece, which might recoup transient gains.+-}+compareByMVVLVA+	:: Ord rankValue+	=> Attribute.Rank.EvaluateRank rankValue+	-> Turn x y+	-> Turn x y+	-> Ordering+compareByMVVLVA evaluateRank turnL@MkTurn {+	getQualifiedMove	= qualifiedMoveL+} turnR@MkTurn {+	getQualifiedMove	= qualifiedMoveR+} = case ($ qualifiedMoveL) &&& ($ qualifiedMoveR) $ Attribute.MoveType.getMaybeImplicitlyTakenRank . Component.QualifiedMove.getMoveType of+	(Nothing, Nothing)	-> EQ+	(Nothing, _)		-> GT+	(_, Nothing)		-> LT+	(Just rankL, Just rankR)+		| rankL == rankR	-> lvaComparison+		| otherwise		-> case Data.Ord.comparing evaluateRank rankR rankL {-MVV-} of+			EQ		-> lvaComparison+			ordering	-> ordering	-- MVV-comparison uniquely defines the order.+	where+		lvaComparison	= compareByLVA evaluateRank turnL turnR+
+ src-lib/BishBosh/Component/Zobrist.hs view
@@ -0,0 +1,225 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://chessprogramming.wikispaces.com/Zobrist+Hashing>.++	* Defines the random-numbers required to construct a hash of a chess-position.++	* Facilitates the construction of a hash from arbitrary data.+-}++module BishBosh.Component.Zobrist(+-- * Type-classes+	Hashable1D(..),+	Hashable2D(..),+-- * Types+-- ** Data-types+	Zobrist(+--		MkZobrist,+		getRandomForBlacksMove+--		getRandomByCoordinatesByRankByLogicalColour,+--		getRandomByCastleableRooksXByLogicalColour,+--		getRandomByEnPassantAbscissa+	),+-- * Constants+--	combiningOp,+-- * Functions+--	measureHammingDistances,+	dereferenceRandomByCoordinatesByRankByLogicalColour,+	dereferenceRandomByCastleableRooksXByLogicalColour,+	dereferenceRandomByEnPassantAbscissa,+	hash2D,+	combine,+-- ** Constructors+	mkZobrist+) where++import			Control.Arrow((***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	System.Random+import qualified	ToolShed.System.Random++-- | The random numbers used to generate a hash, which almost uniquely represent a /position/.+data Zobrist x y positionHash	= MkZobrist {+	getRandomForBlacksMove				:: positionHash,														-- ^ Defines a random number to apply when the next move is @Black@'s.+	getRandomByCoordinatesByRankByLogicalColour	:: Attribute.LogicalColour.ByLogicalColour (Attribute.Rank.ByRank (Cartesian.Coordinates.ByCoordinates x y positionHash)),	-- ^ Defines random numbers to represent all combinations of each piece at each coordinate; though @Pawn@s can't exist on the terminal ranks.++	getRandomByCastleableRooksXByLogicalColour	:: Attribute.LogicalColour.ByLogicalColour [(x, positionHash)],									-- ^ Defines random numbers to represent all combinations of castleable @Rook@s.+	getRandomByEnPassantAbscissa			:: Cartesian.Abscissa.ByAbscissa x positionHash											-- ^ Defines random numbers to represent any file on which capture en-passant might be available.+} deriving Show++instance Foldable (Zobrist x y) where+	foldr f i MkZobrist {+		getRandomForBlacksMove				= randomForBlacksMove,+		getRandomByCoordinatesByRankByLogicalColour	= randomByCoordinatesByRankByLogicalColour,+		getRandomByCastleableRooksXByLogicalColour	= randomByCastleableRooksXByLogicalColour,+		getRandomByEnPassantAbscissa			= randomByEnPassantAbscissa+	} = Data.Foldable.foldr f (+		Data.Foldable.foldr (+			flip . foldr $ f . snd+		) (+			Data.Foldable.foldr (+				flip . Data.Foldable.foldr . flip $ Data.Foldable.foldr f+			) (+				f randomForBlacksMove i+			) randomByCoordinatesByRankByLogicalColour+		) randomByCastleableRooksXByLogicalColour+	 ) randomByEnPassantAbscissa++instance (+	Data.Array.IArray.Ix	x,+	Data.Bits.FiniteBits	positionHash,+	Enum			x,+	Enum			y,+	Num			positionHash,+	Ord			y,+	System.Random.Random	positionHash+ ) => Data.Default.Default (Zobrist x y positionHash) where+	def	= mkZobrist Nothing $ System.Random.mkStdGen 0++{- |+	* <https://chessprogramming.wikispaces.com/Population+Count#HammingDistance>.++	* Quantifies the Hamming distance between all combinations of pairs of the random numbers used to compose hashes.++	* CAVEAT: <https://en.wikipedia.org/wiki/Linear_independence> a better measure of the suitability of the selected random numbers+-}+measureHammingDistances :: Data.Bits.Bits positionHash => Zobrist x y positionHash -> [Int]+measureHammingDistances	= map (Data.Bits.popCount . uncurry Data.Bits.xor) . getCombinations . Data.Foldable.toList where+	getCombinations :: [a] -> [(a, a)]+	getCombinations (x : remainder)	= map ((,) x) remainder ++ getCombinations remainder	-- CAVEAT: O(n^2) time-complexity.+	getCombinations _		= []++-- | Smart constructor.+mkZobrist :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.FiniteBits	positionHash,+	Enum			x,+	Enum			y,+	Num			positionHash,+	Ord			y,+	System.Random.RandomGen randomGen,+	System.Random.Random	positionHash+ )+	=> Maybe Int	-- ^ The optional minimum acceptable Hamming-distance between any two of the selected random numbers.+	-> randomGen+	-> Zobrist x y positionHash+mkZobrist maybeMinimumHammingDistance randomGen+	| Just minimumHammingDistance <- maybeMinimumHammingDistance+	, let minimumHammingDistance'	= minimum $ measureHammingDistances zobrist+	, minimumHammingDistance' < minimumHammingDistance	= Control.Exception.throw . Data.Exception.mkRequestFailure . showString "BishBosh.Component.Zobrist.mkZobrist:\tthe minimum Hamming-distance between the selected random numbers doesn't reach the configured minimum " . shows (minimumHammingDistance', minimumHammingDistance) . showString " => use more than " $ shows (Data.Bits.finiteBitSize randomForBlacksMove) " bits, or re-seed the generator & hope."+	| otherwise						= zobrist+	where+		((randomForBlacksMove, randomByCoordinatesByRankByLogicalColour), (randomByCastleableRooksXByLogicalColour, randomByEnPassantAbscissa))	= (+			(+				head . getNonZeroRandoms *** Attribute.LogicalColour.listArrayByLogicalColour . map (+					Attribute.Rank.listArrayByRank . map (+						Cartesian.Coordinates.listArrayByCoordinates . getNonZeroRandoms+					) . ToolShed.System.Random.randomGens+				) . ToolShed.System.Random.randomGens+			) . System.Random.split+		 ) *** (+			(+				Attribute.LogicalColour.listArrayByLogicalColour . map (+					zip [Cartesian.Abscissa.xMin, Cartesian.Abscissa.xMax] . getNonZeroRandoms+				) . ToolShed.System.Random.randomGens *** Cartesian.Abscissa.listArrayByAbscissa . getNonZeroRandoms+			) . System.Random.split+		 ) $ System.Random.split randomGen where+			getNonZeroRandoms	= filter (/= 0) . System.Random.randoms++		zobrist	= MkZobrist {+			getRandomForBlacksMove				= randomForBlacksMove,+			getRandomByCoordinatesByRankByLogicalColour	= randomByCoordinatesByRankByLogicalColour,+			getRandomByCastleableRooksXByLogicalColour	= randomByCastleableRooksXByLogicalColour,+			getRandomByEnPassantAbscissa			= randomByEnPassantAbscissa+		}++-- | Dereference 'getRandomByCoordinatesByRankByLogicalColour'.+dereferenceRandomByCoordinatesByRankByLogicalColour :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour+	-> Attribute.Rank.Rank+	-> Cartesian.Coordinates.Coordinates x y+	-> Zobrist x y positionHash+	-> positionHash+dereferenceRandomByCoordinatesByRankByLogicalColour logicalColour rank coordinates MkZobrist { getRandomByCoordinatesByRankByLogicalColour = randomByCoordinatesByRankByLogicalColour }	= randomByCoordinatesByRankByLogicalColour ! logicalColour ! rank ! coordinates++-- | Dereference 'getRandomByCastleableRooksXByLogicalColour'.+dereferenceRandomByCastleableRooksXByLogicalColour+	:: Eq x+	=> Attribute.LogicalColour.LogicalColour+	-> x+	-> Zobrist x y positionHash+	-> Maybe positionHash+dereferenceRandomByCastleableRooksXByLogicalColour logicalColour x MkZobrist { getRandomByCastleableRooksXByLogicalColour = randomByCastleableRooksXByLogicalColour }	= lookup x $ randomByCastleableRooksXByLogicalColour ! logicalColour++-- | Dereference 'getRandomByEnPassantAbscissa'.+dereferenceRandomByEnPassantAbscissa+	:: Data.Array.IArray.Ix x+	=> x+	-> Zobrist x y positionHash+	-> positionHash+dereferenceRandomByEnPassantAbscissa x MkZobrist { getRandomByEnPassantAbscissa = randomByEnPassantAbscissa }	= randomByEnPassantAbscissa ! x++-- | An interface to which 1-D hashable data can conform.+class Hashable1D hashable x {-CAVEAT: MultiParamTypeClasses-} where+	listRandoms1D	:: hashable x -> Zobrist x y positionHash -> [positionHash]++-- | An interface to which 2-D hashable data can conform.+class Hashable2D hashable x y {-CAVEAT: MultiParamTypeClasses-} where+	listRandoms2D	:: hashable x y -> Zobrist x y positionHash -> [positionHash]++-- | The operator used when combining random numbers to compose a hash.+combiningOp :: Data.Bits.Bits positionHash => positionHash -> positionHash -> positionHash+combiningOp	= Data.Bits.xor++-- | Resolve a hashable into a hash.+hash2D :: (+	Data.Bits.Bits	positionHash,+	Hashable2D	hashable x y+ )+	=> hashable x y+	-> Zobrist x y positionHash+	-> positionHash+hash2D hashable	= Data.List.foldl1' combiningOp . listRandoms2D hashable++-- | Include a list of random numbers in the hash.+combine :: Data.Bits.Bits positionHash => positionHash -> [positionHash] -> positionHash+combine	= Data.List.foldl' combiningOp+
+ src-lib/BishBosh/ContextualNotation/PGN.hs view
@@ -0,0 +1,676 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a parser for PGN; <https://www.chessclub.com/user/help/pgn-spec>.+-}++module BishBosh.ContextualNotation.PGN(+-- * Types+-- ** Type-synonyms+	Tag,+--	Value,+--	TagPair,+	IsStrictlySequential,+-- ** Data-types+	PGN(+--		MkPGN,+--		getMaybeEventName,+--		getMaybeSiteName,+--		getDay,+		getMaybeRoundName,+--		getMaybeWhitePlayerName,+--		getMaybeBlackPlayerName,+		getIdentificationTagPairs,+		getGame+	),+-- * Constants+--	tagPairDelimiters,+--	ravDelimiters,+--	inProgressFlag,+--	moveNumberTerminator,+	quoteDelimiter,+--	dateComponentSeparator,+	unknownTagValue,+--	eventNameTag,+--	siteNameTag,+	dateTag,+--	roundNameTag,+--	whitePlayerNameTag,+--	blackPlayerNameTag,+--	resultTag,+-- * Functions+	showsDate,+	showsMoveText,+	showsGame,+--	nagParser,+--	moveNumberParser,+--	maybeResultParser,+	moveTextParser,+	parser,+-- ** Constructors+	mkPGN,+	mkPGN',+-- ** Mutators+	setGame+ ) where++import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.ContextualNotation.PGNComment		as ContextualNotation.PGNComment+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason+import qualified	BishBosh.Model.Result				as Model.Result+import qualified	BishBosh.State.TurnsByLogicalColour		as State.TurnsByLogicalColour+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Applicative+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Time.Calendar+import qualified	Data.Time.Clock+import qualified	Text.Printf++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly				as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy		as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain		as Poly+#endif+#else /* Parsec */+import qualified	BishBosh.Data.Integral				as Data.Integral+import qualified	Text.ParserCombinators.Parsec			as Parsec+import			Text.ParserCombinators.Parsec((<?>), (<|>))+#endif++-- | The constant delimiters for a /tag-pair/.+tagPairDelimiters :: (Char, Char)+tagPairDelimiters	= ('[', ']')++-- | The constant delimiters for a /Recursive Annotation Variation/.+ravDelimiters :: (Char, Char)+ravDelimiters		= ('(', ')')++-- | Constant indication of a game still in progress.+inProgressFlag :: Char+inProgressFlag		= '*'++-- | Constant prefix for a /Numeric Annotation Glyph/.+nagPrefix :: Char+nagPrefix		= '$'++-- | Constant terminator for a move-number.+moveNumberTerminator :: Char+moveNumberTerminator	= '.'++-- | Constant delimiter for a tag-value.+quoteDelimiter :: Char+quoteDelimiter		= '"'++-- | Constant separator between the components of a date.+dateComponentSeparator :: Char+dateComponentSeparator	= '.'++-- | Constant used to represent an unknown value for a mandatory tag.+unknownTagValue :: Char+unknownTagValue		= '?'++-- | The type of the name of field in a PGN-specification.+type Tag	= String++-- | The type of the value of field in a PGN-specification.+type Value	= String++-- | Self-documentation.+type TagPair	= (Tag, Value)++-- | Whether moves with an unexpected number should be considered to be an error.+type IsStrictlySequential	= Bool++-- | Qualifies a mandatory tag-value.+eventNameTag :: Tag+eventNameTag		= "Event"++-- | Qualifies a mandatory tag-value.+siteNameTag :: Tag+siteNameTag		= "Site"++-- | Qualifies a mandatory tag-value.+dateTag :: Tag+dateTag			= "Date"++-- | Qualifies a tag-value.+roundNameTag :: Tag+roundNameTag		= "Round"++-- | Qualifies a mandatory tag-value.+whitePlayerNameTag :: Tag+whitePlayerNameTag	= "White"++-- | Qualifies a mandatory tag-value.+blackPlayerNameTag :: Tag+blackPlayerNameTag	= "Black"++-- | Qualifies a tag-value.+resultTag :: Tag+resultTag		= "Result"++-- | Shows the specified date in double quotes.+showsDate :: Data.Time.Calendar.Day -> ShowS+showsDate	= (+	\(y, m, d) -> shows (Text.Printf.printf "%04d.%02d.%02d" y m d :: String)+ ) . Data.Time.Calendar.toGregorian++{- |+	* The data defined by PGN.++	* The first six fields are mandatory part according to the PGN-specification, though none are used by this application.+	The seventh mandatory field 'Result' can be derived from 'getGame'.+-}+data PGN x y	= MkPGN {+	getMaybeEventName		:: Maybe Value,+	getMaybeSiteName		:: Maybe Value,+	getDay				:: Data.Time.Calendar.Day,+	getMaybeRoundName		:: Maybe Value,		-- ^ The name of the round; typically dotted decimal.+	getMaybeWhitePlayerName		:: Maybe Value,+	getMaybeBlackPlayerName		:: Maybe Value,+	getIdentificationTagPairs	:: [TagPair],		-- ^ Arbitrary tagged values.+	getGame				:: Model.Game.Game x y	-- ^ Defines the turn-sequence, the result.+} deriving Eq++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Show (PGN x y) where+	{-# SPECIALISE instance Show (PGN T.X T.Y) #-}+	showsPrec _ MkPGN {+		getMaybeEventName		= maybeEventName,+		getMaybeSiteName		= maybeSiteName,+		getDay				= day,+		getMaybeRoundName		= maybeRoundName,+		getMaybeWhitePlayerName		= maybeWhitePlayerName,+		getMaybeBlackPlayerName		= maybeBlackPlayerName,+		getIdentificationTagPairs	= identificationTagPairs,+		getGame				= game+	} = foldr (+		\(tagName, showsTagValue) accum -> showChar (fst tagPairDelimiters) . showString tagName . showChar ' ' . showsTagValue . showChar (snd tagPairDelimiters) . showChar '\n' . accum+	 ) (+		showsMoveText game . showChar '\n'+	 ) $ [+		(+			eventNameTag,		representUnknownTagValue maybeEventName+		), (+			siteNameTag,		representUnknownTagValue maybeSiteName+		), (+			dateTag,		showsDate day+		), (+			roundNameTag,		representUnknownTagValue maybeRoundName+		), (+			whitePlayerNameTag,	representUnknownTagValue maybeWhitePlayerName+		), (+			blackPlayerNameTag,	representUnknownTagValue maybeBlackPlayerName+		), (+			resultTag,		quote . Data.Maybe.maybe (showChar inProgressFlag) (shows . Model.GameTerminationReason.toResult) $ Model.Game.getMaybeTerminationReason game+		)+	 ] ++ map (+		Control.Arrow.second $ quote . showString+	 ) identificationTagPairs where+		quote :: ShowS -> ShowS+		quote s	= showChar quoteDelimiter . s . showChar quoteDelimiter++		representUnknownTagValue :: Maybe Value -> ShowS+		representUnknownTagValue	= quote . Data.Maybe.maybe (showChar unknownTagValue) showString++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (PGN x y) where+	rnf MkPGN {+		getIdentificationTagPairs	= identificationTagPairs,+		getGame				= game+	} = Control.DeepSeq.rnf (identificationTagPairs, game)	-- CAVEAT: treat other fields lazily, since though they're specified as mandatory, this is isn't observed in practice because they're not typically required.++-- | Smart constructor.+mkPGN+	:: Maybe Value	-- ^ Event-name.+	-> Maybe Value	-- ^ Site-name.+	-> Data.Time.Calendar.Day+	-> Maybe Value	-- ^ Round.+	-> Maybe Value	-- ^ Name of White player.+	-> Maybe Value	-- ^ Name of Black player.+	-> [TagPair]	-- ^ Arbitrary tag-pairs.+	-> Model.Game.Game x y+	-> PGN x y+mkPGN maybeEventName maybeSiteName day maybeRoundName maybeWhitePlayerName maybeBlackPlayerName identificationTagPairs game+	| any (+		(== [unknownTagValue]) . snd {-tag-value-}+	) explicitTags	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.ContextualNotation.PGN.mkPGN:\tunknownTagValue" . Text.ShowList.showsAssociation . shows unknownTagValue . showString " used literally; " $ show explicitTags+	| otherwise	= MkPGN {+		getMaybeEventName		= maybeEventName,+		getMaybeSiteName		= maybeSiteName,+		getDay				= day,+		getMaybeRoundName		= maybeRoundName,+		getMaybeWhitePlayerName		= maybeWhitePlayerName,+		getMaybeBlackPlayerName		= maybeBlackPlayerName,+		getIdentificationTagPairs	= identificationTagPairs,+		getGame				= game+	}+	where+		explicitTags	= [+			(tag, value) |+				(tag, Just value)	<- [+					(+						eventNameTag,		maybeEventName+					), (+						siteNameTag,		maybeSiteName+					), (+						whitePlayerNameTag,	maybeWhitePlayerName+					), (+						blackPlayerNameTag,	maybeBlackPlayerName+					)+				 ] -- Those tags for which an unknown value is represented by 'unknownTagValue'.+		 ] -- List-comprehension.++-- | Mutator.+setGame :: Model.Game.Game x y -> PGN x y -> PGN x y+setGame game pgn	= pgn { getGame = game }++-- | Smart-constructor.+mkPGN'+	:: [Tag]	-- ^ Identify fields used to form a unique composite game-identifier.+	-> [TagPair]	-- ^ The data from which to extract the required values.+	-> Model.Game.Game x y+	-> PGN x y+mkPGN' identificationTags tagPairs	= mkPGN maybeEventName maybeSiteName (+	let+#ifdef USE_POLYPARSE+		dateParser :: Text.Poly.TextParser Data.Time.Calendar.Day+		dateParser	= do+			[y, m, d]	<- Text.Poly.spaces >> Poly.sepBy1 Text.Poly.unsignedDecimal (Text.Poly.char dateComponentSeparator)++			return {-to Parser-monad-} $ Data.Time.Calendar.fromGregorian (fromIntegral y) m d+	in Data.Maybe.maybe (+		Control.Exception.throw . Data.Exception.mkSearchFailure . showString "failed to find " $ show dateTag	-- N.B.: this will only terminate the application when the date is evaluated.+	) (+#if USE_POLYPARSE != 1+		either (+			Control.Exception.throw . Data.Exception.mkParseFailure . showString "failed to parse " . shows dateTag . showString "; " . show+		) id .+#endif+		fst . Poly.runParser dateParser+#else /* Parsec */+		dateParser :: Parsec.Parser Data.Time.Calendar.Day+		dateParser	= do+			[y, m, d]	<- Parsec.spaces >> (Parsec.sepBy1 (Control.Applicative.some Parsec.digit) (Parsec.char dateComponentSeparator)	<?> "YYYY.MM.DD")++			return {-to ParsecT-monad-} $ Data.Time.Calendar.fromGregorian (read y) (read m) (read d)+	in Data.Maybe.maybe (+		Control.Exception.throw . Data.Exception.mkSearchFailure . showString "failed to find " $ show dateTag	-- N.B.: this will only terminate the application when the date is evaluated.+	) (+		either (+			Control.Exception.throw . Data.Exception.mkParseFailure . showString "failed to parse " . shows dateTag . showString "; " . show+		) id . Parsec.parse dateParser "Date-parser"+#endif+	) maybeDate+ ) maybeRoundName maybeWhitePlayerName maybeBlackPlayerName $ filter (+	(`elem` identificationTags) . fst {-tag-}+ ) tagPairs where+	[maybeEventName, maybeSiteName, maybeDate, maybeRoundName, maybeWhitePlayerName, maybeBlackPlayerName]	= map (+		`Data.Map.lookup` Data.Map.fromList tagPairs+	 ) [+		eventNameTag,+		siteNameTag,+		dateTag,+		roundNameTag,+		whitePlayerNameTag,+		blackPlayerNameTag+	 ]++{- |+	* Represents the specified /game/ in /Portable Game Notation/; <https://www.chessclub.com/user/help/pgn-spec>.++	* This function is only responsible for the line defining the numbered sequence of /move/s represented in SAN.+-}+showsMoveText :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Model.Game.Game x y -> ShowS+{-# SPECIALISE showsMoveText :: Model.Game.Game T.X T.Y -> ShowS #-}+showsMoveText game	= foldr (.) (+	Data.Maybe.maybe (+		showsBlockComment "Game unfinished" . showChar ' ' . showChar inProgressFlag+	) (+		(+			\(s, showsPGN) -> showsBlockComment s . showChar ' ' . showsPGN+		) . (+			filter (/= ContextualNotation.PGNComment.blockCommentEnd) . show &&& shows . Model.GameTerminationReason.toResult+		)+	) $ Model.Game.getMaybeTerminationReason game+ ) $ Data.List.unfoldr (+	\(moveNumber, turns) -> case turns of+		showsWhiteMove : remainder	-> Just . (+			(+				\moveList -> shows moveNumber . showChar moveNumberTerminator . showChar ' ' . showsWhiteMove . Data.Maybe.maybe id (+					\showsBlackMove -> showChar ' ' . showsBlackMove+				) (+					Data.Maybe.listToMaybe moveList+				) . showChar ' '	-- Show an element.+			) *** (,) (succ moveNumber)+		 ) $ Data.List.splitAt 1 remainder+		_				-> Nothing+ ) (+	1	:: Component.Move.NMoves,+	reverse {-chronological-} $ fst . foldr (+		\turn (l, game')	-> (+			ContextualNotation.StandardAlgebraic.showsTurn False turn game' : l,+			Model.Game.takeTurn turn game'+		) -- Pair.+	) ([], Data.Default.def {-game-}) $ Model.Game.listTurns game+ ) where+	showsBlockComment :: String -> ShowS+	showsBlockComment	= shows . ContextualNotation.PGNComment.BlockComment++-- | Shows PGN for the specified /game/, with defaults for other fields.+showsGame :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Model.Game.Game x y -> IO ShowS+{-# SPECIALISE showsGame :: Model.Game.Game T.X T.Y -> IO ShowS #-}+showsGame game	= do+	utcTime	<- Data.Time.Clock.getCurrentTime++	return {-to IO-monad-} . shows $ mkPGN Nothing Nothing (Data.Time.Clock.utctDay utcTime) Nothing Nothing Nothing [] game++-- | Parse a /Numeric Annotation Glyph/.+nagParser :: (+	Num	i,+	Ord	i,+	Show	i+ ) =>+#ifdef USE_POLYPARSE+	Text.Poly.TextParser i+nagParser	= do+	code	<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Text.Poly.char nagPrefix >> Text.Poly.unsignedDecimal++	if code > maxCode+		then Poly.failBad . shows code . showString " > maximum NAG" . Text.ShowList.showsAssociation $ shows maxCode "."+		else return {-to Parser-monad-} code+#else /* Parsec */+	Parsec.Parser i+nagParser	= Parsec.try $ do+	code	<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> Parsec.char nagPrefix >> fmap Data.Integral.stringToUnsignedDecimal (Control.Applicative.some Parsec.digit)++	if code > maxCode+		then fail . shows code . showString " > maximum NAG" . Text.ShowList.showsAssociation $ shows maxCode "."+		else return {-to ParsecT-monad-} code+#endif+	where+		maxCode	= 255++{- |+	* Parses a move-number.++	* N.B.: officially terminated by a single period (for White), or three (by Black); though this parser is more flexible.+-}+moveNumberParser :: Num n =>+#ifdef USE_POLYPARSE+	Text.Poly.TextParser n+moveNumberParser	= Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.unsignedDecimal `Poly.discard` Control.Applicative.some (Text.Poly.char moveNumberTerminator)+#else /* Parsec */+	Parsec.Parser n+moveNumberParser	= Parsec.try $ Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> fmap Data.Integral.stringToUnsignedDecimal (+	Parsec.manyTill Parsec.digit (+		Control.Applicative.some $ Parsec.char moveNumberTerminator+	) <?> "Move-number"+ )+#endif++-- | Parse an optional result.+maybeResultParser ::+#ifdef USE_POLYPARSE+	Text.Poly.TextParser (Maybe Model.Result.Result)+maybeResultParser	= Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Poly.oneOf' [+	(+		"Result",+		Poly.oneOf $ map (+			\result -> Text.Poly.string (show result) >> return {-to Parser-monad-} (Just result)	-- CAVEAT: for some reason, this conflates "1-0" with "1/2-1/2", when lazy-parsing with ghc-8.0.1 & polyparse-1.12 ?!+		) Model.Result.range+	), (+		"Game unfinished",+		Poly.commit (Text.Poly.char inProgressFlag) >> return {-to Parser-monad-} Nothing+	)+ ]+#else /* Parsec */+	Parsec.Parser (Maybe Model.Result.Result)+maybeResultParser	= Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> (+	Parsec.try (+		Parsec.choice $ map (+			\result -> Parsec.try $ (Parsec.string (show result) <?> "Result") >> return {-to ParsecT-monad-} (Just result)+		) Model.Result.range+	) <|> (+		(Parsec.char inProgressFlag <?> "Game unfinished") >> return {-to ParsecT-monad-} Nothing+	)+ )+#endif++-- | Parses a /game/ from PGN move-text.+moveTextParser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+#ifdef USE_POLYPARSE+	=> IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> Text.Poly.TextParser (Model.Game.Game x y)+{-# SPECIALISE moveTextParser :: IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> Text.Poly.TextParser (Model.Game.Game T.X T.Y) #-}+moveTextParser isStrictlySequential validateMoves	= let+	elementSequenceParser :: (+		Enum	x,+		Enum	y,+		Ord	x,+		Ord	y,+		Show	x,+		Show	y+	 ) => Model.Game.Game x y -> Text.Poly.TextParser (Model.Game.Game x y)+	elementSequenceParser game	= let+		expectedMoveNumber	= succ . (`div` 2) . State.TurnsByLogicalColour.getNPlies $ Model.Game.getTurnsByLogicalColour game+	 in do+		moveNumber	<- (+			if Attribute.LogicalColour.isBlack $ Model.Game.getNextLogicalColour game+				then fmap (Data.Maybe.fromMaybe expectedMoveNumber) . Control.Applicative.optional+				else id+		 ) moveNumberParser++		if isStrictlySequential && moveNumber /= expectedMoveNumber+			then do+				context	<- Poly.manyFinally' Poly.next $ Text.Poly.char '\n'++				Poly.failBad . showString "found " . shows (Model.Game.getNextLogicalColour game) . showString " move-number" . Text.ShowList.showsAssociation . shows moveNumber . showString " where " . shows expectedMoveNumber . showString " expected, before " $ shows context "."+			else do+				game'	<- fmap (`ContextualNotation.StandardAlgebraic.movePiece` game) $ Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> ContextualNotation.StandardAlgebraic.parser False {-explicitEnPassant-} validateMoves game++				Control.Applicative.many (+					nagParser :: Text.Poly.TextParser Int+				 ) >> Control.Applicative.many (+					uncurry Poly.bracket (+						(+							\c -> Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Text.Poly.char c+						) *** (+							\c -> Poly.commit $ Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Text.Poly.char c+						) $ ravDelimiters+					) $ elementSequenceParser game {-recurse-}+				 ) >> fmap (Data.Maybe.fromMaybe game') (+					Control.Applicative.optional $ elementSequenceParser game' {-recurse-}+				 )+ in do+	game	<- fmap (Data.Maybe.fromMaybe Data.Default.def {-game-}) . Control.Applicative.optional $ elementSequenceParser Data.Default.def {-game-}+#else /* Parsec */+	=> IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> Parsec.Parser (Model.Game.Game x y)+{-# SPECIALISE moveTextParser :: IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> Parsec.Parser (Model.Game.Game T.X T.Y) #-}+moveTextParser isStrictlySequential validateMoves	= let+	elementSequenceParser :: (+		Enum	x,+		Enum	y,+		Ord	x,+		Ord	y,+		Show	x,+		Show	y+	 ) => Model.Game.Game x y -> Parsec.Parser (Model.Game.Game x y)+	elementSequenceParser game	= let+		expectedMoveNumber	= succ . (`div` 2) . State.TurnsByLogicalColour.getNPlies $ Model.Game.getTurnsByLogicalColour game+	 in do+		moveNumber	<- (+			if Attribute.LogicalColour.isBlack $ Model.Game.getNextLogicalColour game+				then fmap (Data.Maybe.fromMaybe expectedMoveNumber) . Control.Applicative.optional+				else id+		 ) moveNumberParser++		if isStrictlySequential && moveNumber /= expectedMoveNumber+			then fail . showString "found " . shows (Model.Game.getNextLogicalColour game) . showString " move-number" . Text.ShowList.showsAssociation . shows moveNumber . showString " where " $ shows expectedMoveNumber " expected."+			else do+				game'	<- (`ContextualNotation.StandardAlgebraic.movePiece` game) <$> (Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> ContextualNotation.StandardAlgebraic.parser False {-explicitEnPassant-} validateMoves game)++				Control.Applicative.many (+					nagParser :: Parsec.Parser Int+				 ) >> Control.Applicative.many (+					Parsec.try . uncurry Parsec.between (+						(+							\c -> Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> Parsec.char c+						) *** (+							\c -> Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> Parsec.char c+						) $ ravDelimiters+					) $ elementSequenceParser game {-recurse-}+				 ) >> Parsec.option game' (+					Parsec.try $ elementSequenceParser game' {-recurse-}+				 )+ in do+	game	<- Parsec.option Data.Default.def {-game-} . Parsec.try $ elementSequenceParser Data.Default.def {-game-}+#endif+	Data.Maybe.maybe game (`Model.Game.updateTerminationReasonWith` game) `fmap` maybeResultParser++{- |+	* Parses /PGN/.++	* CAVEAT: this process is inherently strict when using either "Parsec" or "Poly.Plain", since on failure they returns @Left@, which can't be determined until parsing has finished.+-}+parser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> [Tag]	-- ^ Identify fields used to form a unique composite game-identifier.+#ifdef USE_POLYPARSE+	-> Text.Poly.TextParser (PGN x y)+{-# SPECIALISE parser :: IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [Tag] -> Text.Poly.TextParser (PGN T.X T.Y) #-}+parser isStrictlySequential validateMoves identificationTags	= do+	tagPairs	<- Control.Applicative.many $ tagPairParser <* Control.Applicative.many ContextualNotation.PGNComment.parser+	moveText	<- moveTextParser' <* Control.Applicative.many ContextualNotation.PGNComment.parser++	return {-to Parser-monad-} $ mkPGN' identificationTags (removeUnknownTagValues tagPairs) moveText++	where+		tagPairParser :: Text.Poly.TextParser TagPair+		tagPairParser	= Control.Applicative.many ContextualNotation.PGNComment.parser >> Text.Poly.spaces >> uncurry Poly.bracket (+			Text.Poly.char *** Poly.commit . Text.Poly.char $ tagPairDelimiters+		 ) (+			do+				tagName		<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Poly.commit (Control.Applicative.some $ Poly.satisfyMsg isValidTagCharacter "Tag-name")+				tagValue	<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces >> Poly.bracket (+					Text.Poly.char quoteDelimiter+				 ) (+					Poly.commit $ Text.Poly.char quoteDelimiter+				 ) (+					Control.Applicative.many $ Poly.satisfyMsg (/= quoteDelimiter) "Tag-value"	-- TODO: must account for escaped quotes.+				 )++				Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Text.Poly.spaces++				return {-to Parser-monad-} (tagName, tagValue)+		 )+#else /* Parsec */+	-> Parsec.Parser (PGN x y)+{-# SPECIALISE parser :: IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [Tag] -> Parsec.Parser (PGN T.X T.Y) #-}+parser isStrictlySequential validateMoves identificationTags	= mkPGN' identificationTags <$> (+	removeUnknownTagValues <$> Control.Applicative.many (+		tagPairParser <* Control.Applicative.many ContextualNotation.PGNComment.parser+	)+ ) <*> moveTextParser' <* Control.Applicative.many ContextualNotation.PGNComment.parser+	where+		tagPairParser :: Parsec.Parser TagPair+		tagPairParser	= Parsec.try $ Control.Applicative.many ContextualNotation.PGNComment.parser >> Parsec.spaces >> uncurry Parsec.between (+			Parsec.char *** Parsec.char $ tagPairDelimiters+		 ) (+			do+				tagName		<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> (Control.Applicative.some (Parsec.satisfy isValidTagCharacter) <?> "Tag-name")+				tagValue	<- Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces >> Parsec.between (+					Parsec.char quoteDelimiter+				 ) (+					Parsec.char quoteDelimiter+				 ) (+					Control.Applicative.many (Parsec.satisfy (/= quoteDelimiter))	<?> "Tag-value"	-- TODO: must account for escaped quotes.+				 )++				Control.Applicative.many ContextualNotation.PGNComment.blockCommentParser >> Parsec.spaces++				return {-to ParsecT-monad-} (tagName, tagValue)+		 )+#endif+		moveTextParser'	= moveTextParser isStrictlySequential validateMoves++		isValidTagCharacter :: Char -> Bool+		isValidTagCharacter	= uncurry (&&) . (not . Data.Char.isSpace &&& (/= quoteDelimiter))++		removeUnknownTagValues :: [TagPair] -> [TagPair]+		removeUnknownTagValues	= filter ((/= [unknownTagValue]) . snd {-tag-value-})+
+ src-lib/BishBosh/ContextualNotation/PGNComment.hs view
@@ -0,0 +1,143 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements a parser for PGN-comments.+-}++module BishBosh.ContextualNotation.PGNComment(+-- * Types+-- ** Data-types+	PGNComment(..),+-- * Constants+--	blockCommentStart,+	blockCommentEnd,+--	lineCommentStart,+	lineCommentEnd,+-- * Functions+	blockCommentParser,+--	lineCommentParser,+	parser,+-- ** Accessors+	getString+) where++import			Control.Applicative((<|>))+import qualified	Control.Applicative++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly			as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif+#else /* Parsec */+import qualified	Control.Monad+import qualified	Text.ParserCombinators.Parsec		as Parsec+import			Text.ParserCombinators.Parsec((<?>))+#endif++-- | Constant comment start-delimiter.+blockCommentStart :: Char+blockCommentStart	= '{'++-- | Constant comment end-delimiter.+blockCommentEnd :: Char+blockCommentEnd		= '}'++-- | Constant comment end-delimiter.+lineCommentStart :: Char+lineCommentStart	= ';'++-- | Constant comment end-delimiter.+lineCommentEnd :: Char+lineCommentEnd		= '\n'++-- | Represents a comment in PGN.+data PGNComment	= BlockComment String | LineComment String++instance Show PGNComment where+	showsPrec _ (BlockComment s)	= showChar blockCommentStart . showString s . showChar blockCommentEnd+	showsPrec _ (LineComment s)	= showChar lineCommentStart . showString s . showChar lineCommentEnd++-- | Accessor.+getString :: PGNComment -> String+getString (BlockComment s)	= s+getString (LineComment s)	= s++-- | Parses PGN block-comments.+blockCommentParser ::+#ifdef USE_POLYPARSE+	Text.Poly.TextParser PGNComment+blockCommentParser	= Text.Poly.spaces >> Poly.bracket (+	Text.Poly.char blockCommentStart+ ) (+	Text.Poly.char blockCommentEnd	-- CAVEAT: 'Poly.commit' here fails ?!+ ) (+	BlockComment `fmap` Control.Applicative.many (Poly.satisfyMsg (/= blockCommentEnd) "Block-comment")+ )+#else /* Parsec */+	Parsec.Parser PGNComment+blockCommentParser	= Parsec.try (+	Parsec.spaces >> Parsec.between (+		Parsec.char blockCommentStart	<?> "Block-comment start"+	) (+		Parsec.char blockCommentEnd	<?> "Block-comment end"+	) (+		BlockComment `fmap` Control.Applicative.many (Parsec.satisfy (/= blockCommentEnd)) <?> "Block-comment text"+	) <?> "Block-comment"+ )+#endif++-- | Parses PGN line-comments.+lineCommentParser ::+#ifdef USE_POLYPARSE+	Text.Poly.TextParser PGNComment+lineCommentParser	= Text.Poly.spaces >> Poly.bracket (+	Text.Poly.char lineCommentStart+ ) (+	Poly.commit $ Text.Poly.char lineCommentEnd <|> Poly.eof+ ) (+	LineComment `fmap` Control.Applicative.many (Poly.satisfyMsg (/= lineCommentEnd) "Line-comment text")+ )+#else /* Parsec */+	Parsec.Parser PGNComment+lineCommentParser	= Parsec.try (+	Parsec.spaces >> Parsec.between (+		Parsec.char lineCommentStart	<?> "Line-comment start"+	) (+		Control.Monad.void (Parsec.char lineCommentEnd <?> "EOLN") <|> (Parsec.eof <?> "EOF")+	) (+		LineComment `fmap` Control.Applicative.many (Parsec.satisfy (/= lineCommentEnd)) <?> "Line-comment text"+	) <?> "Line-comment"+ )+#endif++-- | Parses PGN-comments.+parser ::+#ifdef USE_POLYPARSE+	Text.Poly.TextParser String+#else /* Parsec */+	Parsec.Parser String+#endif+parser	= fmap getString $ blockCommentParser <|> lineCommentParser+
+ src-lib/BishBosh/ContextualNotation/PGNDatabase.hs view
@@ -0,0 +1,125 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Parses a PGN-database.+-}++module BishBosh.ContextualNotation.PGNDatabase(+-- * Types+-- ** Type-synonyms+	PGNDatabase,+-- * Functions+--	parser,+--	parse,+	parseIO+ ) where++import qualified	BishBosh.ContextualNotation.PGN			as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Types					as T+import qualified	System.FilePath++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly				as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy		as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain		as Poly+#endif+#else /* Parsec */+import qualified	Text.ParserCombinators.Parsec			as Parsec+import			Text.ParserCombinators.Parsec((<?>))+#endif++-- | Self-documentation.+type PGNDatabase x y	= [ContextualNotation.PGN.PGN x y]++-- | Parse a PGN-database.+parser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ContextualNotation.PGN.IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> [ContextualNotation.PGN.Tag]+#ifdef USE_POLYPARSE+	-> Text.Poly.TextParser (PGNDatabase x y)+{-# SPECIALISE parser :: ContextualNotation.PGN.IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [ContextualNotation.PGN.Tag] -> Text.Poly.TextParser (PGNDatabase T.X T.Y) #-}+parser isStrictlySequential validateMoves identificationTags	= Poly.manyFinally' parser' $ Text.Poly.spaces >> Poly.eof+#else /* Parsec */+	-> Parsec.Parser (PGNDatabase x y)+{-# SPECIALISE parser :: ContextualNotation.PGN.IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [ContextualNotation.PGN.Tag] -> Parsec.Parser (PGNDatabase T.X T.Y) #-}+parser isStrictlySequential validateMoves identificationTags	= Parsec.manyTill parser' (Parsec.try $ Parsec.spaces >> Parsec.try Parsec.eof)	<?> "PGN-database"+#endif+	where+		parser'	= ContextualNotation.PGN.parser isStrictlySequential validateMoves identificationTags++-- | Reads a PGN-database from the specified string.+parse :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> String	-- ^ The name of the specified database.+	-> ContextualNotation.PGN.IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> [ContextualNotation.PGN.Tag]+	-> String	-- ^ The database-contents.+	-> Either String (PGNDatabase x y)+{-# SPECIALISE parse :: String -> ContextualNotation.PGN.IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [ContextualNotation.PGN.Tag] -> String -> Either String (PGNDatabase T.X T.Y) #-}+#ifdef USE_POLYPARSE+#if USE_POLYPARSE == 1+parse _ isStrictlySequential validateMoves identificationTags		= Right	-- N.B.: the lazy parser throws an exception rather than returning 'Either', because otherwise it can't choose whether to construct with 'Left' or 'Right' until the input has been fully parsed.+#else /* Plain */+parse name isStrictlySequential validateMoves identificationTags	= either (Left . showString "regarding " . shows name . showString ", ") Right+#endif+	. fst {-discard unparsed data-} . Poly.runParser parser'+#else /* Parsec */+parse name isStrictlySequential validateMoves identificationTags	= either (Left . showString "failed to parse; " . show) Right . Parsec.parse parser' name+#endif+	where+		parser'	= parser isStrictlySequential validateMoves identificationTags++-- | Reads a PGN-database from the specified file-path.+parseIO :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> System.FilePath.FilePath+	-> ContextualNotation.PGN.IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> [ContextualNotation.PGN.Tag]+	-> IO (Either String (PGNDatabase x y))+{-# SPECIALISE parseIO :: System.FilePath.FilePath -> ContextualNotation.PGN.IsStrictlySequential -> ContextualNotation.StandardAlgebraic.ValidateMoves -> [ContextualNotation.PGN.Tag] -> IO (Either String (PGNDatabase T.X T.Y)) #-}+parseIO filePath isStrictlySequential validateMoves identificationTags	= parse filePath isStrictlySequential validateMoves identificationTags `fmap` readFile filePath+
+ src-lib/BishBosh/ContextualNotation/PositionHashQualifiedMoveTree.hs view
@@ -0,0 +1,343 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Facilitates matching of the current /position/ with a tree built from standard openings.+-}++module BishBosh.ContextualNotation.PositionHashQualifiedMoveTree(+-- * Types+-- ** Type-synonyms+--	Tree,+	OnymousQualifiedMove,+--	FindMatch,+-- ** Data-types+	NodeLabel(),+	PositionHashQualifiedMoveTree(),+-- * Functions+--	onymiseQualifiedMove,+--	findNextOnymousQualifiedMovesForGame,+	findNextOnymousQualifiedMovesForPosition,+--	findNextJoiningOnymousQualifiedMovesFromPosition,+	findNextOnymousQualifiedMoves,+	maybeRandomlySelectOnymousQualifiedMove,+-- ** Constructors+	fromQualifiedMoveForest,+-- ** Predicates+--	cantConverge,+	isTerminal+ ) where++import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest	as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.Result				as Model.Result+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Parallel.Strategies+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Tree+import qualified	Factory.Math.Statistics+import qualified	System.Random+import qualified	ToolShed.System.Random++-- | Each label of the tree contains a Zobrist-hash of the current position, augmented (except in the case of the apex-game) by the last move that was played & any conclusive result.+data NodeLabel x y positionHash	= MkNodeLabel {+	getPositionHash				:: positionHash,+	getMaybeQualifiedMoveWithOnymousResult	:: Maybe (Component.QualifiedMove.QualifiedMove x y, Maybe ContextualNotation.QualifiedMoveForest.OnymousResult)+}++-- | The tree of /qualified move/s.+type Tree x y positionHash	= Data.Tree.Tree (NodeLabel x y positionHash)++-- | Constructor.+data PositionHashQualifiedMoveTree x y positionHash	= MkPositionHashQualifiedMoveTree {+	getZobrist		:: Component.Zobrist.Zobrist x y positionHash,	-- ^ Used to hash each position in the tree.+	getTree			:: Tree x y positionHash,+	getMinimumPieces	:: Component.Piece.NPieces			-- ^ The minimum number of pieces remaining after the last move in any game defined in the tree.+}++-- | Augment the specified /qualified-move forest/ with a zobrist-hash of the /position/ & include the default initial game at the apex.+fromQualifiedMoveForest :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Enum			x,+	Enum			y,+	Ord			y,+	Show			x,+	Show			y+ )+	=> Bool	-- ^ IncrementalEvaluation.+	-> Component.Zobrist.Zobrist x y positionHash+	-> ContextualNotation.QualifiedMoveForest.QualifiedMoveForest x y+	-> PositionHashQualifiedMoveTree x y positionHash+{-# SPECIALISE fromQualifiedMoveForest :: Bool -> Component.Zobrist.Zobrist T.X T.Y T.PositionHash -> ContextualNotation.QualifiedMoveForest.QualifiedMoveForest T.X T.Y -> PositionHashQualifiedMoveTree T.X T.Y T.PositionHash #-}+fromQualifiedMoveForest incrementalEvaluation zobrist qualifiedMoveForest	= MkPositionHashQualifiedMoveTree {+	getZobrist		= zobrist,+	getTree			= let+		initialGame		= Data.Default.def+		initialPositionHash	= Component.Zobrist.hash2D initialGame zobrist+	in Data.Tree.Node {+		Data.Tree.rootLabel	= MkNodeLabel initialPositionHash Nothing,+		Data.Tree.subForest	= map (+			if incrementalEvaluation+				then let+					slave game positionHash Data.Tree.Node {+						Data.Tree.rootLabel	= label@(qualifiedMove, _),+						Data.Tree.subForest	= qualifiedMoveForest'+					} = Data.Tree.Node {+						Data.Tree.rootLabel	= MkNodeLabel positionHash' $ Just label,+						Data.Tree.subForest	= map (slave game' positionHash') qualifiedMoveForest'	-- Recurse.+					} where+						game'		= Model.Game.applyQualifiedMove qualifiedMove game+						positionHash'	= Model.Game.incrementalHash game positionHash game' zobrist+				in slave initialGame initialPositionHash+				else let+					slave game Data.Tree.Node {+						Data.Tree.rootLabel	= label@(qualifiedMove, _),+						Data.Tree.subForest	= qualifiedMoveForest'+					} = Data.Tree.Node {+						Data.Tree.rootLabel	= MkNodeLabel (Component.Zobrist.hash2D game' zobrist) $ Just label,	-- Hash the game after applying the move.+						Data.Tree.subForest	= map (slave game') qualifiedMoveForest'	-- Recurse.+					} where+						game'	= Model.Game.applyQualifiedMove qualifiedMove game+				in slave initialGame+		) $ ContextualNotation.QualifiedMoveForest.deconstruct qualifiedMoveForest+	},+	getMinimumPieces	= ContextualNotation.QualifiedMoveForest.findMinimumPieces qualifiedMoveForest+}++-- | Predicate.+isTerminal :: PositionHashQualifiedMoveTree x y positionHash -> Bool+isTerminal MkPositionHashQualifiedMoveTree { getTree = Data.Tree.Node { Data.Tree.subForest = [] } }	= True+isTerminal _												= False++{- |+	* Determines whether, based on the current number of pieces, the specified game can't migrate to any /position/ defined in the tree.++	* CAVEAT: a negative result doesn't imply that convergence is possible, since other factors may prevent it.+-}+cantConverge :: Model.Game.Game x y -> PositionHashQualifiedMoveTree x y positionHash -> Bool+cantConverge game MkPositionHashQualifiedMoveTree { getMinimumPieces = minimumPieces }	= State.Board.getNPieces (Model.Game.getBoard game) < minimumPieces++-- | A /qualified move/ annotated by the name & ultimate /result/, of each /game/ from which it could have originated.+type OnymousQualifiedMove x y	= (Component.QualifiedMove.QualifiedMove x y, [ContextualNotation.QualifiedMoveForest.OnymousResult])++-- | Find the /onymous result/s for all /game/s originating from the specified tree.+onymiseQualifiedMove :: Tree x y positionHash -> OnymousQualifiedMove x y+onymiseQualifiedMove	= (+	fst {-qualifiedMove-} . head &&& Data.Maybe.mapMaybe snd {-Maybe OnymousResult-}+ ) . map (+	\MkNodeLabel { getMaybeQualifiedMoveWithOnymousResult = Just qualifiedMoveWithOnymousResult } -> qualifiedMoveWithOnymousResult+ ) . Data.Tree.flatten++-- | The type of a function used to locate a match in the tree.+type FindMatch x y positionHash	= Model.Game.Game x y -> PositionHashQualifiedMoveTree x y positionHash -> [OnymousQualifiedMove x y]++-- | For any exactly matching /game/ in the tree, return the subsequent /qualifiedMove/s.+findNextOnymousQualifiedMovesForGame :: (Eq x, Eq y) => FindMatch x y positionHash+findNextOnymousQualifiedMovesForGame requiredGame	= slave (+	Model.Game.listTurnsChronologically requiredGame+ ) . Data.Tree.subForest {-remove the apex which lacks a founding move-} . getTree where+	slave (turn : remainingTurns)	= Data.Maybe.maybe [] {-match-failure-} (+		slave remainingTurns . Data.Tree.subForest	-- Recurse.+	 ) . Data.List.find (+		\Data.Tree.Node {+			Data.Tree.rootLabel	= MkNodeLabel { getMaybeQualifiedMoveWithOnymousResult = Just (qualifiedMove, _) }+		} -> qualifiedMove == Component.Turn.getQualifiedMove turn+	 )+	slave _ {-none left to match-}	= map onymiseQualifiedMove++{- |+	* For all matching /position/s, return the subsequent /qualifiedMove/.++	* By matching the /position/ rather than the precise sequence of /move/s, transpositions <https://chessprogramming.wikispaces.com/Transposition> can also be identified.++	* CAVEAT: a null list can result from either match-failure, or a match with the final /move/ of a /game/.+-}+findNextOnymousQualifiedMovesForPosition :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Enum			x,+	Enum			y,+	Ord			y+ ) => FindMatch x y positionHash+{-# SPECIALISE findNextOnymousQualifiedMovesForPosition :: FindMatch T.X T.Y T.PositionHash #-}+findNextOnymousQualifiedMovesForPosition requiredGame positionHashQualifiedMoveTree@MkPositionHashQualifiedMoveTree {+	getZobrist	= zobrist,+	getTree		= tree+}+	| cantConverge requiredGame positionHashQualifiedMoveTree	= []	-- The specified game has fewer pieces than any defined in the tree.+	| otherwise							= slave (2 * Component.Piece.nPiecesPerSide) tree+	where+		slave nPieces Data.Tree.Node {+			Data.Tree.rootLabel	= MkNodeLabel { getPositionHash = positionHash },+			Data.Tree.subForest	= forest+		}+			| nPieces < State.Board.getNPieces (+				Model.Game.getBoard requiredGame+			)		= []	-- There are fewer pieces remaining in the tree than required.+			| otherwise	= (+				if positionHash == Component.Zobrist.hash2D requiredGame zobrist+					then (+						map onymiseQualifiedMove forest ++	-- The Zobrist-hash/position matches, so one can select any move from the forest.+					) -- Section.+					else id+			) $ concatMap (+				\node@Data.Tree.Node {+					Data.Tree.rootLabel	= MkNodeLabel { getMaybeQualifiedMoveWithOnymousResult = Just (qualifiedMove, _) }+				} -> slave (+					Attribute.MoveType.nPiecesMutator (Component.QualifiedMove.getMoveType qualifiedMove) nPieces+				) node -- Recurse to see if deeper matches exist.+			) forest++-- | Finds any single /move/s which can join the current /position/ with a member of the forest.+findNextJoiningOnymousQualifiedMovesFromPosition :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Enum			x,+	Enum			y,+	Ord			y,+	Show			x,+	Show			y+ ) => FindMatch x y positionHash+{-# SPECIALISE findNextJoiningOnymousQualifiedMovesFromPosition :: FindMatch T.X T.Y T.PositionHash #-}+findNextJoiningOnymousQualifiedMovesFromPosition game positionHashQualifiedMoveTree	= [+	(+		preMatchQualifiedMove,+		concatMap snd {-[OnymousResult]-} matchingOnymousQualifiedMoves	-- Discard the opponent's matching move, but cite the names of archived games it reached.+	) |+		not $ Model.Game.isTerminated game,+		(preMatchQualifiedMove, matchingOnymousQualifiedMoves)	<- Control.Parallel.Strategies.withStrategy (+			Control.Parallel.Strategies.parList $ Control.Parallel.Strategies.parTuple2 Control.Parallel.Strategies.r0 Control.Parallel.Strategies.rdeepseq+		) . map (+			id &&& (`findNextOnymousQualifiedMovesForPosition` positionHashQualifiedMoveTree) . (`Model.Game.applyQualifiedMove` game)	-- Apply this player's move.+		) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game,+		not $ null matchingOnymousQualifiedMoves+ ] -- List-comprehension.++{- |+	* Calls 'findNextOnymousQualifiedMovesForGame' to find an exact match for the current /game/ in the tree.++	* Calls 'findNextOnymousQualifiedMovesForPosition' to find a match for the current /position/ in the tree.++	* On failure, it searches the tree to find a match for the colour-flipped /position/.++	* On failure, it searches for any /move/ which can be used to join the /position/ with the tree.++	* On failure, it searches for any /move/ which can be used to join the colour-flipped /position/ with the tree.++	* CAVEAT: the order of these searches has been hard-coded.+-}+findNextOnymousQualifiedMoves :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Enum			x,+	Enum			y,+	Ord			y,+	Show			x,+	Show			y+ )+	=> (Bool, Bool, Bool)	-- ^ MatchSwitches.+	-> FindMatch x y positionHash+{-# SPECIALISE findNextOnymousQualifiedMoves :: (Bool, Bool, Bool) -> FindMatch T.X T.Y T.PositionHash #-}+findNextOnymousQualifiedMoves (tryToMatchMoves, tryToMatchViaJoiningMove, tryToMatchColourFlippedPosition) game positionHashQualifiedMoveTree+	| cantConverge game positionHashQualifiedMoveTree	= []	-- The specified game is smaller than any defined in the tree.+	| otherwise						= Data.Maybe.fromMaybe [] . Data.List.find (+		not . null	-- Accept the results from the first match-function which returns any.+	) $ (+		if tryToMatchMoves+			then (findNextOnymousQualifiedMovesForGame game positionHashQualifiedMoveTree :)+			else id+	) [+		colourFlipper findMatch game positionHashQualifiedMoveTree |+			findMatch	<- findNextOnymousQualifiedMovesForPosition : [findNextJoiningOnymousQualifiedMovesFromPosition | tryToMatchViaJoiningMove] {-list-comprehension-},+			colourFlipper	<- id : [+				\findMatch' game' -> map (+					Property.Reflectable.reflectOnX {-reflect matching moves back into the original domain-} *** map (+						Control.Arrow.first $ showString "Colour-flipped:\t"+					)+				) . findMatch' (+					Property.Reflectable.reflectOnX game'+				) | tryToMatchColourFlippedPosition+			] -- Transform an arbitrary match-function to operate on either the original or the colour-flipped game.+	] -- List-comprehension.++-- | Randomly select a /qualifiedMove/ from matching /position/s in the tree, & supply the names of those archived games from which it originated.+maybeRandomlySelectOnymousQualifiedMove :: (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y,+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Enum			x,+	Enum			y,+	Ord			y,+	Show			x,+	Show			y,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> (Bool, Bool, Bool)	-- ^ MatchSwitches.+	-> Model.Game.Game x y+	-> PositionHashQualifiedMoveTree x y positionHash+	-> Maybe (Component.QualifiedMove.QualifiedMove x y, [ContextualNotation.QualifiedMoveForest.Name])+{-# SPECIALISE maybeRandomlySelectOnymousQualifiedMove+	:: System.Random.RandomGen randomGen+	=> randomGen+	-> (Bool, Bool, Bool)+	-> Model.Game.Game T.X T.Y+	-> PositionHashQualifiedMoveTree T.X T.Y T.PositionHash+	-> Maybe (Component.QualifiedMove.QualifiedMove T.X T.Y, [ContextualNotation.QualifiedMoveForest.Name])+ #-}+maybeRandomlySelectOnymousQualifiedMove randomGen matchSwitches game positionHashQualifiedMoveTree	= case findNextOnymousQualifiedMoves matchSwitches game positionHashQualifiedMoveTree of+	[]			-> Nothing+	onymousQualifiedMoves	-> fmap (+		Control.Arrow.second $ Data.List.nub . map fst {-Name-}+	 ) . ToolShed.System.Random.select randomGen . last {-highest scoring group-} $ Data.List.Extra.groupSortOn (+		(+			Factory.Math.Statistics.getMean	:: [Int] -> Rational+		) . map (+			 Data.Maybe.maybe 0 {-a draw-} (+				\victorsLogicalColour -> (+					if victorsLogicalColour == Model.Game.getNextLogicalColour game+						then id+						else negate+				) 1 {-victory-}+			) . Model.Result.findMaybeVictor . snd {-result-}	-- Score the result, according to which side we'd like to win.+		) . snd {-[OnymousResult]-}+	 ) onymousQualifiedMoves+
+ src-lib/BishBosh/ContextualNotation/QualifiedMoveForest.hs view
@@ -0,0 +1,256 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Builds a rose-tree from a /PGN Database/,+	each node of which contains a move qualified by a move-type, & possibly also the ultimate result & the game's identifier.+-}++module BishBosh.ContextualNotation.QualifiedMoveForest(+-- * Types+-- ** Type-synonyms+	Name,+	OnymousResult,+--	QualifiedMoveTree,+-- ** Data-types+	QualifiedMoveForest(+--		MkQualifiedMoveForest,+		deconstruct+	),+-- * Functions+	showsNames,+--	drawForest,+	findMinimumPieces,+	count,+-- ** Constructors+	fromPGNDatabase,+	toGameTree,+-- ** Mutators+	mergePGNDatabase,+ ) where++import			Control.Applicative((<|>))+import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.ContextualNotation.PGN			as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PGNDatabase		as ContextualNotation.PGNDatabase+import qualified	BishBosh.Data.RoseTree				as Data.RoseTree+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason+import qualified	BishBosh.Model.GameTree				as Model.GameTree+import qualified	BishBosh.Model.Result				as Model.Result+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.Null				as Property.Null+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Tree++-- | Each /game/ has a name.+type Name	= String++-- | The name of a /game/, & it's /result/.+type OnymousResult	= (Name, Model.Result.Result)++{- |+	* Terminal nodes contain the unique name of the /move/-sequence leading to them, from which other information can be found as required, from the original database.++	* N.B.: non-terminal nodes would only need to be labelled with a /name/, if a /game/ exists in the database which is a truncated version of other /game/s in the database.++	* N.B.: provided there are no duplicate /game/s with different /name/s, there's no requirement for more than one /name/ at a node.++	* CAVEAT: since zero moves have been made in the default initial game, the move-tree for the whole game of chess has no apex, so a forest is a more natural structure; though sub-trees can exist.+-}+type QualifiedMoveTree x y	= Data.Tree.Tree (Component.QualifiedMove.QualifiedMove x y, Maybe OnymousResult)++{- |+	* A representation of a PGN-database, where initial /move/s shared between /game/s are merged into the trunk of a tree from which they each branch.++	* Many /game/s will share standard opening /move/s, & a tree-structure (cf. a list) uses this to increase both time & space efficiency.++	* Since there are many different initial moves, the structure is a flat-topped /forest/ rather than a single apex /tree/.+-}+newtype QualifiedMoveForest x y	= MkQualifiedMoveForest {+	deconstruct	:: [QualifiedMoveTree x y]+} deriving (+	Eq,+	Show	-- CAVEAT: required by QuickCheck, but shouldn't actually be called.+ )++instance Property.Empty.Empty (QualifiedMoveForest x y) where+	empty	= MkQualifiedMoveForest []++instance Property.Null.Null (QualifiedMoveForest x y) where+	isNull MkQualifiedMoveForest { deconstruct = [] }	= True+	isNull _						= False++instance (Enum x, Enum y) => Notation.MoveNotation.ShowNotation (QualifiedMoveForest x y) where+	showsNotation moveNotation MkQualifiedMoveForest { deconstruct = forest }	= showString $ Data.RoseTree.drawForest (+		\(qualifiedMove, maybeOnymousResult)	-> Notation.MoveNotation.showsNotation moveNotation qualifiedMove $ Data.Maybe.maybe id (+			\onymousResult -> showChar ' ' . shows onymousResult+		) maybeOnymousResult ""+	 ) forest++-- | Show a list of the names of archived games.+showsNames+	:: Maybe Int+	-> [Name]+	-> ShowS+showsNames maybeMaximumPGNNames names	= Text.ShowList.showsUnterminatedList . map (+	\name -> showString "\n\t" . showString name+ ) $ Data.Maybe.maybe id (+	\maximumPGNNames -> (+		if maximumPGNNames < length names'+			then (++ ["..."])+			else id+	) . take maximumPGNNames+ ) maybeMaximumPGNNames names' where+	names'	= Data.List.nub $ Data.List.sort names++-- | Include the specified PGN-database into the /forest/.+mergePGNDatabase+	:: (Eq x, Eq y)+	=> ContextualNotation.PGNDatabase.PGNDatabase x y+	-> QualifiedMoveForest x y+	-> QualifiedMoveForest x y+mergePGNDatabase pgnDatabase MkQualifiedMoveForest { deconstruct = initialForest }	= MkQualifiedMoveForest $ foldr (+	\pgn -> merge (+		mkCompositeIdentifier &&& Data.Maybe.maybe (+			Model.Result.mkResult Nothing	-- The game is still in progress.+		) Model.GameTerminationReason.toResult . Model.Game.getMaybeTerminationReason . ContextualNotation.PGN.getGame $ pgn	-- Construct an onymous result.+	) (+		map Component.Turn.getQualifiedMove . Model.Game.listTurnsChronologically $ ContextualNotation.PGN.getGame pgn	-- Extract the list of qualified moves defining this game.+	)+ ) initialForest pgnDatabase where+	mkCompositeIdentifier :: ContextualNotation.PGN.PGN x y -> Name+	mkCompositeIdentifier	= unwords . map snd {-value-} . ContextualNotation.PGN.getIdentificationTagPairs++	merge+		:: (Eq x, Eq y)+		=> OnymousResult				-- ^ The name of this move-sequence, & the result.+		-> [Component.QualifiedMove.QualifiedMove x y]	-- ^ A chronological sequence of /qualified move/s.+		-> [QualifiedMoveTree x y]+		-> [QualifiedMoveTree x y]+	merge onymousResult qualifiedMoves@(qualifiedMove : remainingQualifiedMoves) forest	= case span (+		\Data.Tree.Node { Data.Tree.rootLabel = (qualifiedMove', _) } -> Component.QualifiedMove.getMove qualifiedMove /= Component.QualifiedMove.getMove qualifiedMove'+	 ) forest of+		(unmatchedForest, matchingTree : remainingForest)	-> unmatchedForest ++ (+			if null remainingQualifiedMoves	-- i.e. the terminal move in this game.+				then matchingTree {+					Data.Tree.rootLabel	= Control.Arrow.second (+						<|> Just onymousResult	-- CAVEAT: in the event of identical move-sequences, arbitrarily preserve the incumbant (whose result may differ if decided by resignation).+					) $ Data.Tree.rootLabel matchingTree+				}+				else matchingTree {+					Data.Tree.subForest	= merge onymousResult remainingQualifiedMoves $ Data.Tree.subForest matchingTree	-- Recurse.+				}+		 ) : remainingForest+		_ {-no match-}						-> mkLinkedList onymousResult qualifiedMoves : forest+	merge _ [] forest					= forest++	mkLinkedList :: OnymousResult -> [Component.QualifiedMove.QualifiedMove x y] -> QualifiedMoveTree x y+	mkLinkedList onymousResult ~(qualifiedMove : remainingQualifiedMoves)+		| null remainingQualifiedMoves	= Data.Tree.Node {+			Data.Tree.rootLabel	= (qualifiedMove, Just onymousResult),+			Data.Tree.subForest	= []+		} -- The terminal node.+		| otherwise	= Data.Tree.Node {+			Data.Tree.rootLabel	= (qualifiedMove, Nothing),+			Data.Tree.subForest	= [mkLinkedList onymousResult remainingQualifiedMoves {-recurse-}]+		}++-- | Constructor.+fromPGNDatabase :: (Eq x, Eq y) => ContextualNotation.PGNDatabase.PGNDatabase x y -> QualifiedMoveForest x y+fromPGNDatabase	= (`mergePGNDatabase` Property.Empty.empty {-QualifiedMoveForest-})++-- | Find the minimum number of /piece/s in any of the recorded /game/s.+findMinimumPieces :: QualifiedMoveForest x y -> Component.Piece.NPieces+findMinimumPieces	= slave (+	State.Board.getNPieces (+		Data.Default.def	:: State.Board.Board T.X T.Y	-- CAVEAT: this assumes the game to which the moves in the forest refer.+	)+ ) . deconstruct where+	slave nPieces []	= nPieces+	slave nPieces forest	= minimum $ map (+		\Data.Tree.Node {+			Data.Tree.rootLabel	= (qualifiedMove, _),+			Data.Tree.subForest	= subForest+		} -> slave (+			Attribute.MoveType.nPiecesMutator (Component.QualifiedMove.getMoveType qualifiedMove) nPieces+		) subForest	-- Recurse.+	 ) forest++-- | Count the number of /game/s & /move/s.+count :: QualifiedMoveForest x y -> (Model.Game.NGames, Component.Move.NMoves)+count	= slave . deconstruct where+	slave	= Data.List.foldl' (+		\(nGames, nMoves) Data.Tree.Node {+			Data.Tree.rootLabel	= (_, maybeOnymousResult),+			Data.Tree.subForest	= forest+		} -> let+			acc@(nGames', nMoves')	= (+				(+ nGames) . (+					if Data.Maybe.isJust maybeOnymousResult+						then succ+						else id+				) *** (+ nMoves) . succ+			 ) $ slave forest {-recurse-}+		in nGames' `seq` nMoves' `seq` acc+	 ) (0, 0)++{- |+	* Convert the specified /qualified-move forest/ to a /game-tree/.++	* To construct a tree from the specified forest, the default initial /game/ is included at the apex.+-}+toGameTree :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => QualifiedMoveForest x y -> Model.GameTree.GameTree x y+{-# SPECIALISE toGameTree :: QualifiedMoveForest T.X T.Y -> Model.GameTree.GameTree T.X T.Y #-}+toGameTree MkQualifiedMoveForest { deconstruct = qualifiedMoveForest }	= Model.GameTree.fromBareGameTree Data.Tree.Node {+	Data.Tree.rootLabel	= initialGame,+	Data.Tree.subForest	= map (slave initialGame) qualifiedMoveForest+} where+	initialGame	= Data.Default.def++	slave game Data.Tree.Node {+		Data.Tree.rootLabel	= (qualifiedMove, _),+		Data.Tree.subForest	= qualifiedMoveForest'+	} = Data.Tree.Node {+		Data.Tree.rootLabel	= game',+		Data.Tree.subForest	= map (slave game') qualifiedMoveForest'	-- Recurse.+	} where+		game'	= Model.Game.applyQualifiedMove qualifiedMove game
+ src-lib/BishBosh/ContextualNotation/StandardAlgebraic.hs view
@@ -0,0 +1,736 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	<https://en.wikipedia.org/wiki/Algebraic_notation_(chess)>+-}++module BishBosh.ContextualNotation.StandardAlgebraic(+-- * Types+-- ** Type-synonyms+	ValidateMoves,+	ExplicitEnPassant,+-- ** Data-types+	StandardAlgebraic(+--		MkStandardAlgebraic+		getQualifiedMove+	),+-- * Constants+--	captureFlag,+--	checkFlag,+--	checkMateFlag,+--	promotionFlag,+--	enPassantToken,+--	longCastleToken,+--	shortCastleToken,+--	moveSuffixAnnotations,+--	xMin,+--	yMin,+--	xMax,+--	yMax,+--	xOrigin,+--	yOrigin,+-- * Functions+--	encode,+	showsCoordinates,+	showsTurn,+	showTurn,+	showsMove,+	showMove,+	movePiece,+--	rankParser,+--	abscissaParser,+--	ordinateParser,+--	coordinatesParser,+--	captureParser,+--	moveSuffixAnnotationParser,+	parser,+	fromRank,+	toRank,+-- ** Constructors+	fromQualifiedMove+-- ** Predicates+--	inXRange,+--	inYRange+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Component.Turn			as Component.Turn+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.Model.GameTerminationReason	as Model.GameTerminationReason+import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards+import qualified	BishBosh.State.Board			as State.Board+import qualified	BishBosh.State.MaybePieceByCoordinates	as State.MaybePieceByCoordinates+import qualified	BishBosh.Text.ShowList			as Text.ShowList+import qualified	BishBosh.Types				as T+import qualified	Control.Applicative+import qualified	Control.Exception+import qualified	Control.Monad+import qualified	Data.Char+import qualified	Data.List+import qualified	Data.Maybe++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly			as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif+#else /* Parsec */+import qualified	Text.ParserCombinators.Parsec		as Parsec+import			Text.ParserCombinators.Parsec((<?>), (<|>))+#endif++-- | Whether each move should be validated.+type ValidateMoves	= Bool++-- | Constant indication of capture.+captureFlag :: Char+captureFlag		= 'x'++-- | Constant indication of Check.+checkFlag :: Char+checkFlag		= '+'++-- | Constant indication of Check-mate.+checkMateFlag :: Char+checkMateFlag		= '#'++-- | Constant indication of promotion.+promotionFlag :: Char+promotionFlag		= '='++-- | Constant indication of En-passant.+enPassantToken :: String+enPassantToken		= "e.p."++-- | Constant indication of a long @Queen@-side Castle.+longCastleToken :: String+longCastleToken		= "O-O-O"++-- | Constant indication of a short @King@-side Castle.+shortCastleToken :: String+shortCastleToken	= "O-O"++{- |+	* The characters which may be used to annotate a half move.++	* Zero to two of these (including duplicates) may follow each half move, but the parser intentionally permits any number.++	* CAVEAT: the parser intentionally permits any number of annotations.+-}+moveSuffixAnnotations :: String+moveSuffixAnnotations	= "!?"++-- | The minimum permissible values for /x/ & /y/ coordinates.+min' :: (Char, Char)+xMin, yMin :: Char+min'@(xMin, yMin)	= ('a', '1')++-- | The origin of the coordinate-system.+origin :: (Int, Int)+xOrigin, yOrigin :: Int+origin@(xOrigin, yOrigin)	= Data.Char.ord *** Data.Char.ord $ min'++-- | The maximum permissible values for /x/ & /y/ coordinates.+xMax, yMax :: Char+(xMax, yMax)	= Data.Char.chr . (+	+ pred {-fence-post-} (fromIntegral Cartesian.Abscissa.xLength)+ ) *** Data.Char.chr . (+	+ pred {-fence-post-} (fromIntegral Cartesian.Ordinate.yLength)+ ) $ origin++-- | Whether the specified character is a valid abscissa.+inXRange :: Char -> Bool+inXRange	= uncurry (&&) . ((>= xMin) &&& (<= xMax))++-- | Whether the specified character is a valid ordinate.+inYRange :: Char -> Bool+inYRange	= uncurry (&&) . ((>= yMin) &&& (<= yMax))++-- | Defines a /move/, to enable i/o in /StandardAlgebraic/-notation.+newtype StandardAlgebraic x y	= MkStandardAlgebraic {+	getQualifiedMove	:: Component.QualifiedMove.QualifiedMove x y+} deriving (Eq, Show)++-- | Constructor.+fromQualifiedMove :: Component.QualifiedMove.QualifiedMove x y -> StandardAlgebraic x y+fromQualifiedMove	= MkStandardAlgebraic++-- | Encodes the ordinate & abscissa.+encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)+encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY++-- | Shows the specified /coordinates/.+showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS+showsCoordinates	= uncurry (.) . encode++-- | Whether en-passant moves are tagged, or implicit.+type ExplicitEnPassant	= Bool++-- | Represent the specified /turn/ in SAN.+showsTurn :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ExplicitEnPassant+	-> Component.Turn.Turn x y+	-> Model.Game.Game x y	-- ^ The /game/ prior to application of the specified /turn/.+	-> ShowS+{-# SPECIALISE showsTurn :: ExplicitEnPassant -> Component.Turn.Turn T.X T.Y -> Model.Game.Game T.X T.Y -> ShowS #-}+showsTurn explicitEnPassant turn game+	| Just sourceRank <- fmap Component.Piece.getRank . State.MaybePieceByCoordinates.dereference source $ State.Board.getMaybePieceByCoordinates board	= (+		if sourceRank == Attribute.Rank.Pawn+			then (+				if isCapture+					then showsX . showsCapture+					else id+			) . showsDestination . if isEnPassant+				then if explicitEnPassant+					then showString enPassantToken+					else id+				else Data.Maybe.maybe id (+					\promotionRank -> showChar promotionFlag . showsRank promotionRank+				) $ Attribute.Rank.getMaybePromotionRank moveType+			else {-not a Pawn-} case moveType of+				Attribute.MoveType.Castle isShort	-> showString $ if isShort+					then shortCastleToken+					else longCastleToken+				_ {-not a castling-}			-> showsRank sourceRank . (+					case Data.List.delete source {-search for alternatives-} $ State.Board.findAttacksBy (+						Component.Piece.mkPiece (Model.Game.getNextLogicalColour game) sourceRank+					) destination board of+						[]		-> id	-- There're aren't any pieces of this rank which can perform this move.+						coordinates	-> case any (+							(== Cartesian.Coordinates.getX source) . Cartesian.Coordinates.getX+						 ) &&& any (+							(== Cartesian.Coordinates.getY source) . Cartesian.Coordinates.getY+						 ) $ coordinates of+							(True, True)	-> showsX . showsY	-- There're other pieces of this rank, some with similar X-coordinate & some with similar Y-coordinate.+							(_, False)	-> showsY		-- There's another piece of this rank & X-coordinate; specify Y-coordinate to disambiguate.+							_		-> showsX		-- There's anoher piece of this rank, but neither X nor Y coordinates are similar.+				 ) . (+					if isCapture+						then showsCapture+						else id+				 ) . showsDestination+	) . (+		if Data.Maybe.isJust $ Model.Game.getMaybeChecked game'+			then showChar $ if Data.Maybe.maybe False Model.GameTerminationReason.isCheckMate $ Model.Game.getMaybeTerminationReason game'+				then checkMateFlag+				else checkFlag+			else id+	)+	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.ContextualNotation.StandardAlgebraic.showsTurn:\tno piece exists at " . showsCoordinates source . showString "; " $ Property.ForsythEdwards.showsFEN game "."+	where+		((source, destination), moveType)	= (Component.Move.getSource &&& Component.Move.getDestination) . Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ Component.Turn.getQualifiedMove turn+		board					= Model.Game.getBoard game++		isEnPassant, isCapture :: Bool+		isEnPassant	= Attribute.MoveType.isEnPassant moveType+		isCapture	= State.MaybePieceByCoordinates.isOccupied destination (State.Board.getMaybePieceByCoordinates board) || isEnPassant++		showsRank :: Attribute.Rank.Rank -> ShowS+		showsRank rank	= showChar $ fromRank rank++		showsCapture, showsX, showsY, showsDestination :: ShowS+		showsCapture		= showChar captureFlag+		(showsX, showsY)	= encode source+		showsDestination	= showsCoordinates destination++		game'	= Model.Game.takeTurn turn game++-- | Calls 'showsTurn'.+showTurn :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ExplicitEnPassant+	-> Component.Turn.Turn x y+	-> Model.Game.Game x y	-- ^ The /game/ prior to application of the specified /turn/.+	-> String+{-# SPECIALISE showTurn :: ExplicitEnPassant -> Component.Turn.Turn T.X T.Y -> Model.Game.Game T.X T.Y -> String #-}+showTurn explicitEnPassant turn game	= showsTurn explicitEnPassant turn game ""++-- | A convenience-function, which generates the /turn/ required to call 'showsTurn'.+showsMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ExplicitEnPassant+	-> Component.QualifiedMove.QualifiedMove x y+	-> Model.Game.Game x y+	-> ShowS+{-# SPECIALISE showsMove :: ExplicitEnPassant -> Component.QualifiedMove.QualifiedMove T.X T.Y -> Model.Game.Game T.X T.Y -> ShowS #-}+showsMove explicitEnPassant qualifiedMove game	= showsTurn explicitEnPassant (+	Data.Maybe.fromMaybe (+		Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.ContextualNotation.StandardAlgebraic.showsMove:\tModel.Game.maybeLastTurn failed."+	) . Model.Game.maybeLastTurn $ Model.Game.applyQualifiedMove qualifiedMove game+ ) game++-- | Calls 'showsMove'.+showMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ExplicitEnPassant+	-> Component.QualifiedMove.QualifiedMove x y+	-> Model.Game.Game x y+	-> String+{-# SPECIALISE showMove :: ExplicitEnPassant -> Component.QualifiedMove.QualifiedMove T.X T.Y -> Model.Game.Game T.X T.Y -> String #-}+showMove explicitEnPassant qualifiedMove game	= showsMove explicitEnPassant qualifiedMove game ""++-- | Applies the specified /move/ to the specified /game/.+movePiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => StandardAlgebraic x y -> Model.Game.Transformation x y+{-# SPECIALISE movePiece :: StandardAlgebraic T.X T.Y -> Model.Game.Transformation T.X T.Y #-}+movePiece MkStandardAlgebraic { getQualifiedMove = qualifiedMove }	= Model.Game.applyQualifiedMove qualifiedMove++#ifdef USE_POLYPARSE+-- | Parse the /rank/ of the /piece/ being moved.+rankParser :: Text.Poly.TextParser Attribute.Rank.Rank+rankParser	= toRank `fmap` Poly.satisfyMsg (`elem` map fromRank Attribute.Rank.pieces) Attribute.Rank.tag++-- | Parse an /x/-coordinate.+abscissaParser :: Enum x => Text.Poly.TextParser x+{-# SPECIALISE abscissaParser :: Text.Poly.TextParser T.X #-}+abscissaParser	= (+	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord+ ) `fmap` Poly.satisfyMsg inXRange "Abscissa"++-- | Parse a /y/-coordinate.+ordinateParser :: Enum y => Text.Poly.TextParser y+{-# SPECIALISE ordinateParser :: Text.Poly.TextParser T.Y #-}+ordinateParser	= (+	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord+ ) `fmap` Poly.satisfyMsg inYRange "Ordinate"++-- | Parse a pair of /coordinates/.+coordinatesParser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Text.Poly.TextParser (Cartesian.Coordinates.Coordinates x y)+{-# SPECIALISE coordinatesParser :: Text.Poly.TextParser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}+coordinatesParser	= do+	x	<- abscissaParser+	y	<- ordinateParser++	return {-to Parser-monad-} $ Cartesian.Coordinates.mkCoordinates x y++-- | Parse the flag which denotes capture.+captureParser :: Text.Poly.TextParser Char+captureParser	= Poly.satisfyMsg (== captureFlag) "Capture"+#else+-- | Parse the /rank/ of the /piece/ being moved.+rankParser :: Parsec.Parser Attribute.Rank.Rank+rankParser	= toRank <$> Parsec.oneOf (map fromRank Attribute.Rank.pieces) <?> Attribute.Rank.tag++-- | Parse an /x/-coordinate.+abscissaParser :: Enum x => Parsec.Parser x+{-# SPECIALISE abscissaParser :: Parsec.Parser T.X #-}+abscissaParser	= (+	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord+ ) <$> Parsec.satisfy inXRange <?> "Abscissa"++-- | Parse a /y/-coordinate.+ordinateParser :: Enum y => Parsec.Parser y+{-# SPECIALISE ordinateParser :: Parsec.Parser T.X #-}+ordinateParser	= (+	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord+ ) <$> Parsec.satisfy inYRange <?> "Ordinate"++-- | Parse a pair of /coordinates/.+coordinatesParser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Parsec.Parser (Cartesian.Coordinates.Coordinates x y)+{-# SPECIALISE coordinatesParser :: Parsec.Parser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}+coordinatesParser	= Cartesian.Coordinates.mkCoordinates <$> abscissaParser <*> ordinateParser++-- | Parse the flag which denotes capture.+captureParser :: Parsec.Parser ()+captureParser	= Control.Monad.void (Parsec.char captureFlag <?> "Capture")+#endif++-- | Parse a Move Suffix-annotation.+moveSuffixAnnotationParser ::+#ifdef USE_POLYPARSE+	Text.Poly.TextParser String+moveSuffixAnnotationParser	= Text.Poly.spaces >> Control.Applicative.some (Poly.oneOf' $ map (\c -> ([c], Poly.satisfyMsg (== c) "Move Suffix-annotation")) moveSuffixAnnotations)+#else /* Parsec */+	Parsec.Parser String+moveSuffixAnnotationParser	= Parsec.try (+	Parsec.spaces >> Control.Applicative.some (Parsec.choice $ map Parsec.char moveSuffixAnnotations)	<?> "Move Suffix-annotation"+ )+#endif++-- | Parses a /move/ from SAN, & optionally validates it against the specified /game/.+parser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> ExplicitEnPassant+	-> ValidateMoves+	-> Model.Game.Game x y+#ifdef USE_POLYPARSE+	-> Text.Poly.TextParser (StandardAlgebraic x y)+{-# SPECIALISE parser :: ExplicitEnPassant -> ValidateMoves -> Model.Game.Game T.X T.Y -> Text.Poly.TextParser (StandardAlgebraic T.X T.Y) #-}+parser explicitEnPassant validateMoves game	= let+	nextLogicalColour			= Model.Game.getNextLogicalColour game+	(shortCastlingMoves, longCastlingMoves)	= Data.List.partition (\(Attribute.MoveType.Castle isShort, _, _) -> isShort) $ Component.Move.castlingMovesByLogicalColour ! nextLogicalColour+	board					= Model.Game.getBoard game+	getMaybePiece				= (`State.MaybePieceByCoordinates.dereference` State.Board.getMaybePieceByCoordinates board)+	getMaybeRank				= fmap Component.Piece.getRank . getMaybePiece+ in do+	qualifiedMove	<- Text.Poly.spaces >> Poly.oneOf' [+		(+			"Non-castling move",+			do+				rank	<- Data.Maybe.fromMaybe Attribute.Rank.Pawn `fmap` Control.Applicative.optional rankParser++				let+					piece :: Component.Piece.Piece+					piece	= Component.Piece.mkPiece nextLogicalColour rank++					findAttacksBy destination	= State.Board.findAttacksBy piece destination board++				if rank == Attribute.Rank.Pawn+					then let+						promotionParser :: Text.Poly.TextParser Attribute.Rank.Rank+						promotionParser	= Text.Poly.char promotionFlag >> rankParser+					in Poly.oneOf' [+						(+							"Pawn-advance",+							do+								destination	<- coordinatesParser++								Data.Maybe.maybe (+									do+										context	<- Poly.manyFinally' Poly.next $ Text.Poly.char '\n'++										Poly.failBad . showString "failed to locate any " . shows piece . showString " which can advance to " . shows destination . showString ". Before " $ shows context "."+								 ) (+									\source -> (+										Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) . Attribute.MoveType.mkNormalMoveType Nothing {-capture-}+									) `fmap` Control.Applicative.optional promotionParser+								 ) . Data.List.find (+									Data.Maybe.maybe False {-no piece-} (== piece) . getMaybePiece+								 ) . Data.Maybe.catMaybes . take 2 {-maximum Pawn-advance-} . tail {-drop the original-} $ iterate (+									>>= Cartesian.Coordinates.maybeRetreat nextLogicalColour+								 ) $ Just destination+						), (+							"Pawn-capture",+							do+								x		<- abscissaParser+								_		<- captureParser+								destination	<- Poly.commit coordinatesParser++								let maybeDestinationRank	= getMaybeRank destination++								Data.Maybe.maybe (+									do+										context	<- Poly.manyFinally' Poly.next $ Text.Poly.char '\n'++										Poly.failBad . showString "failed to locate any " . shows piece . showString " which can capture " . shows destination . showString " from abscissa" . Text.ShowList.showsAssociation . shows x . showString ". Before " $ shows context "."+								 ) (+									\source -> Component.QualifiedMove.mkQualifiedMove (+										Component.Move.mkMove source destination+									) `fmap` Poly.oneOf' [+										(+											"En-passant",+											do+												if explicitEnPassant+													then Text.Poly.string enPassantToken+													else Control.Monad.when (Data.Maybe.isJust maybeDestinationRank) $ fail undefined++												return {-to Parser-monad-} Attribute.MoveType.enPassant+										), (+											"Normal pawn capture",+											Poly.commit $ Attribute.MoveType.mkNormalMoveType maybeDestinationRank `fmap` Control.Applicative.optional promotionParser+										)+									]+								 ) . Data.List.find (+									(== x) . Cartesian.Coordinates.getX+								 ) $ findAttacksBy destination+						)+					]+					else {-not a Pawn-} let+						mkNormalMoveType destination	= Attribute.MoveType.mkNormalMoveType (getMaybeRank destination) Nothing {-promotion-}++						resolveQualifiedMove destination candidates	= case candidates of+							[]			-> do+								context	<- Poly.manyFinally' Poly.next $ Text.Poly.char '\n'++								Poly.failBad . showString "failed to locate any " . shows piece . showString " able to move to " . shows destination . showString ". Before " $ shows context "."+							[source]		-> return {-to Parser-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination+							sourceCandidates	-> Poly.oneOf' [+								show &&& return {-to Parser-monad-} $ qualifiedMove |+									source	<- sourceCandidates,-- Attempt to resolve the ambiguity by playing subsequent moves.+									let qualifiedMove	= Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination,+									Model.Game.isValidQualifiedMove qualifiedMove game+							 ] -- List-comprehension.+					in Poly.oneOf' [+						(+							"Fully qualified move",	-- N.B. this scenario occurs when there are identical pieces on both the same row & the same column, as the intended attacker; i.e. after a promotion.+							do+								source		<- coordinatesParser+								destination	<- Control.Applicative.optional captureParser >> coordinatesParser++								return {-to Parser-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination+						), (+							"Partially qualified move",	-- This scenario occurs if there's an identical piece on either the same row or the same column, as the intended attacker.+							do+								sourceFilter	<- Poly.oneOf' [+									(+										"Abscissa qualification",+										(+											\x -> filter $ (== x) . Cartesian.Coordinates.getX+										) `fmap` abscissaParser+									), (+										"Ordinate qualification",+										(+											\y -> filter $ (== y) . Cartesian.Coordinates.getY+										) `fmap` ordinateParser+									)+								 ] -- Build a filter from the source-qualifier.++								destination	<- Control.Applicative.optional captureParser >> coordinatesParser++								resolveQualifiedMove destination . sourceFilter $ findAttacksBy destination+						), (+							"Unqualified move",	-- The most likely scenario, where the intended attacker is unambiguous.+							Poly.commit $ do+								destination	<- Control.Applicative.optional captureParser >> coordinatesParser++								resolveQualifiedMove destination $ findAttacksBy destination+						)+					]+		), (+			"Long castle",+			Text.Poly.string longCastleToken >> Data.Maybe.maybe (+				fail "Failed to find any appropriate long castling move."+			) (+				\(moveType, kingsMove, _) -> return {-to Parser-monad-} $ Component.QualifiedMove.mkQualifiedMove kingsMove moveType+			) (+				Data.Maybe.listToMaybe longCastlingMoves+			)+		), (+			"Short castle",+			Text.Poly.string shortCastleToken >> Data.Maybe.maybe (+				fail "Failed to find any appropriate short castling move."+			) (+				\(moveType, kingsMove, _) -> return {-to Parser-monad-} $ Component.QualifiedMove.mkQualifiedMove kingsMove moveType+			) (+				Data.Maybe.listToMaybe shortCastlingMoves+			)+		) -- TODO: for some reason, lazy-parsing with ghc-8.0.1 & polyparse-1.12 conflates "O-O-O" with "O-O"; confirm.+	 ]++	_	<- Control.Applicative.optional (Poly.satisfyMsg (`elem` [checkFlag, checkMateFlag]) "Check") >> Control.Applicative.optional moveSuffixAnnotationParser++	fmap fromQualifiedMove $ if validateMoves+		then Data.Maybe.maybe (return {-to Parser-monad-} qualifiedMove) (Poly.failBad . showString "failed: ") $ Model.Game.validateQualifiedMove qualifiedMove game+		else return {-to Parser-monad-} qualifiedMove+#else /* Parsec */+	-> Parsec.Parser (StandardAlgebraic x y)+{-# SPECIALISE parser :: ExplicitEnPassant -> ValidateMoves -> Model.Game.Game T.X T.Y -> Parsec.Parser (StandardAlgebraic T.X T.Y) #-}+parser explicitEnPassant validateMoves game	= let+	nextLogicalColour			= Model.Game.getNextLogicalColour game+	(shortCastlingMoves, longCastlingMoves)	= Data.List.partition (\(Attribute.MoveType.Castle isShort, _, _) -> isShort) $ Component.Move.castlingMovesByLogicalColour ! nextLogicalColour+	board					= Model.Game.getBoard game+	getMaybePiece				= (`State.MaybePieceByCoordinates.dereference` State.Board.getMaybePieceByCoordinates board)+	getMaybeRank				= fmap Component.Piece.getRank . getMaybePiece+ in do+	qualifiedMove	<- Parsec.spaces >> Parsec.choice [+		do+			rank	<- Parsec.option Attribute.Rank.Pawn rankParser++			let+				piece :: Component.Piece.Piece+				piece	= Component.Piece.mkPiece nextLogicalColour rank++				findAttacksBy destination	= State.Board.findAttacksBy piece destination board++			if rank == Attribute.Rank.Pawn+				then let+					promotionParser :: Parsec.Parser Attribute.Rank.Rank+					promotionParser	= (Parsec.char promotionFlag <?> "Promotion") >> rankParser+				in Parsec.try (+					do+						destination	<- coordinatesParser	<?> "Destination"++						Data.Maybe.maybe (+							fail . showString "Failed to locate any " . shows piece . showString " which can advance to " $ shows destination "."+						 ) (+							\source -> (+								Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) . Attribute.MoveType.mkNormalMoveType Nothing {-capture-}+							) <$> Control.Applicative.optional promotionParser+						 ) . Data.List.find (+							Data.Maybe.maybe False {-no piece-} (== piece) . getMaybePiece+						 ) . Data.Maybe.catMaybes . take 2 {-maximum Pawn-advance-} . tail {-drop the original-} $ iterate (+							>>= Cartesian.Coordinates.maybeRetreat nextLogicalColour+						 ) $ Just destination+				) <|> do+					x		<- abscissaParser <* captureParser+					destination	<- coordinatesParser	<?> "Destination"++					let maybeDestinationRank	= getMaybeRank destination++					Data.Maybe.maybe (+						fail . showString "Failed to locate any " . shows piece . showString " which can capture " . shows destination . showString " from abscissa" . Text.ShowList.showsAssociation $ shows x "."+					 ) (+						\source -> fmap (+							Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination)+						) $ (+							do+								_	<- if explicitEnPassant+									then Parsec.string enPassantToken	<?> "En-passant"+									else if Data.Maybe.isNothing maybeDestinationRank+										then return {-to ParsecT-monad-} enPassantToken+										else fail undefined++								return {-to ParsecT-monad-} Attribute.MoveType.enPassant+						) <|> (+							Attribute.MoveType.mkNormalMoveType maybeDestinationRank <$> Control.Applicative.optional promotionParser+						)+					 ) . Data.List.find (+						(== x) . Cartesian.Coordinates.getX+					 ) $ findAttacksBy destination+				else {-not a Pawn-} let+					mkNormalMoveType destination	= Attribute.MoveType.mkNormalMoveType (getMaybeRank destination) Nothing {-promotion-}++					resolveQualifiedMove destination candidates	= case candidates of+						[]			-> fail . showString "Failed to locate any " . shows piece . showString " able to move to " $ shows destination "."+						[source]		-> return {-to ParsecT-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination+						sourceCandidates	-> Parsec.choice [+							Parsec.try $ return {-to ParsecT-monad-} qualifiedMove |+								source	<- sourceCandidates,-- Attempt to resolve the ambiguity by playing subsequent moves.+								let qualifiedMove	= Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination,+								Model.Game.isValidQualifiedMove qualifiedMove game+						 ] -- List-comprehension.+				in Parsec.choice [+					Parsec.try $ do -- N.B. this scenario occurs when there are identical pieces on both the same row & the same column, as the intended attacker; i.e. after a promotion.+						source		<- coordinatesParser	<?> "Source"++						Parsec.optional captureParser		<?> "Optional capture"++						destination	<- coordinatesParser	<?> "Destination"++						return {-to ParsecT-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination,+					Parsec.try $ do	-- This scenario occurs if there's an identical piece on either the same row or the same column, as the intended attacker.+						sourceFilter	<- (+							(+								\x -> filter $ (== x) . Cartesian.Coordinates.getX+							) <$> abscissaParser+						 ) <|> (+							(+								\y -> filter $ (== y) . Cartesian.Coordinates.getY+							) <$> ordinateParser+						 ) -- Build a filter from the source-qualifier.++						Parsec.optional captureParser		<?> "Optional capture"++						destination	<- coordinatesParser	<?> "Destination"++						resolveQualifiedMove destination . sourceFilter $ findAttacksBy destination,+					do	-- The most likely scenario, where the intended attacker is unambiguous.+						Parsec.optional captureParser		<?> "Optional capture"++						destination	<- coordinatesParser	<?> "Unqualified destination"++						resolveQualifiedMove destination $ findAttacksBy destination+				],+		Parsec.try $ (+			Parsec.string longCastleToken	<?> "Long castle"+		) >> Data.Maybe.maybe (+			fail "Failed to find any appropriate long castling move."+		) (+			\(moveType, kingsMove, _) -> return {-to ParsecT-monad-} $ Component.QualifiedMove.mkQualifiedMove kingsMove moveType+		) (+			Data.Maybe.listToMaybe longCastlingMoves+		),+		(+			Parsec.string shortCastleToken	<?> "Short castle"+		) >> Data.Maybe.maybe (+			fail "Failed to find any appropriate short castling move."+		) (+			\(moveType, kingsMove, _) -> return {-to ParsecT-monad-} $ Component.QualifiedMove.mkQualifiedMove kingsMove moveType+		) (+			Data.Maybe.listToMaybe shortCastlingMoves+		)+	 ]++	_	<- Parsec.optional (Parsec.oneOf [checkFlag, checkMateFlag] <?> "Check") >> Parsec.optional moveSuffixAnnotationParser++	fromQualifiedMove <$> if validateMoves+		then Data.Maybe.maybe (return {-to ParsecT-monad-} qualifiedMove) (fail . showString "Failed: ") $ Model.Game.validateQualifiedMove qualifiedMove game+		else return {-to ParsecT-monad-} qualifiedMove+#endif++-- | Represent a /rank/ in SAN.+fromRank :: Attribute.Rank.Rank -> Char+fromRank	= Data.Char.toUpper . head . show++-- | Translate from SAN to a /rank/.+toRank :: Char -> Attribute.Rank.Rank+toRank	= read . return {-to List-monad-}+
+ src-lib/BishBosh/Data/Bool.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Bool'.+-}++module BishBosh.Data.Bool() where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++instance HXT.XmlPickler Bool where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show [False, True]+
+ src-lib/BishBosh/Data/Either.hs view
@@ -0,0 +1,50 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Either'.+-}++module BishBosh.Data.Either(+-- * Functions+	xpickle+) where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++instance (HXT.XmlPickler l, HXT.XmlPickler r) => HXT.XmlPickler (Either l r) where+	xpickle	= xpickle HXT.xpickle HXT.xpickle++-- | Pickler for an arbitrary datum of type 'Either'.+xpickle :: HXT.PU l -> HXT.PU r -> HXT.PU (Either l r)+xpickle lPickler rPickler	= HXT.xpAlt (+	const 0 `either` const 1	-- Index into the subsequent pickler-list.+ ) [+	HXT.xpWrap (+		Left,		-- Construct.+		\(Left l) -> l	-- Deconstruct.+	) lPickler,+	HXT.xpWrap (+		Right,		-- Construct.+		\(Right r) -> r	-- Deconstruct.+	) rPickler+ ]+
+ src-lib/BishBosh/Data/Exception.hs view
@@ -0,0 +1,149 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Exceptions customised for this application.++	* N.B.: IO-functions can merely forward any exceptions thrown by the underlying calls, so these exceptions are typically thrown from pure functions.++	* CAVEAT: though intended to be orthogonal, there's some inevitable overlap.+-}++module BishBosh.Data.Exception(+-- * Types+-- ** Data-types+	BadData(),+	BadRequest(),+	Exception(+--		MkException,+		getType+--		getDetails+	),+-- * Functions+-- ** Constructors+	mkDuplicateData,+	mkIncompatibleData,+	mkInsufficientData,+	mkInvalidDatum,+	mkNullDatum,+	mkOutOfBounds,+	mkRedundantData,+	mkParseFailure,+	mkRequestFailure,+	mkResultUndefined,+	mkSearchFailure,+-- ** Predicates+	isBadData,+	isBadRequest+) where++import qualified	Control.Exception+import qualified	Data.Typeable++-- | These types of exception may be thrown by any function which checks its parameters; typically either constructors or mutators.+data BadData+	= DuplicateData		-- ^ Some data is duplicated.+	| IncompatibleData	-- ^ Two or more data with valid values, are incompatible. cf. InvalidDatum.+	| InsufficientData	-- ^ More data is required to fulfill the request. cf. 'NullDatum'.+	| InvalidDatum		-- ^ A datum's value is invalid.+	| NullDatum		-- ^ An empty collection was unexpectedly received; a specialisation of either 'InsufficientData' or 'InvalidDatum'.+	| OutOfBounds		-- ^ Either underflow or overflow of numeric data; a specialisation of 'InvalidDatum'.+	| RedundantData		-- ^ Data superflous to requirements was provided; a specialisation of 'InvalidDatum'.+	deriving Show++-- | These types of exception may be thrown by any function which is unable to comply with a correctly formed request.+data BadRequest+	= ParseFailure		-- ^ An attempt to parse data failed.+	| RequestFailure	-- ^ A well-formed request couldn't be completed.+	| ResultUndefined	-- ^ More than one correct result is possible.+	| SearchFailure		-- ^ An attempt to find data failed.+	deriving Show++-- | Each type of exception includes a type & a details.+data Exception	= MkException {+	getType		:: Either BadData BadRequest,+	getDetails	:: String+} deriving Data.Typeable.Typeable++instance Control.Exception.Exception Exception++instance Show Exception where+	showsPrec _ MkException {+		getType		= eitherBadDataOrBadRequest,+		getDetails	= details+	} = either shows shows eitherBadDataOrBadRequest . showString "; " . showString details++-- | Constructor.+mkDuplicateData :: String -> Exception+mkDuplicateData	= MkException $ Left DuplicateData++-- | Constructor.+mkIncompatibleData :: String -> Exception+mkIncompatibleData	= MkException $ Left IncompatibleData++-- | Constructor.+mkInsufficientData :: String -> Exception+mkInsufficientData	= MkException $ Left InsufficientData++-- | Constructor.+mkInvalidDatum :: String -> Exception+mkInvalidDatum	= MkException $ Left InvalidDatum++-- | Constructor.+mkNullDatum :: String -> Exception+mkNullDatum	= MkException $ Left NullDatum++-- | Constructor.+mkOutOfBounds :: String -> Exception+mkOutOfBounds	= MkException $ Left OutOfBounds++-- | Constructor.+mkRedundantData :: String -> Exception+mkRedundantData	= MkException $ Left RedundantData++-- | Constructor.+mkParseFailure :: String -> Exception+mkParseFailure	= MkException $ Right ParseFailure++-- | Constructor.+mkRequestFailure :: String -> Exception+mkRequestFailure	= MkException $ Right RequestFailure++-- | Constructor.+mkResultUndefined :: String -> Exception+mkResultUndefined	= MkException $ Right ResultUndefined++-- | Constructor.+mkSearchFailure :: String -> Exception+mkSearchFailure	= MkException $ Right SearchFailure++-- | Predicate.+isBadData :: Exception -> Bool+isBadData MkException { getType = Left _ }	= True+isBadData _					= False++-- | Predicate.+isBadRequest :: Exception -> Bool+isBadRequest MkException { getType = Right _ }	= True+isBadRequest _					= False+
+ src-lib/BishBosh/Data/Float.hs view
@@ -0,0 +1,35 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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 3 of the License, or+	(at your option) any later version.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Float' & 'Double'.+-}++module BishBosh.Data.Float() where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++instance HXT.XmlPickler Float where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Double where+	xpickle	= HXT.xpPrim+
+ src-lib/BishBosh/Data/Integral.hs view
@@ -0,0 +1,68 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]+-}++module BishBosh.Data.Integral(+-- * Functions+	stringToUnsignedDecimal+) where++import qualified	Data.Char+import qualified	Data.Int+import qualified	Data.List+import qualified	Data.Word+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++instance HXT.XmlPickler Data.Int.Int8 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Int.Int16 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Int.Int32 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Word.Word8 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Word.Word16 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Word.Word32 where+	xpickle	= HXT.xpPrim++instance HXT.XmlPickler Data.Word.Word where+	xpickle	= HXT.xpPrim++{- |+	* N.B. much faster than the instance of 'Read' for the integral type. TODO: compare with 'Numeric.readDec'.++	* N.B. ignores any leading zeroes.++	* CAVEAT: 'Data.Char.digitToInt' throws an exception if it receives a character which isn't a digit.++-}+stringToUnsignedDecimal :: Num i => String -> i+stringToUnsignedDecimal	= fromIntegral . Data.List.foldl' (\i -> (+ 10 * i) . Data.Char.digitToInt) 0+
+ src-lib/BishBosh/Data/Num.hs view
@@ -0,0 +1,34 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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 3 of the License, or+	(at your option) any later version.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]+-}++module BishBosh.Data.Num (+-- * Functions+	inClosedUnitInterval+) where++import	Control.Arrow((&&&))++-- | Whether the specified number lies within the closed unit-interval, @[0,1]@; <https://en.wikipedia.org/wiki/Unit_interval>.+inClosedUnitInterval :: (Num n, Ord n) => n -> Bool+inClosedUnitInterval	= uncurry (&&) . ((>= 0) &&& (<= 1))
+ src-lib/BishBosh/Data/Ratio.hs view
@@ -0,0 +1,48 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Data.Ratio.Ratio'.++ [@CAVEAT@]++	'Rational' numbers are converted imprecisely to floating-point for representation as XML.+	To remedy the loss of precision on reading from XML, they're rounded to the /epsilon/ for IEEE double-precision <https://en.wikipedia.org/wiki/Machine_epsilon Machine epsilon>.+-}++module BishBosh.Data.Ratio(+--	round'+) where++import qualified	Data.Ratio+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Truncate the rounding-error introduced by conversion to a 'Rational' number.+round' :: RealFrac r => r -> Rational+round'	= (`Data.Ratio.approxRational` doublePrecisionEpsilon) where+	doublePrecisionEpsilon	= recip 2 ^ floatDigits (undefined :: Double)++instance Integral i => HXT.XmlPickler (Data.Ratio.Ratio i) where+	xpickle	= HXT.xpWrap (+		fromRational . round',		-- Construct from a Double.+		\x -> realToFrac x :: Double	-- Deconstruct to a Double.+	 ) HXT.xpPrim+
+ src-lib/BishBosh/Data/RoseTree.hs view
@@ -0,0 +1,120 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines operations on an arbitrary rose-tree.+-}++module BishBosh.Data.RoseTree(+-- * Types+-- ** Type-synonyms+--	Transformation,+	IsMatch,+-- * Function+	countTerminalNodes,+	drawTree,+	drawForest,+	traceRoute,+-- ** Mutators+	promote,+	reduce,+	mapForest+) where++import qualified	Data.List+import qualified	Data.Tree++-- | Counts the number of terminal nodes.+countTerminalNodes :: Num nodes => Data.Tree.Tree a -> nodes+countTerminalNodes Data.Tree.Node { Data.Tree.subForest = [] }		= 1+countTerminalNodes Data.Tree.Node { Data.Tree.subForest = forest }	= Data.List.foldl' (+	\acc -> (+ acc) . countTerminalNodes {-recurse-}+ ) 0 forest++-- | Returns a string which graphically represents the tree, optionally truncated to the specified depth.+drawTree :: (a -> String) -> Data.Tree.Tree a -> String+drawTree toString	= Data.Tree.drawTree . fmap toString++-- | Returns a string which graphically represents the forest, optionally truncated to the specified depth.+drawForest :: (a -> String) -> Data.Tree.Forest a -> String+drawForest toString	= Data.Tree.drawForest . map (fmap toString)++-- | Whether a datum matches.+type IsMatch a	= a -> Bool++-- | Trace a path down the specified tree, of matching nodes.+traceRoute+	:: (datum -> IsMatch a)	-- ^ Whether a datum matches.+	-> Data.Tree.Tree a+	-> [datum]		-- ^ The data against which, nodes from the tree should be matched.+	-> Maybe [a]		-- ^ Returns 'Nothing' on match-failure.+traceRoute isMatch	= slave . Data.Tree.subForest where+	slave forest (datum : remainingData)	= Data.List.find (+		isMatch datum . Data.Tree.rootLabel+	 ) forest >>= (+		\Data.Tree.Node {+			Data.Tree.rootLabel	= rootLabel,+			Data.Tree.subForest	= subForest+		} -> (rootLabel :) `fmap` slave subForest remainingData {-recurse-}+	 )+	slave _ _				= Just []++{- |+	* Recursively advances the position within the forest, of the first node which matches the next datum, at successively deeper levels.++	* CAVEAT: each datum is expected to match exactly one item from the forest at each level.+-}+promote+	:: (datum -> IsMatch a)		-- ^ Whether a node matches.+	-> [datum]			-- ^ The data against which nodes from the forest should be matched.+	-> [Data.Tree.Tree a]+	-> Maybe [Data.Tree.Tree a]	-- ^ Returns 'Nothing' on match-failure.+promote isMatch	= slave where+	slave (datum : remainingData) forest	= case break (isMatch datum . Data.Tree.rootLabel) forest of+		(mismatches, match@Data.Tree.Node { Data.Tree.subForest = forest' } : remainingNodes)	-> (+			\forest'' -> match {+				Data.Tree.subForest	= forest''+			} : mismatches ++ remainingNodes+		 ) `fmap` slave remainingData forest'	-- Recurse.+		_											-> Nothing	-- Match-failure.+	slave _ forest				= Just forest	-- Data exhausted => Terminate normally.++-- | Reduce the tree to the first matching datum in the forest.+reduce+	:: IsMatch a+	-> Data.Tree.Tree a+	-> Maybe (Data.Tree.Tree a)+reduce isMatch Data.Tree.Node { Data.Tree.subForest = subForest }	= Data.List.find (isMatch . Data.Tree.rootLabel) subForest++-- | The type of a function which changes the structure (but not the type) of the specified tree.+type Transformation a	= Data.Tree.Tree a -> Data.Tree.Tree a++{- |+	* Apply an arbitrary mapping to all subForests; cf 'fmap' which applies an arbitrary function to all rootLabels.++	* The mapping is given access to the label at each forest.+-}+mapForest :: (a -> Data.Tree.Forest a -> Data.Tree.Forest a) -> Transformation a+mapForest f	= slave where+	slave node@Data.Tree.Node {+		Data.Tree.rootLabel	= label,+		Data.Tree.subForest	= forest+	} = node { Data.Tree.subForest = map slave {-recurse-} $ f label forest }+
+ src-lib/BishBosh/Data/Time.hs view
@@ -0,0 +1,41 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]+-}++module BishBosh.Data.Time(+-- * Functions+	showsTimeAsSeconds,+	measureElapsedTime+ ) where++import qualified	Data.Time.Clock+import qualified	Text.Printf++-- | Shows a time-difference as a number of seconds, to the required precision.+showsTimeAsSeconds :: Text.Printf.PrintfArg i => i -> Data.Time.Clock.NominalDiffTime -> ShowS+showsTimeAsSeconds nDecimalDigits time	= showString $ Text.Printf.printf "%.*fs" nDecimalDigits (realToFrac time :: Double)++-- | Measure the time which has elapsed since that specified.+measureElapsedTime :: Data.Time.Clock.UTCTime -> IO Data.Time.Clock.NominalDiffTime+measureElapsedTime startUTCTime	= (`Data.Time.Clock.diffUTCTime` startUTCTime) `fmap` Data.Time.Clock.getCurrentTime+
+ src-lib/BishBosh/Evaluation/Fitness.hs view
@@ -0,0 +1,393 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Quantifies the fitness of a game.++	* By measuring the fitness from the perspective of the player who just moved (rather than the next player to move),+	an automated player can test various /move/s & select the fittest.+-}++module BishBosh.Evaluation.Fitness(+-- * Constants+--	maximumDestinations,+	maximumDefended,+-- * Functions+--	mkPieceSquareCriterionValue,+	measurePieceSquareValue,+	measurePieceSquareValueIncrementally,+	measureValueOfMaterial,+--	measureValueOfMobility,+	measureValueOfCastlingPotential,+	measureValueOfDefence,+	measureValueOfDoubledPawns,+	measureValueOfIsolatedPawns,+	measureValueOfPassedPawns,+	evaluateFitness+) where++import			Control.Applicative((<|>))+import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.CriterionValue			as Attribute.CriterionValue+import qualified	BishBosh.Attribute.Direction				as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour			as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType				as Attribute.MoveType+import qualified	BishBosh.Attribute.RankValues				as Attribute.RankValues+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues	as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Cartesian.Abscissa				as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates				as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate				as Cartesian.Ordinate+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.Piece				as Component.Piece+import qualified	BishBosh.Component.PieceSquareArray			as Component.PieceSquareArray+import qualified	BishBosh.Component.QualifiedMove			as Component.QualifiedMove+import qualified	BishBosh.Component.Turn					as Component.Turn+import qualified	BishBosh.Input.CriteriaWeights				as Input.CriteriaWeights+import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Model.GameTerminationReason			as Model.GameTerminationReason+import qualified	BishBosh.Property.Opposable				as Property.Opposable+import qualified	BishBosh.State.Board					as State.Board+import qualified	BishBosh.State.CastleableRooksByLogicalColour		as State.CastleableRooksByLogicalColour+import qualified	BishBosh.Types						as T+import qualified	Control.Monad.Reader+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe++-- | Construct a criterion-value from a piece-square value.+mkPieceSquareCriterionValue :: (+	Fractional	criterionValue,+	Ord		criterionValue,+	Real		pieceSquareValue+ ) => pieceSquareValue -> Attribute.CriterionValue.CriterionValue criterionValue+mkPieceSquareCriterionValue	= Attribute.CriterionValue.mkCriterionValue . (+	/ fromIntegral Component.Piece.nPiecesPerSide+ ) . realToFrac++-- | Measures the piece-square value from the perspective of the last player to move.+measurePieceSquareValue :: (+	Enum	x,+	Enum	y,+	Num	pieceSquareValue,+	Ord	x,+	Ord	y+ )+	=> Component.PieceSquareArray.PieceSquareArray x y pieceSquareValue+	-> Model.Game.Game x y+	-> pieceSquareValue+{-# SPECIALISE measurePieceSquareValue :: Component.PieceSquareArray.PieceSquareArray T.X T.Y T.PieceSquareValue -> Model.Game.Game T.X T.Y -> T.PieceSquareValue #-}+measurePieceSquareValue pieceSquareArray game+	| Attribute.LogicalColour.isBlack $ Model.Game.getNextLogicalColour game	= difference+	| otherwise									= negate difference	-- Represent the piece-square value from Black's perspective.+	where+		[blacksPieceSquareValue, whitesPieceSquareValue]	= Data.Array.IArray.elems . State.Board.sumPieceSquareValueByLogicalColour pieceSquareArray $ Model.Game.getBoard game+		difference						= whitesPieceSquareValue - blacksPieceSquareValue++{- |+	* Measures the piece-square value from the perspective of the last player to move.++	* The previous value is provided, to enable calculation by difference.++	* N.B.: because of diminishing returns, the piece-square value for everything but quiet moves is calculated from scratch.+-}+measurePieceSquareValueIncrementally :: (+	Enum	x,+	Enum	y,+	Num	pieceSquareValue,+	Ord	x,+	Ord	y+ )+	=> pieceSquareValue	-- ^ The value before the last move was applied, & therefore also from the perspective of the previous player.+	-> Component.PieceSquareArray.PieceSquareArray x y pieceSquareValue+	-> Model.Game.Game x y+	-> pieceSquareValue+{-# SPECIALISE measurePieceSquareValueIncrementally :: T.PieceSquareValue -> Component.PieceSquareArray.PieceSquareArray T.X T.Y T.PieceSquareValue -> Model.Game.Game T.X T.Y -> T.PieceSquareValue #-}+measurePieceSquareValueIncrementally previousPieceSquareValue pieceSquareArray game+	| Attribute.MoveType.isQuiet $ Component.QualifiedMove.getMoveType qualifiedMove	= let+		findPieceSquareValue coordinates	= Component.PieceSquareArray.findPieceSquareValue (+			State.Board.getNPieces $ Model.Game.getBoard game	-- N.B.: no capture occurred.+		 ) (+			Property.Opposable.getOpposite $ Model.Game.getNextLogicalColour game	-- The last player to move.+		 ) (+			Component.Turn.getRank turn	-- N.B.: no promotion occurred.+		 ) coordinates pieceSquareArray+	in uncurry (-) (+		findPieceSquareValue . Component.Move.getDestination &&& findPieceSquareValue . Component.Move.getSource $ Component.QualifiedMove.getMove qualifiedMove+	) - previousPieceSquareValue {-from the previous player's perspective-}+	| otherwise					= measurePieceSquareValue pieceSquareArray game	-- N.B.: though Castling, En-passant, & promotion, can also be calculated, the returns don't justify the effort.+	where+		Just turn	= Model.Game.maybeLastTurn game+		qualifiedMove	= Component.Turn.getQualifiedMove turn++-- | Measure the arithmetic difference between the total /rank-value/ of the /piece/s currently held by either side; <https://chessprogramming.wikispaces.com/Material>.+measureValueOfMaterial :: (+	Fractional	criterionValue,+	Fractional	rankValue,+	Ord		criterionValue,+	Real		rankValue+ )+	=> Attribute.RankValues.RankValues rankValue+	-> Model.Game.Game x y+	-> Attribute.CriterionValue.CriterionValue criterionValue+-- {-# SPECIALISE measureValueOfMaterial :: Attribute.RankValues.RankValues T.RankValue -> Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfMaterial rankValues game	= Attribute.CriterionValue.mkCriterionValue . (+	/ fromIntegral Component.Piece.nPiecesPerSide	-- Normalise.+ ) . realToFrac . (+	if Attribute.LogicalColour.isBlack $ Model.Game.getNextLogicalColour game+		then id		-- White just moved.+		else negate	-- Black just moved.+ ) . Data.List.foldl' (+	\acc (rank, nPieces) -> if nPieces == 0+		then acc	-- Avoid calling 'Attribute.RankValues.findRankValue'.+		else acc + Attribute.RankValues.findRankValue rank rankValues * fromIntegral nPieces+ ) 0 . Data.Array.IArray.assocs . State.Board.getNPiecesDifferenceByRank {-which arbitrarily counts White pieces as positive & Black as negative-} $ Model.Game.getBoard game++{- |+	* Count the difference between the reciprocals (cf. <https://chessprogramming.wikispaces.com/Mobility>), of the total number of /move/s available to each player.++	* Using the reciprocal facilitates mapping into the /closed unit-interval/, & also emphasises the difference between having just one available move & having zero (i.e. mate).+	In consequence, it is more about restricting the opponent's mobility (particularly the @King@) rather than increasing one's own.+	This metric drives the game towards check-mate, rather than merely fighting a war of attrition.++	* CAVEAT: avoiding a reduction of one's mobility to zero (i.e. mate) must be paramount => losing one's @Queen@ should be preferable.+	measureValueOfMobility = 1 when mobility = 0, whereas loss of a @Queen@ = @ (rankValues ! Queen) / maximumTotalRankValue @,+	=> getWeightOfMobility * 1 > weightOfMaterial * (8.8 / 102.47)+	=> getWeightOfMobility > weightOfMaterial / 11.6++	The corollary is that one probably shouldn't sacrifice even a @Knight@ to temporarily reduce one's opponent mobility to one.+	measureValueOfMobility = 0.5 when mobility = 1,+	=> getWeightOfMobility * 0.5 < weightOfMaterial * (3.2 / 102.47)+	=> getWeightOfMobility < weightOfMaterial / 16.0+	CAVEAT: the loss of a @Knight@ occurs on the subsequent turn & is therefore downgraded, so even this represents too high a weighting.++	This presents a paradox !+-}+measureValueOfMobility :: (+	Enum		x,+	Enum		y,+	Fractional	criterionValue,+	Ord		criterionValue,+	Ord		x,+	Ord		y,+	Show		x,+	Show		y+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+{-# SPECIALISE measureValueOfMobility :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfMobility game	= Attribute.CriterionValue.mkCriterionValue . uncurry (-) . (+	measureConstriction &&& measureConstriction . Property.Opposable.getOpposite {-recent mover-}+ ) $ Model.Game.getNextLogicalColour game where+	measureConstriction logicalColour	= recip . fromIntegral . succ {-avoid divide-by-zero-} $ Model.Game.countMovesAvailableTo logicalColour game++-- | Measure the arithmetic difference between the potential to /Castle/, on either side.+measureValueOfCastlingPotential :: (+	Fractional	criterionValue,+	Ord		criterionValue+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+-- {-# SPECIALISE measureValueOfCastlingPotential :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfCastlingPotential game	= Attribute.CriterionValue.mkCriterionValue . uncurry (-) . (+	castlingPotential . Property.Opposable.getOpposite {-recent mover-} &&& castlingPotential+ ) $ Model.Game.getNextLogicalColour game where+{-+	castlingPotential logicalColour	= case State.CastleableRooksByLogicalColour.locateForLogicalColour logicalColour $ Model.Game.getCastleableRooksByLogicalColour game of+		Just []		-> 0		-- Can't castle.+		Just [_]	-> recip 2	-- Have one Rook which can castle.+		_		-> 1		-- Either have castled or can with either Rook.+-}+	castlingPotential	= Data.Maybe.maybe 1 {-have Castled-} (+		(/ 2) . fromIntegral . length+	 ) . (+		`State.CastleableRooksByLogicalColour.locateForLogicalColour` Model.Game.getCastleableRooksByLogicalColour game+	 )++{- |+	* Measure the arithmetic difference between the number of /doubled/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Doubled+Pawn>.++	* N.B.: measures tripled @Pawn@s as equivalent to two doubled @Pawn@s.++	* CAVEAT: this is a negative attribute, so the weighted normalised value shouldn't exceed the reduction due to 'measureValueOfMaterial' resulting from a @Pawn@-sacrifice.+-}+measureValueOfDoubledPawns :: (+	Fractional	criterionValue,+	Ord		criterionValue+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+-- {-# SPECIALISE measureValueOfDoubledPawns :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfDoubledPawns game	= Attribute.CriterionValue.mkCriterionValue . (+	/ 6	-- Normalise to [-1 .. 1]; the optimal scenario is eight files each containing one Pawn; the worst scenario is two files each containing four Pawns, all but one per file of which are counted as doubled.+ ) . fromIntegral . uncurry (-) . (+	countDoubledPawns &&& countDoubledPawns . Property.Opposable.getOpposite {-recent mover-}+ ) $ Model.Game.getNextLogicalColour game where+	countDoubledPawns logicalColour	= uncurry (-) . (+		Data.Map.foldl' (+) 0 &&& Data.Map.size {-one Pawn can't be considered to be doubled, so substract one Pawn per column-}+	 ) $ State.Board.getNPawnsByFileByLogicalColour (Model.Game.getBoard game) ! logicalColour++{- |+	* Measure the arithmetic difference between the number of /isolated/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Isolated+Pawn>.++	* CAVEAT: this is a negative attribute, so the weighted normalised value shouldn't exceed the reduction due to 'measureValueOfMaterial' resulting from a @Pawn@-sacrifice.+-}+measureValueOfIsolatedPawns :: (+	Enum		x,+	Fractional	criterionValue,+	Ord		criterionValue,+	Ord		x+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+{-# SPECIALISE measureValueOfIsolatedPawns :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfIsolatedPawns game	= Attribute.CriterionValue.mkCriterionValue . (+	/ fromIntegral Cartesian.Abscissa.xLength	-- Normalise to [-1 .. 1]; the optimal scenario is eight files each containing one Pawn & the worst scenario is all Pawns isolated (e.g. 4 alternate files of 2, 2 separate files or 4, ...).+ ) . fromIntegral . uncurry (-) . (+	countIsolatedPawns &&& countIsolatedPawns . Property.Opposable.getOpposite {-recent mover-}+ ) $ Model.Game.getNextLogicalColour game where+	countIsolatedPawns :: Attribute.LogicalColour.LogicalColour -> Component.Piece.NPieces+	countIsolatedPawns logicalColour	= Data.Map.foldlWithKey' (+		\acc x nPawns -> (+			if (`Data.Map.notMember` nPawnsByFile) `all` Cartesian.Abscissa.getAdjacents x+				then (+ nPawns)	-- All the Pawns on this file are isolated & thus lack the protection that may be offered by adjacent Pawns.+				else id		-- This file has at least one neighbouring Pawn which can (if at a suitable rank) be used to protect any of those in this file.+		) acc+	 ) 0 nPawnsByFile where+		nPawnsByFile	= State.Board.getNPawnsByFileByLogicalColour (Model.Game.getBoard game) ! logicalColour++-- | Measure the arithmetic difference between the number of /passed/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Passed+Pawn>.+measureValueOfPassedPawns :: forall x y criterionValue. (+	Enum		y,+	Fractional	criterionValue,+	Ord		criterionValue+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+{-# SPECIALISE measureValueOfPassedPawns :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfPassedPawns game	= Attribute.CriterionValue.mkCriterionValue . (+	/ fromIntegral Cartesian.Abscissa.xLength	-- Normalise to [-1 .. 1].+ ) . uncurry (-) . (+	valuePassedPawns . Property.Opposable.getOpposite {-recent mover-} &&& valuePassedPawns+ ) $ Model.Game.getNextLogicalColour game where+	valuePassedPawns :: Attribute.LogicalColour.LogicalColour -> criterionValue+	valuePassedPawns logicalColour	= Data.List.foldl' (+		\acc -> (acc +) . recip {-low distance has high value-} . fromIntegral . abs . (+			+ fromEnum (+				Cartesian.Ordinate.lastRank logicalColour	:: y+			)+		) . negate . fromEnum . Cartesian.Coordinates.getY	-- Measure the distance to promotion.+	 ) 0 $ State.Board.getPassedPawnCoordinatesByLogicalColour (Model.Game.getBoard game) ! logicalColour++{- |+	* The constant maximum total number of times the /piece/s of either side, can be defended.++	* This calculation assumes that:+		every /piece/ can defend another in every /direction/ it can attack,+		which is impossible, since in a 2-D board one can always draw a perimeter around the /piece/s, beyond which there're zero /pieces/ to defend, so the outer /piece/s can never be fully utilised;+		all @Pawn@s have been /queened/, which is unrealistic.+-}+maximumDefended :: Component.Piece.NPieces+maximumDefended	= (9 {-Queens-} + 1 {-King-} + 2 {-Knights-} + 2 {-Rooks + Bishops-}) * Attribute.Direction.nDistinctDirections++{- |+	* Measure the normalised arithmetic difference between the number of /piece/s defending each of one's own, on either side.++	* N.B. the /rank-value/ of the defended /piece/ is irrelevant because; it's the unknown value of the attacker that counts, since that's what the defender has the opportunity to counter-strike.++	* N.B. defence of the @King@ is irrelevent, because it can't be taken.++	* N.B. it's the total number of defenders which is relevant, rather than whether each piece has some protection, since it's the individual battles but the war which counts.++	* CAVEAT: this criterion competes with /mobility/, since each defended /piece/ blocks the path of the defender.+-}+measureValueOfDefence :: (+	Fractional	criterionValue,+	Ord		criterionValue+ ) => Model.Game.Game x y -> Attribute.CriterionValue.CriterionValue criterionValue+-- {-# SPECIALISE measureValueOfDefence :: Model.Game.Game T.X T.Y -> Attribute.CriterionValue.CriterionValue T.CriterionValue #-}+measureValueOfDefence game	= Attribute.CriterionValue.mkCriterionValue . (+	/ fromIntegral maximumDefended	-- Normalise.+ ) . fromIntegral . uncurry (-) . (+	(! Property.Opposable.getOpposite {-recent mover-} nextLogicalColour) &&& (! nextLogicalColour)+ ) . State.Board.summariseNDefendersByLogicalColour $ Model.Game.getBoard game where+	nextLogicalColour	= Model.Game.getNextLogicalColour game++{- |+	* Evaluates the fitness of the /board/ from the perspective of the last player to move.+	If the game has ended, the fitness is maximum for checkmate or zero for a draw,+	but otherwise is the /weighted mean/ of various criteria; <https://chessprogramming.wikispaces.com/Evaluation>.++	* Also returns the break-down of those /criterion-value/s with a non-zero /criterion-weight/.++	* Besides measuring the difference between the total /rank-value/ on either side,+	other criteria are selected to represent known attributes of a good position,+	but which won't be pay dividends any time soon, & therefore won't be represented by 'measureValueOfMaterial' within the limited future predicted.++	* Many possible criteria aren't measured because they're, either currently or soon, represented by those that are, typically 'measureValueOfMaterial'.+-}+evaluateFitness :: (+	Enum		x,+	Enum		y,+	Fractional	criterionValue,+	Fractional	pieceSquareValue,+	Fractional	rankValue,+	Fractional	weightedMean,+	Ord		x,+	Ord		y,+	Real		criterionValue,+	Real		criterionWeight,+	Real		pieceSquareValue,+	Real		rankValue,+	Show		x,+	Show		y+ )+	=> Maybe pieceSquareValue	-- ^ An optional value for the specified game.+	-> Model.Game.Game x y+	-> Input.EvaluationOptions.Reader criterionWeight pieceSquareValue rankValue x y (+		Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue+	)+{-# SPECIALISE evaluateFitness :: Maybe T.PieceSquareValue -> Model.Game.Game T.X T.Y -> Input.EvaluationOptions.Reader T.CriterionWeight T.PieceSquareValue T.RankValue T.X T.Y (Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues T.WeightedMean T.CriterionValue) #-}+evaluateFitness maybePieceSquareValue game+	| Just gameTerminationReason <- Model.Game.getMaybeTerminationReason game	= return {-to Reader-monad-} $ Attribute.WeightedMeanAndCriterionValues.mkWeightedMeanAndCriterionValues (+		if Model.GameTerminationReason.isCheckMate gameTerminationReason+			then 1	-- The last player to move, has won.+			else 0	-- A draw.+	) []+	| otherwise	= do+		criteriaWeights		<- Control.Monad.Reader.asks Input.EvaluationOptions.getCriteriaWeights+		rankValues		<- Control.Monad.Reader.asks Input.EvaluationOptions.getRankValues+		maybePieceSquareArray	<- Control.Monad.Reader.asks Input.EvaluationOptions.getMaybePieceSquareArray++		return {-to Reader-monad-} $ Input.CriteriaWeights.calculateWeightedMean criteriaWeights (+			measureValueOfMaterial rankValues game+		 ) (+			measureValueOfMobility game+		 ) (+			Data.Maybe.maybe Attribute.CriterionValue.zero mkPieceSquareCriterionValue $ maybePieceSquareValue <|> fmap (+				`measurePieceSquareValue` game+			) maybePieceSquareArray+		 ) (+			measureValueOfCastlingPotential game+		 ) (+			measureValueOfDefence game+		 ) (+			measureValueOfDoubledPawns game+		 ) (+			measureValueOfIsolatedPawns game+		 ) (+			measureValueOfPassedPawns game+		 )+
+ src-lib/BishBosh/Evaluation/PositionHashQuantifiedGameTree.hs view
@@ -0,0 +1,304 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Constructs a tree of zobrist-hashes & /quantifiedGame/s, with one of the moves available to its parent node applied, & an evaluation of its fitness.++	* Each forest in the tree is sorted, before evaluation of it's fitness is performed.++	* CAVEAT: promotions are insufficiently frequent to be treated specially when sorting.+-}++module BishBosh.Evaluation.PositionHashQuantifiedGameTree(+-- * Types+-- ** Type-synonyms+--	BarePositionHashQuantifiedGameTree,+	Forest,+-- ** Data-types+	NodeLabel(+--		MkNodeLabel,+		getPositionHash,+		getQuantifiedGame+	),+	PositionHashQuantifiedGameTree(+		MkPositionHashQuantifiedGameTree,+		deconstruct+	),+-- * Functions+	reduce,+	traceRoute,+	resign,+	traceMatchingMoves,+	promoteMatchingMoves,+	sortNonCaptureMoves,+-- ** Accessors+	getRootQuantifiedGame',+	getRootPositionHash,+	getRootQuantifiedGame,+-- ** Constructor+	fromBarePositionHashQuantifiedGameTree,+	mkPositionHashQuantifiedGameTree+-- ** Predicates+--	equalsLastMove+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.RankValues				as Attribute.RankValues+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues	as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.QualifiedMove			as Component.QualifiedMove+import qualified	BishBosh.Component.Turn					as Component.Turn+import qualified	BishBosh.Component.Zobrist				as Component.Zobrist+import qualified	BishBosh.Data.RoseTree					as Data.RoseTree+import qualified	BishBosh.Evaluation.Fitness				as Evaluation.Fitness+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Model.GameTree					as Model.GameTree+import qualified	BishBosh.Notation.MoveNotation				as Notation.MoveNotation+import qualified	BishBosh.Property.Null					as Property.Null+import qualified	BishBosh.Property.Tree					as Property.Tree+import qualified	BishBosh.Types						as T+import qualified	Control.Arrow+import qualified	Control.Monad.Reader+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Maybe+import qualified	Data.Tree++-- | Define a node in the tree to contain the hash of a /game/ & an evaluation of the fitness of that /game/.+data NodeLabel x y positionHash criterionValue weightedMean	= MkNodeLabel {+	getPositionHash		:: positionHash,	-- ^ The hash of the /game/ contained in 'getQuantifiedGame'.+	getQuantifiedGame	:: Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean+} deriving (Eq, Show)++instance (Enum x, Enum y, Real weightedMean) => Notation.MoveNotation.ShowNotationFloat (NodeLabel x y positionHash criterionValue weightedMean) where+	showsNotationFloat moveNotation showsDouble MkNodeLabel { getQuantifiedGame = quantifiedGame }	= Notation.MoveNotation.showsNotation moveNotation (+		Evaluation.QuantifiedGame.getLastTurn quantifiedGame+	 ) . showString "\t=> " . showsDouble (+		realToFrac . Attribute.WeightedMeanAndCriterionValues.getWeightedMean $ Evaluation.QuantifiedGame.getWeightedMeanAndCriterionValues quantifiedGame+	 )++instance Property.Null.Null (NodeLabel x y positionHash criterionValue weightedMean) where+	isNull MkNodeLabel { getQuantifiedGame = quantifiedGame }	= Property.Null.isNull quantifiedGame++-- | Whether the last move of the /game/ in a node, matches a specified /move/.+equalsLastMove :: (Eq x, Eq y) => Component.Move.Move x y -> Data.RoseTree.IsMatch (NodeLabel x y positionHash criterionValue weightedMean)+equalsLastMove move MkNodeLabel { getQuantifiedGame = quantifiedGame }	= (== move) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove $ Evaluation.QuantifiedGame.getLastTurn quantifiedGame++-- | The tree resulting from each possible move-choice applied to a /game/, including a position-hash & an evaluation of the resulting fitness.+type BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean	= Data.Tree.Tree (NodeLabel x y positionHash criterionValue weightedMean)++-- | Accessor.+getRootQuantifiedGame' :: BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean+getRootQuantifiedGame' Data.Tree.Node {+	Data.Tree.rootLabel	= MkNodeLabel { getQuantifiedGame = quantifiedGame }+} = quantifiedGame++-- | Wrap the bare tree.+newtype PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean	= MkPositionHashQuantifiedGameTree {+	deconstruct	:: BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+} deriving Eq++instance Property.Tree.Prunable (PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean) where+	prune depth MkPositionHashQuantifiedGameTree { deconstruct = barePositionHashQuantifiedGameTree }	= MkPositionHashQuantifiedGameTree $ Property.Tree.prune depth barePositionHashQuantifiedGameTree++instance (+	Enum	x,+	Enum	y,+	Real	weightedMean+ ) => Notation.MoveNotation.ShowNotationFloat (PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean) where+	showsNotationFloat moveNotation showsDouble MkPositionHashQuantifiedGameTree { deconstruct = barePositionHashQuantifiedGameTree } = showString $ (+		if Property.Null.isNull . Data.Tree.rootLabel $ barePositionHashQuantifiedGameTree+			then Data.RoseTree.drawForest toString . Data.Tree.subForest+			else Data.RoseTree.drawTree toString+	 ) barePositionHashQuantifiedGameTree where+		toString nodeLabel	= Notation.MoveNotation.showsNotationFloat moveNotation showsDouble nodeLabel ""++-- | Constructor.+fromBarePositionHashQuantifiedGameTree :: BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+fromBarePositionHashQuantifiedGameTree	= MkPositionHashQuantifiedGameTree++-- | Constructor.+mkPositionHashQuantifiedGameTree :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Fractional		criterionValue,+	Fractional		pieceSquareValue,+	Fractional		rankValue,+	Fractional		weightedMean,+	Integral		x,+	Integral		y,+	Real			criterionValue,+	Real			criterionWeight,+	Real			pieceSquareValue,+	Real			rankValue,+	Show			x,+	Show			y+ )+	=> Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y+	-> Input.SearchOptions.SearchOptions+	-> Component.Zobrist.Zobrist x y positionHash+	-> Model.GameTree.MoveFrequency x y+	-> Model.Game.Game x y	-- ^ The current state of the /game/.+	-> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+{-# SPECIALISE mkPositionHashQuantifiedGameTree+	:: Input.EvaluationOptions.EvaluationOptions T.CriterionWeight T.PieceSquareValue T.RankValue T.X T.Y+	-> Input.SearchOptions.SearchOptions+	-> Component.Zobrist.Zobrist T.X T.Y T.PositionHash+	-> Model.GameTree.MoveFrequency T.X T.Y+	-> Model.Game.Game T.X T.Y+	-> PositionHashQuantifiedGameTree T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean+ #-}+mkPositionHashQuantifiedGameTree evaluationOptions searchOptions zobrist moveFrequency seedGame	= MkPositionHashQuantifiedGameTree (+	if Input.EvaluationOptions.getIncrementalEvaluation evaluationOptions+		then let+			apexPositionHash	= Component.Zobrist.hash2D seedGame zobrist+		in Data.Tree.Node {+			Data.Tree.rootLabel	= MkNodeLabel apexPositionHash $ Control.Monad.Reader.runReader (+				Evaluation.QuantifiedGame.fromGame Nothing seedGame+			) evaluationOptions,	-- Neither the previous positionHash nor the previous pieceSquareValue, are available to support incremental construction.+			Data.Tree.subForest	= map (+				Data.Maybe.maybe (+					let+						slave positionHash game Data.Tree.Node {+							Data.Tree.rootLabel	= game',+							Data.Tree.subForest	= gameForest'+						} = Data.Tree.Node {+							Data.Tree.rootLabel	= MkNodeLabel positionHash' $ Control.Monad.Reader.runReader (+								Evaluation.QuantifiedGame.fromGame Nothing game'+							) evaluationOptions,+							Data.Tree.subForest	= map (slave positionHash' game') gameForest'	-- Recurse.+						} where+							positionHash'	= Model.Game.incrementalHash game positionHash game' zobrist+					in slave+				) (+					\pieceSquareArray -> let+						slave pieceSquareValue positionHash game Data.Tree.Node {+							Data.Tree.rootLabel	= game',+							Data.Tree.subForest	= gameForest'+						} = Data.Tree.Node {+							Data.Tree.rootLabel	= MkNodeLabel positionHash' $ Control.Monad.Reader.runReader (+								Evaluation.QuantifiedGame.fromGame (Just pieceSquareValue') game'+							) evaluationOptions,+							Data.Tree.subForest	= map (slave pieceSquareValue' positionHash' game') gameForest'	-- Recurse.+						} where+							pieceSquareValue'	= Evaluation.Fitness.measurePieceSquareValueIncrementally pieceSquareValue pieceSquareArray game'+							positionHash'		= Model.Game.incrementalHash game positionHash game' zobrist+					in slave $ Evaluation.Fitness.measurePieceSquareValue pieceSquareArray seedGame+				) (+					Input.EvaluationOptions.getMaybePieceSquareArray evaluationOptions+				) apexPositionHash seedGame+			) $ Data.Tree.subForest bareGameTree+		}+		else fmap (+			uncurry MkNodeLabel . (+				(`Component.Zobrist.hash2D` zobrist) &&& (`Control.Monad.Reader.runReader` evaluationOptions) . Evaluation.QuantifiedGame.fromGame Nothing+			)+		) bareGameTree+ ) where+	bareGameTree	= Model.GameTree.deconstruct . uncurry Model.GameTree.sortGameTree (+		Input.SearchOptions.getPreferMovesTowardsCentre &&& Input.SearchOptions.getMaybeCaptureMoveSortAlgorithm $ searchOptions+	 ) (+		`Attribute.RankValues.findRankValue` Input.EvaluationOptions.getRankValues evaluationOptions+	 ) moveFrequency $ Model.GameTree.fromGame seedGame++-- | Accessor.+getRootPositionHash :: PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> positionHash+getRootPositionHash MkPositionHashQuantifiedGameTree {+	deconstruct = Data.Tree.Node {+		Data.Tree.rootLabel	= MkNodeLabel { getPositionHash = positionHash }+	}+} = positionHash++-- | Accessor.+getRootQuantifiedGame :: PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean+getRootQuantifiedGame MkPositionHashQuantifiedGameTree {+	deconstruct = Data.Tree.Node {+		Data.Tree.rootLabel	= MkNodeLabel { getQuantifiedGame = quantifiedGame }+	}+} = quantifiedGame++-- | Forward request.+reduce+	:: Data.RoseTree.IsMatch (NodeLabel x y positionHash criterionValue weightedMean)+	-> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> Maybe (PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean)+reduce isMatch MkPositionHashQuantifiedGameTree { deconstruct = barePositionHashQuantifiedGameTree }	= MkPositionHashQuantifiedGameTree `fmap` Data.RoseTree.reduce isMatch barePositionHashQuantifiedGameTree++-- | Forward request.+traceRoute+	:: (Component.Turn.Turn x y -> Data.RoseTree.IsMatch (NodeLabel x y positionHash criterionValue weightedMean))+	-> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> [Component.Turn.Turn x y]+	-> Maybe [NodeLabel x y positionHash criterionValue weightedMean]+traceRoute isMatch MkPositionHashQuantifiedGameTree { deconstruct = barePositionHashQuantifiedGameTree }	= Data.RoseTree.traceRoute isMatch barePositionHashQuantifiedGameTree++-- | Follow the specified move-sequence down the /positionHashQuantifiedGameTree/.+traceMatchingMoves+	:: (Eq x, Eq y)+	=> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> [Component.Move.Move x y]+	-> Maybe [NodeLabel x y positionHash criterionValue weightedMean]	-- ^ Returns 'Nothing' on failure to match a move.+traceMatchingMoves MkPositionHashQuantifiedGameTree { deconstruct = barePositionHashQuantifiedGameTree }	= Data.RoseTree.traceRoute equalsLastMove barePositionHashQuantifiedGameTree++-- | Amend the apex-game to reflect the resignation of the next player.+resign :: PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+resign MkPositionHashQuantifiedGameTree {+	deconstruct	= barePositionHashQuantifiedGameTree@Data.Tree.Node {+		Data.Tree.rootLabel	= nodeLabel@MkNodeLabel { getQuantifiedGame = quantifiedGame }+	}+} = MkPositionHashQuantifiedGameTree $ barePositionHashQuantifiedGameTree {+	Data.Tree.rootLabel	= nodeLabel {+		getQuantifiedGame	= quantifiedGame { Evaluation.QuantifiedGame.getGame = Model.Game.resign $ Evaluation.QuantifiedGame.getGame quantifiedGame }+	}+}++-- | Self-documentation.+type Forest x y positionHash criterionValue weightedMean	= [BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean]++{- |+	* Promotes the first matching /move/ to the head of the forest, then descends & recursively promotes the next matching move in the sub-forest.++	* N.B.: this can be used to dynamically re-order the forest when a transposition is detected.+-}+promoteMatchingMoves+	:: (Eq x, Eq y)+	=> [Component.Move.Move x y]					-- ^ The list of moves, which should be promoted at successively deeper levels in the tree.+	-> Forest x y positionHash criterionValue weightedMean+	-> Maybe (Forest x y positionHash criterionValue weightedMean)	-- ^ Returns 'Nothing' on failure to match a move.+promoteMatchingMoves	= Data.RoseTree.promote equalsLastMove++{- |+	* Sorts the forest, starting just after any initial capture-moves.++	* N.B.: this can be used to dynamically re-order the forest using the killer heuristic.+-}+sortNonCaptureMoves+	:: (Forest x y positionHash criterionValue weightedMean -> Forest x y positionHash criterionValue weightedMean)+	-> Forest x y positionHash criterionValue weightedMean+	-> Forest x y positionHash criterionValue weightedMean+sortNonCaptureMoves sortForest	= uncurry (++) . Control.Arrow.second sortForest . span (+	Component.Turn.isCapture . Evaluation.QuantifiedGame.getLastTurn . getRootQuantifiedGame'	-- Shield any capture-moves, which were previously advanced by static sorting, from the sort.+ )+
+ src-lib/BishBosh/Evaluation/QuantifiedGame.hs view
@@ -0,0 +1,156 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Quantifies a /game/, & therefore the sequence of moves applied.++	* The fitness & its breakdown into constituent criterion-values, are also recorded.+-}++module BishBosh.Evaluation.QuantifiedGame(+-- * Types+-- ** Type-synonyms+	OpenInterval,+-- ** Data-types+	QuantifiedGame(+--		MkQuantifiedGame,+		getGame,+		getWeightedMeanAndCriterionValues+	),+-- * Constants+	unboundedInterval,+-- * Functions+	compareFitness,+-- ** Accessors+	getFitness,+-- ** Constructors+	fromGame,+-- ** Accessors+	getLastTurn,+	getLatestTurns,+-- ** Mutators+	negateFitness,+	negateInterval+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues	as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.Turn					as Component.Turn+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Evaluation.Fitness				as Evaluation.Fitness+import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Notation.MoveNotation				as Notation.MoveNotation+import qualified	BishBosh.Property.Null					as Property.Null+import qualified	BishBosh.Text.ShowList					as Text.ShowList+import qualified	BishBosh.Types						as T+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Maybe+import qualified	Data.Ord++-- | The selected /game/ & the criteria used in that QuantifiedGame.+data QuantifiedGame x y criterionValue weightedMean	= MkQuantifiedGame {+	getGame					:: Model.Game.Game x y,	-- ^ The /game/ resulting from a sequence of /turn/s.+	getWeightedMeanAndCriterionValues	:: Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue+} deriving (Eq, Show)++instance Control.DeepSeq.NFData weightedMean => Control.DeepSeq.NFData (QuantifiedGame x y criterionValue weightedMean) where+	rnf MkQuantifiedGame { getWeightedMeanAndCriterionValues = weightedMeanAndCriterionValues }	= Control.DeepSeq.rnf weightedMeanAndCriterionValues	-- The other field is a prerequisite.++instance (Enum x, Enum y, Real criterionValue, Real weightedMean) => Notation.MoveNotation.ShowNotationFloat (QuantifiedGame x y criterionValue weightedMean) where+	showsNotationFloat moveNotation showsDouble quantifiedGame	= Text.ShowList.showsAssociationList Text.ShowList.showsSeparator $ map ($ quantifiedGame) [+		(,) Component.Move.tag . Notation.MoveNotation.showsNotation moveNotation . getLastTurn,+		(,) Attribute.WeightedMeanAndCriterionValues.weightedMeanTag . showsDouble . realToFrac . getFitness,+		(,) Attribute.WeightedMeanAndCriterionValues.criterionValuesTag . Text.ShowList.showsFormattedList' (showsDouble . realToFrac) . Attribute.WeightedMeanAndCriterionValues.getCriterionValues . getWeightedMeanAndCriterionValues+	 ]++instance Property.Null.Null (QuantifiedGame x y criterionValue weightedMean) where+	isNull MkQuantifiedGame { getGame = game }	= Property.Null.isNull game++-- | Accessor.+getFitness :: QuantifiedGame x y criterionValue weightedMean -> weightedMean+getFitness MkQuantifiedGame { getWeightedMeanAndCriterionValues = weightedMeanAndCriterionValues }	= Attribute.WeightedMeanAndCriterionValues.getWeightedMean weightedMeanAndCriterionValues++-- | Like 'fromGame' except that the caller determines the piece-square value.+fromGame :: (+	Enum		x,+	Enum		y,+	Fractional	criterionValue,+	Fractional	pieceSquareValue,+	Fractional	rankValue,+	Fractional	weightedMean,+	Ord		x,+	Ord		y,+	Real		criterionValue,+	Real		criterionWeight,+	Real		pieceSquareValue,+	Real		rankValue,+	Show		x,+	Show		y+ )+	=> Maybe pieceSquareValue	-- ^ The value for the specified game.+	-> Model.Game.Game x y		-- ^ The current state of the /game/.+	-> Input.EvaluationOptions.Reader criterionWeight pieceSquareValue rankValue x y (QuantifiedGame x y criterionValue weightedMean)+{-# SPECIALISE fromGame :: Maybe T.PieceSquareValue -> Model.Game.Game T.X T.Y -> Input.EvaluationOptions.Reader T.CriterionWeight T.PieceSquareValue T.RankValue T.X T.Y (QuantifiedGame T.X T.Y T.CriterionValue T.WeightedMean) #-}+fromGame maybePieceSquareValue game	= MkQuantifiedGame game `fmap` Evaluation.Fitness.evaluateFitness maybePieceSquareValue game++-- | Retrieve the /turn/ used to generate the selected /game/.+getLastTurn :: QuantifiedGame x y criterionValue weightedMean -> Component.Turn.Turn x y+getLastTurn MkQuantifiedGame { getGame = game }	= Data.Maybe.fromMaybe (+	Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.Evaluation.QuantifiedGame.getLastTurn:\tzero turns have been made."+ ) $ Model.Game.maybeLastTurn game++-- | Drop the specified number of old turns from the start of the chronological sequence, leaving the most recent.+getLatestTurns+	:: Component.Move.NPlies+	-> QuantifiedGame x y criterionValue weightedMean+	-> [Component.Turn.Turn x y]+getLatestTurns nPlies MkQuantifiedGame { getGame = game }	= drop nPlies $ Model.Game.listTurnsChronologically game++-- | Represent the /fitness/ of the /game/ resulting from a future /move/ by the opponent, from the perspective of the current player.+negateFitness :: Num weightedMean => QuantifiedGame x y criterionValue weightedMean -> QuantifiedGame x y criterionValue weightedMean+negateFitness quantifiedGame@MkQuantifiedGame { getWeightedMeanAndCriterionValues = weightedMeanAndCriterionValues }	= quantifiedGame { getWeightedMeanAndCriterionValues = Attribute.WeightedMeanAndCriterionValues.negateWeightedMean weightedMeanAndCriterionValues }++-- | Compares fitness.+compareFitness+	:: Ord weightedMean+	=> QuantifiedGame x y criterionValue weightedMean+	-> QuantifiedGame x y criterionValue weightedMean+	-> Ordering+compareFitness	= Data.Ord.comparing getFitness++{- |+	* The open interval in which to search for better solutions.++	* N.B.: 'Nothing' is interpreted as unbounded.+-}+type OpenInterval x y criterionValue weightedMean	= (Maybe (QuantifiedGame x y criterionValue weightedMean), Maybe (QuantifiedGame x y criterionValue weightedMean))++-- | Constant.+unboundedInterval :: OpenInterval x y criterionValue weightedMean+unboundedInterval	= (Nothing, Nothing)++-- | Reflect the interval about zero.+negateInterval :: Num weightedMean => OpenInterval x y criterionValue weightedMean -> OpenInterval x y criterionValue weightedMean+negateInterval (maybeAlpha, maybeBeta)	= ($ maybeBeta) &&& ($ maybeAlpha) $ fmap negateFitness
+ src-lib/BishBosh/Input/CECPFeatures.hs view
@@ -0,0 +1,406 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines CECP-features.+-}++module BishBosh.Input.CECPFeatures(+-- * Types+-- ** Type-synonyms+--	Key,+--	Value,+	Feature,+--	Transformation,+-- ** Data-types+	CECPFeatures(+--		MkCECPFeatures+		getFeatures+--		getDone+	),+-- * Constants+	tag,+	featureTag,+	analyseTag,+	coloursTag,+--	debugTag,+--	doneTag,+	drawTag,+--	egtTag,+--	excludeTag,+--	highlightTag,+	icsTag,+--	memoryTag,+--	mynameTag,+	nameTag,+	npsTag,+	optionTag,+	pauseTag,+	pingTag,+	playotherTag,+--	reuseTag,+--	sanTag,+	setboardTag,+--	sigintTag,+--	sigtermTag,+--	smpTag,+	timeTag,+	usermoveTag,+--	variantsTag,+--	showsFeatureSeparator,+--	showsKVSeparator,+	resolution,+	inputWidget,+	sliderWidget,+-- * Functions+-- ** Constructors+	mkCECPFeatures,+-- ** Mutators+	prependFeature,+	deleteFeature,+	updateFeature,+-- ** Predicates+	isFeatureDisabled+) where++import			BishBosh.Data.Bool()	-- For 'HXT.XmlPickler Bool'.+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag		= "cecpFeatures"++-- | Used to qualify XML.+featureTag :: String+featureTag	= "feature"++-- | Self-documentation.+type Key	= String++-- | Each feature-value can be either an @Int@ (also used to represent @Boolean@ values), or an arbitrary @String@.+type Value	= Either Int String++-- | Self-documentation.+type Feature	= (Key, Value)++-- | Tags the feature which defines whether the GUI may request "analyse" mode.+analyseTag :: Key+analyseTag	= "analyze"++-- | Tags the feature which defines whether the GUI may request that a specific player move next.+coloursTag :: Key+coloursTag	= "colors"++-- | Tags the feature which defines whether the engine may send debug information to the GUI.+debugTag :: Key+debugTag	= "debug"++-- | The tag used to terminate the feature-list.+doneTag :: Key+doneTag		= "done"++-- | Tags the feature which defines whether the GUI may send the "draw" command.+drawTag :: Key+drawTag		= "draw"++-- | Tags the feature which defines whether the GUI may send the "egtpath" command.+egtTag :: Key+egtTag		= "egt"++-- | Tags the feature which defines whether the GUI may send the "exclude" command.+excludeTag :: Key+excludeTag	= "exclude"++-- | Tags the feature which defines whether the GUI may send the "lift", "put" & "hover" commands.+highlightTag :: Key+highlightTag	= "highlight"++-- | Tag the feature which defines whether the GUI should inform the engine whether it's on a chess-server.+icsTag :: Key+icsTag		= "ics"++-- | Tags the feature which defines whether the GUI can request that the engine cap memory-use.+memoryTag :: Key+memoryTag	= "memory"++-- | Tags the feature which defines the engine's name to the GUI.+mynameTag :: Key+mynameTag	= "myname"++-- | Tags the feature which defines whether the GUI can tell the engine the opponent's name.+nameTag :: Key+nameTag		= "name"++-- | Tags the feature which defines whether the GUI can limit thinking-time to a number of nodes searched.+npsTag :: Key+npsTag		= "nps"++-- |+optionTag :: Key+optionTag	= "option"++-- | Tags the feature which defines whether the GUI may send the "pause" command.+pauseTag :: Key+pauseTag	= "pause"++-- | Tags the feature which defines whether the GUI may send a "ping" command.+pingTag :: Key+pingTag		= "ping"++-- | Tags the feature which defines whether the GUI may send the "playother" command.+playotherTag :: Key+playotherTag	= "playother"++-- | Tags the feature which defines whether the GUI may reuse this engine for multiple games.+reuseTag :: Key+reuseTag	= "reuse"++-- | Tags the feature which defines whether the GUI may send moves in "SAN" rather than "Coordinate" notation.+sanTag :: Key+sanTag		= "san"++-- | Tags the feature which defines whether the GUI may send the "setboard" command.+setboardTag :: Key+setboardTag	= "setboard"++-- | Tags the feature which defines whether the GUI may send the engine a "SIGINT".+sigintTag :: Key+sigintTag	= "sigint"++-- | Tags the feature which defines whether the GUI may send the engine a "SIGTERM".+sigtermTag :: Key+sigtermTag	= "sigterm"++-- | Tags the feature which defines whether the GUI may cap the number of cores used by the engine.+smpTag :: Key+smpTag		= "smp"++-- | Tags the feature which defines whether the GUI may adjust the engine's move-timer.+timeTag :: Key+timeTag		= "time"++-- | Tags the feature which defines whether the GUI should prefix move-commands to facilitate identification.+usermoveTag :: Key+usermoveTag	= "usermove"++-- | Tags the feature which defines the supported variants of chess.+variantsTag :: Key+variantsTag	= "variants"++-- | Defines the feature-separator used for streaming.+showsFeatureSeparator :: ShowS+showsFeatureSeparator	= showChar ' '++-- | Defines the key-value separator used for streaming features.+showsKVSeparator :: ShowS+showsKVSeparator	= showChar '='++-- | The resolution of sliders depicted in the GUI.+resolution :: Int+resolution	= 1000++-- | The string sent to xboard, to request an input widget.+inputWidget :: String+inputWidget	= "-string"++-- | The string sent to xboard, to request a slider-widget.+sliderWidget :: String+sliderWidget	= "-slider"++-- | Defines CECP-features.+data CECPFeatures	= MkCECPFeatures {+	getFeatures	:: [Feature],	-- ^ The list of features.+	getDone		:: Bool		-- ^ Whether the GUI should assume that all features have been received, or wait until a timeout before proceeding.+} deriving Eq++instance Control.DeepSeq.NFData CECPFeatures where+	rnf MkCECPFeatures {+		getFeatures	= features,+		getDone		= done+	} = Control.DeepSeq.rnf (features, done)++instance Show CECPFeatures where+	showsPrec _ MkCECPFeatures {+		getFeatures	= features,+		getDone		= done+	} = Text.ShowList.showsDelimitedList showsFeatureSeparator id id (+		map (+			\(k, v) -> showString k . showsKVSeparator . either shows {-Int-} (\s -> showChar '"' . showString s . showChar '"') v+		) features+	 ) . showsFeatureSeparator . showString doneTag . showsKVSeparator . shows (if done then (1 :: Int) else 0)++instance Data.Default.Default CECPFeatures where+	def = MkCECPFeatures {+		getFeatures	= let+			false : true : _	= map Left [0 ..]++			mkCommaSeparatedList	= Right . Data.List.intercalate ","+		in [+			(+				analyseTag,	false			-- Whether xboard may send the "analyze" command, should the user asks for analysis mode.+			), (+				coloursTag,	false			-- Whether xboard may send the obsolete "white" and "black" commands.+			), (+				drawTag,	true			-- Whether xboard may send the "draw" command, should the user request one.+			), (+				debugTag,	false			-- Whether the engine may send debug-output (prefixed by '#') to xboard.+			), (+				egtTag,		mkCommaSeparatedList []	-- Whether xboard can send the "egtpath" command to define the path to end-game tables.+			), (+				excludeTag,	false			-- Whether xboard can send the "exclude" command to control which moves are searched.+			), (+				highlightTag,	false			-- Whether xboard can send "lift", "put" and "hover" commands to the engine.+			), (+				icsTag,		true			-- Whether xboard should inform us whether it is playing on a chess-server.+			), (+				memoryTag,	false			-- Whether xboard can send the "memory" command to cap memory-use.+			), (+				mynameTag,	Right "BishBosh"	-- Defines the name xboard uses for in-window banners, in the PGN-tags of saved game-files, & when sending the "name" command to another engine.+			), (+				nameTag,	true			-- Whether xboard may send the "name" command to inform us of the opponent's name.+			), (+				npsTag,		false			-- Whether xboard may send the "nps" command, to limit thinking by the number of nodes searched rather than time.+			), (+				pauseTag,	true			-- Whether xboard may send the "pause" command.+			), (+				pingTag,	true			-- Whether xboard may send the "ping" command.+			), (+				playotherTag,	true			-- Whether xboard may send the "playother" command.+			), (+				reuseTag,	true			-- Whether xboard may reuse this engine for multiple games.+			), (+				sanTag,		false			-- Whether xboard sends moves in "Standard Algebraic Notation" rather than "Coordinate".+			), (+				setboardTag,	true			-- Whether xboard may send the "setboard" command, to define the board.+			), (+				sigintTag,	false			-- Whether xboard may send SIGINT, which it might if it believes the engine isn't listening.+			), (+				sigtermTag,	true			-- Whether xboard may send SIGTERM, which it does shortly after the "quit" command.+			), (+				smpTag,		true			-- Whether xboard can send the "cores" command to limit the number of CPU-cores.+			), (+				timeTag,	false			-- Whether xboard may send the "time" and "otim" commands to update the engine's clocks.+			), (+				usermoveTag,	true			-- Whether xboard should send the "usermove"-prefix to moves.+			), (+				variantsTag,	mkCommaSeparatedList [+					"normal"+				]					-- The set of acceptable game-variants.+			)+		],+		getDone	= True	-- Terminate the feature-list.+	 }++instance HXT.XmlPickler CECPFeatures where+	xpickle	= HXT.xpDefault def . HXT.xpElem tag . HXT.xpWrap (+		uncurry mkCECPFeatures,	-- Construct.+		\MkCECPFeatures {+			getFeatures	= features,+			getDone		= done+		} -> (features, done)	-- Deconstruct.+	 ) $ (+		HXT.xpList . HXT.xpElem featureTag $ HXT.xpTextAttr "key" `HXT.xpPair` HXT.xpWrap (+			\s -> case reads s of+				[(i, "")]	-> Left i+				_		-> Right s,+			\value -> showChar '"' $ either shows showString value "\""+		 ) (+			HXT.xpAttr "value" HXT.xpText0+		 )+	 ) `HXT.xpPair` (+		getDone def `HXT.xpDefault` HXT.xpAttr doneTag HXT.xpickle+	 ) where+		def	= Data.Default.def++-- | Smart-constructor.+mkCECPFeatures :: [Feature] -> Bool -> CECPFeatures+mkCECPFeatures features done+	| Just (key, _)	<- Data.List.find (+		any (+			not . Data.Char.isAlpha+		) . fst {-key-}+	) features	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.CECPFeatures.mkCECPFeatures:\tinvalid key" . Text.ShowList.showsAssociation $ shows key "."+	| Just (_, value)	<- Data.List.find (+		either (+			const False+		) (+			any (`elem` "\"\n\r")	-- Prevent command-injection.+		) . snd {-value-}+	) features	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.CECPFeatures.mkCECPFeatures:\tinvalid value" . Text.ShowList.showsAssociation $ shows value "."+	| otherwise	= MkCECPFeatures {+		getFeatures	= features,+		getDone		= done+	}++-- | Self-documentation.+type Transformation	= CECPFeatures -> CECPFeatures++{- |+	* Prepends the specified feature.++	* CAVEAT: this may create a duplicate key.+-}+prependFeature :: Feature -> Transformation+prependFeature feature cecpFeatures@MkCECPFeatures {+	getFeatures	= features+} = cecpFeatures {+	getFeatures	= feature : features+}++-- | Deletes the specified feature.+deleteFeature :: Feature -> Transformation+deleteFeature feature@(key, value) cecpFeatures@MkCECPFeatures {+	getFeatures	= features+} = cecpFeatures {+	getFeatures	= filter (+		either (+			const $ (/= key) . fst+		) (+			const (/= feature)	-- N.B.: string-valued features must also match the specified value, to account for possibility of duplicates.+		) value+	) features+}++{- |+	* Prepends the specified feature.++	* CAVEAT: deletes all similarly named features.+-}+updateFeature :: Feature -> Transformation+updateFeature feature	= prependFeature feature . deleteFeature feature++-- | Predicate.+isFeatureDisabled :: Key -> CECPFeatures -> Bool+isFeatureDisabled key MkCECPFeatures {+	getFeatures	= features+} = Data.Maybe.maybe (+	Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.Input.CECPFeatures.isFeatureDisabled:\t" $ shows key " not found."+ ) (+	(== 0) `either` null+ ) $ lookup key features+
+ src-lib/BishBosh/Input/CECPOptions.hs view
@@ -0,0 +1,326 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines configurable options for Chess-engine Communications-protocol, as used by XBoard;+		<https://www.gnu.org/software/xboard/engine-intf.html>+		<https://en.wikipedia.org/wiki/Chess_Engine_Communication_Protocol>.+-}++module BishBosh.Input.CECPOptions(+-- * Types+-- ** Type-synonyms+--	Mode,+--	ProtocolVersion,+--	Transformation,+-- ** Data-types+	CECPOptions(+--		MkCECPOptions,+		getAnalyseMode,+		getDisplaySAN,+		getEditMode,+		getForceMode,+		getMaybePaused,+		getPonderMode,+		getPostMode,+		getProtocolVersion,+		getCECPFeatures+	),+-- * Constants+	tag,+	analyseModeTag,+	displaySANTag,+	editModeTag,+	forceModeTag,+--	pausedTag,+	ponderModeTag,+	postModeTag,+	protocolVersionTag,+-- * Functions+	getNamedModes,+-- ** Constructors+	mkCECPOptions,+-- ** Mutators+	setProtocolVersion,+	updateFeature,+	deleteFeature,+	resetModes+) where++import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Input.CECPFeatures	as Input.CECPFeatures+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Data.Time.Clock+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag			= "cecpOptions"++-- | Used to qualify XML.+analyseModeTag :: String+analyseModeTag		= "analyseMode"++-- | Used to qualify XML.+displaySANTag :: String+displaySANTag		= "displaySAN"++-- | Used to qualify XML.+editModeTag :: String+editModeTag		= "editMode"++-- | Used to qualify XML.+forceModeTag :: String+forceModeTag		= "forceMode"++-- | Used to qualify XML.+pausedTag :: String+pausedTag		= "pause"++-- | Used to qualify XML.+ponderModeTag :: String+ponderModeTag		= "ponderMode"++-- | Used to qualify XML.+postModeTag :: String+postModeTag		= "postMode"++-- | Used to qualify XML.+protocolVersionTag :: String+protocolVersionTag	= "protocolVersion"++-- | Self-documentation.+type Mode	= Bool++-- | Self-documentation.+type ProtocolVersion	= Int++-- | Defines options related to CECP.+data CECPOptions	= MkCECPOptions {+	getAnalyseMode		:: Mode,					-- ^ TODO.+	getDisplaySAN		:: Bool,					-- ^ Whether to display moves in SAN or 'Input.UIOptions.getMoveNotation'.+	getEditMode		:: Mode,					-- ^ Whether the game should be placed in set-up mode.+	getForceMode		:: Mode,					-- ^ Neither player's moves are automated, allowing an arbitrary game to be configured.+	getMaybePaused		:: Maybe Data.Time.Clock.NominalDiffTime,	-- ^ Whether the engine was paused after the specified time.+	getPonderMode		:: Mode,					-- ^ Whether to keep thinking while it's one's opponent's turn.+	getPostMode		:: Mode,					-- ^ Whether to show the details of deliberations.+	getProtocolVersion	:: ProtocolVersion,				-- ^ The version of the CECP-protocol to use.+	getCECPFeatures		:: Input.CECPFeatures.CECPFeatures+} deriving Eq++instance Control.DeepSeq.NFData CECPOptions where+	rnf MkCECPOptions {+		getAnalyseMode		= analyseMode,+		getDisplaySAN		= displaySAN,+		getEditMode		= editMode,+		getForceMode		= forceMode,+		getMaybePaused		= maybePaused,+		getPonderMode		= ponderMode,+		getPostMode		= postMode,+		getProtocolVersion	= protocolVersion,+		getCECPFeatures		= cecpFeatures+	} = Control.DeepSeq.rnf (analyseMode, displaySAN, editMode, forceMode, maybePaused, ponderMode, postMode, protocolVersion, cecpFeatures)++instance Show CECPOptions where+	showsPrec _ MkCECPOptions {+		getAnalyseMode		= analyseMode,+		getDisplaySAN		= displaySAN,+		getEditMode		= editMode,+		getForceMode		= forceMode,+		getMaybePaused		= maybePaused,+		getPonderMode		= ponderMode,+		getPostMode		= postMode,+		getProtocolVersion	= protocolVersion,+		getCECPFeatures		= cecpFeatures+	} = Text.ShowList.showsAssociationList' [+		(+			analyseModeTag,+			shows analyseMode+		), (+			displaySANTag,+			shows displaySAN+		), (+			editModeTag,+			shows editMode+		), (+			forceModeTag,+			shows forceMode+		), (+			pausedTag,+			shows maybePaused+		), (+			ponderModeTag,+			shows ponderMode+		), (+			postModeTag,+			shows postMode+		), (+			protocolVersionTag,+			shows protocolVersion+		), (+			Input.CECPFeatures.tag,+			showChar '{' . shows cecpFeatures . showChar '}'+		)+	 ]++instance Data.Default.Default CECPOptions where+	def = MkCECPOptions {+		getAnalyseMode		= False,+		getEditMode		= False,+		getDisplaySAN		= True,+		getForceMode		= False,+		getMaybePaused		= Nothing,+		getPonderMode		= False,+		getPostMode		= False,+		getProtocolVersion	= 1,+		getCECPFeatures		= Data.Default.def+	}++instance HXT.XmlPickler CECPOptions where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i) -> mkCECPOptions a b c d e f g h i,	-- Construct.+		\MkCECPOptions {+			getAnalyseMode		= analyseMode,+			getDisplaySAN		= displaySAN,+			getEditMode		= editMode,+			getForceMode		= forceMode,+			getMaybePaused		= maybePaused,+			getPonderMode		= ponderMode,+			getPostMode		= postMode,+			getProtocolVersion	= protocolVersion,+			getCECPFeatures		= cecpFeatures+		} -> (analyseMode, displaySAN, editMode, forceMode, maybePaused, ponderMode, postMode, protocolVersion, cecpFeatures) -- Deconstruct.+	 ) $ HXT.xp9Tuple (+		getAnalyseMode def `HXT.xpDefault` HXT.xpAttr analyseModeTag HXT.xpickle+	 ) (+		getDisplaySAN def `HXT.xpDefault` HXT.xpAttr displaySANTag HXT.xpickle+	 ) (+		getEditMode def `HXT.xpDefault` HXT.xpAttr editModeTag HXT.xpickle+	 ) (+		getForceMode def `HXT.xpDefault` HXT.xpAttr forceModeTag HXT.xpickle+	 ) (+		HXT.xpOption . HXT.xpWrap (toEnum, fromEnum) $ HXT.xpAttr pausedTag HXT.xpInt+	 ) (+		getPonderMode def `HXT.xpDefault` HXT.xpAttr ponderModeTag HXT.xpickle+	 ) (+		getPostMode def `HXT.xpDefault` HXT.xpAttr postModeTag HXT.xpickle+	 ) (+		getProtocolVersion def `HXT.xpDefault` HXT.xpAttr protocolVersionTag HXT.xpickle+	 ) HXT.xpickle {-CECPFeatures-} where+		def	= Data.Default.def++-- | Smart constructor.+mkCECPOptions+	:: Mode						-- ^ Analyse-mode.+	-> Bool						-- ^ Display SAN.+	-> Mode						-- ^ Edit-mode.+	-> Mode						-- ^ Force-mode.+	-> Maybe Data.Time.Clock.NominalDiffTime	-- ^ Paused.+	-> Mode						-- ^ Ponder-mode.+	-> Mode						-- ^ Post-mode.+	-> ProtocolVersion+	-> Input.CECPFeatures.CECPFeatures+	-> CECPOptions+mkCECPOptions analyseMode displaySAN editMode forceMode maybePaused ponderMode postMode protocolVersion cecpFeatures+	| protocolVersion < 1				= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.UI.CECPOptions.mkCECPOptions:\t" $ shows protocolVersionTag " must exceed zero."+	| Data.Maybe.maybe False (< 0) maybePaused	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.UI.CECPOptions.mkCECPOptions:\t" $ shows pausedTag "; time already taken can't be negative."+	| otherwise					= MkCECPOptions {+		getAnalyseMode		= analyseMode,+		getEditMode		= editMode,+		getDisplaySAN		= displaySAN,+		getForceMode		= forceMode,+		getMaybePaused		= maybePaused,+		getPonderMode		= ponderMode,+		getPostMode		= postMode,+		getProtocolVersion	= protocolVersion,+		getCECPFeatures		= cecpFeatures+	}++-- | Self-documentation.+type Transformation	= CECPOptions -> CECPOptions++-- | Mutator.+setProtocolVersion :: ProtocolVersion -> Transformation+setProtocolVersion protocolVersion cecpOptions+	| protocolVersion < 1	= Control.Exception.throw $ Data.Exception.mkOutOfBounds . showString "BishBosh.UI.CECPOptions.setProtocolVersion:\t" $ shows protocolVersion " must exceed zero."+	| otherwise		= cecpOptions {+		getProtocolVersion	= protocolVersion+	}++-- | Mutator.+updateFeature :: Input.CECPFeatures.Feature -> Transformation+updateFeature feature cecpOptions@MkCECPOptions { getCECPFeatures = cecpFeatures }	= cecpOptions {+	getCECPFeatures	= Input.CECPFeatures.updateFeature feature cecpFeatures+}++-- | Mutator.+deleteFeature :: Input.CECPFeatures.Feature -> Transformation+deleteFeature feature cecpOptions@MkCECPOptions { getCECPFeatures = cecpFeatures }	= cecpOptions {+	getCECPFeatures	= Input.CECPFeatures.deleteFeature feature cecpFeatures+}++-- | Reset all modes but leave the remaining fields unaltered.+resetModes :: Transformation+resetModes cecpOptions	= cecpOptions {+	getAnalyseMode	= False,+	getEditMode	= False,+	getForceMode	= False,+	getMaybePaused	= Nothing,+	getPonderMode	= False,+	getPostMode	= False+}++-- | Get an association-list of named modes.+getNamedModes :: CECPOptions -> [(String, Mode)]+getNamedModes MkCECPOptions {+	getAnalyseMode	= analyseMode,+	getEditMode	= editMode,+	getForceMode	= forceMode,+	getMaybePaused	= maybePaused,+	getPonderMode	= ponderMode,+	getPostMode	= postMode+} = [+	(+		analyseModeTag,+		analyseMode+	), (+		editModeTag,+		editMode+	), (+		forceModeTag,+		forceMode+	), (+		pausedTag,+		Data.Maybe.isJust maybePaused+	), (+		ponderModeTag,+		ponderMode+	), (+		postModeTag,+		postMode+	)+ ]+
+ src-lib/BishBosh/Input/CriteriaWeights.hs view
@@ -0,0 +1,432 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the weight associated with each criterion.+-}++module BishBosh.Input.CriteriaWeights(+-- * Types+-- ** Type-synonyms+--	Transformation,+-- ** Data-types+	CriteriaWeights(+--		MkCriteriaWeights,+		getWeightOfMaterial,+		getWeightOfMobility,+		getWeightOfPieceSquareValue,+		getWeightOfCastlingPotential,+		getWeightOfDefence,+		getWeightOfDoubledPawns,+		getWeightOfIsolatedPawns,+		getWeightOfPassedPawns+	),+-- * Constants+	tag,+	weightOfMaterialTag,+--	weightOfMobilityTag,+	weightOfPieceSquareValueTag,+--	weightOfCastlingPotentialTag,+--	weightOfDefenceTag,+--	weightOfDoubledPawnsTag,+--	weightOfIsolatedPawnsTag,+--	weightOfPassedPawnsTag,+	onymousOperators,+-- * Functions+	calculateWeightedMean,+	normalise,+	perturbWeights,+-- ** Constructor+	mkCriteriaWeights+) where++import qualified	BishBosh.Attribute.CriterionValue			as Attribute.CriterionValue+import qualified	BishBosh.Attribute.CriterionWeight			as Attribute.CriterionWeight+import qualified	BishBosh.Attribute.WeightedMeanAndCriterionValues	as Attribute.WeightedMeanAndCriterionValues+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Property.ShowFloat				as Property.ShowFloat+import qualified	BishBosh.Text.ShowList					as Text.ShowList+import qualified	BishBosh.Types						as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	System.Random+import qualified	Text.XML.HXT.Arrow.Pickle				as HXT++-- | Used to qualify the XML.+tag :: String+tag					= "criteriaWeights"++-- | Used to qualify the XML.+weightOfMaterialTag :: String+weightOfMaterialTag			= "material"++-- | Used to qualify the XML.+weightOfMobilityTag :: String+weightOfMobilityTag			= "mobility"++-- | Used to qualify the XML.+weightOfPieceSquareValueTag :: String+weightOfPieceSquareValueTag		= "pieceSquareValue"++-- | Used to qualify the XML.+weightOfCastlingPotentialTag :: String+weightOfCastlingPotentialTag		= "castlingPotential"++-- | Used to qualify the XML.+weightOfDefenceTag :: String+weightOfDefenceTag			= "defence"++-- | Used to qualify the XML.+weightOfDoubledPawnsTag :: String+weightOfDoubledPawnsTag			= "doubledPawns"++-- | Used to qualify the XML.+weightOfIsolatedPawnsTag :: String+weightOfIsolatedPawnsTag		= "isolatedPawns"++-- | Used to qualify the XML.+weightOfPassedPawnsTag :: String+weightOfPassedPawnsTag			= "passedPawns"++{- |+	* The weight of various criteria used to select a move from alternatives, at specific point in the game.++	* CAVEAT: these weights determine the effective value of /isolated/ or /doubled/ @Pawn@s,+	& this value shouldn't be less than their weighted normalised /rank-value/, otherwise sacrifice would be beneficial.+-}+data CriteriaWeights criterionWeight	= MkCriteriaWeights {+	getWeightOfMaterial		:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference between the total /rank-value/ of the /piece/s currently in play on either side; <https://chessprogramming.wikispaces.com/Material>.+	getWeightOfMobility		:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference between the reciprocal of the number of destinations available to the /piece/s of either side. N.B. this weight can be derived from 'getWeightOfMaterial' since losing a @Queen@ is less significant than reducing mobility to zero; <https://chessprogramming.wikispaces.com/Mobility>.+	getWeightOfPieceSquareValue	:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference in the values of the squares occupied by the pieces of either side.+	getWeightOfCastlingPotential	:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ Whether each player has been permanently prevented from /Castling/.+	getWeightOfDefence		:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference between the number of /piece/s defending each of one's own, compared with the opponent.+	getWeightOfDoubledPawns		:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference between the total number of /doubled/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Doubled+Pawn>.+	getWeightOfIsolatedPawns	:: Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- ^ The arithmetic difference between the total number of /isolated/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Isolated+Pawn>.+	getWeightOfPassedPawns		:: Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ The arithmetic difference between the total number of /passed/ @Pawn@s on either side; <https://chessprogramming.wikispaces.com/Passed+Pawn>.+} deriving (Eq, Show)++-- | Smart-constructor.+mkCriteriaWeights+	:: (Eq criterionWeight, Num criterionWeight)+	=> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /material/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /mobility/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /pieceSquareValue/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /castlingPotential/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /defence/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /doubledPawns/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /isolatedPawns/.+	-> Attribute.CriterionWeight.CriterionWeight criterionWeight	-- ^ /passedPawns/.+	-> CriteriaWeights criterionWeight+mkCriteriaWeights a b c d e f g h+	| criteriaWeights == minBound	= Control.Exception.throw $ Data.Exception.mkInvalidDatum "BishBosh.Input.CriteriaWeights.mkCriteriaWeights:\tall weights are zero."+	| otherwise			= criteriaWeights+	where+		criteriaWeights	= MkCriteriaWeights a b c d e f g h++instance Real criterionWeight => Property.ShowFloat.ShowFloat (CriteriaWeights criterionWeight) where+	showsFloat fromDouble MkCriteriaWeights {+		getWeightOfMaterial		= weightOfMaterial,+		getWeightOfMobility		= weightOfMobility,+		getWeightOfPieceSquareValue	= weightOfPieceSquareValue,+		getWeightOfCastlingPotential	= weightOfCastlingPotential,+		getWeightOfDefence		= weightOfDefence,+		getWeightOfDoubledPawns		= weightOfDoubledPawns,+		getWeightOfIsolatedPawns	= weightOfIsolatedPawns,+		getWeightOfPassedPawns		= weightOfPassedPawns+	} = Text.ShowList.showsAssociationList' $ map (+		Control.Arrow.second $ fromDouble . realToFrac . Attribute.CriterionWeight.deconstruct+	 ) [+		(+			weightOfMaterialTag,		weightOfMaterial+		), (+			weightOfMobilityTag,		weightOfMobility+		), (+			weightOfPieceSquareValueTag,	weightOfPieceSquareValue+		), (+			weightOfCastlingPotentialTag,	weightOfCastlingPotential+		), (+			weightOfDefenceTag,		weightOfDefence+		), (+			weightOfDoubledPawnsTag,	weightOfDoubledPawns+		), (+			weightOfIsolatedPawnsTag,	weightOfIsolatedPawns+		), (+			weightOfPassedPawnsTag,		weightOfPassedPawns+		)+	 ]++instance Num criterionWeight => Data.Default.Default (CriteriaWeights criterionWeight) where+	def = MkCriteriaWeights {+		getWeightOfMaterial		= maxBound,+		getWeightOfMobility		= Data.Default.def,+		getWeightOfPieceSquareValue	= Data.Default.def,+		getWeightOfCastlingPotential	= Data.Default.def,+		getWeightOfDefence		= Data.Default.def,+		getWeightOfDoubledPawns		= Data.Default.def,+		getWeightOfIsolatedPawns	= Data.Default.def,+		getWeightOfPassedPawns		= Data.Default.def+	}++instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (CriteriaWeights criterionWeight) where+	rnf (MkCriteriaWeights a b c d e f g h)	= Control.DeepSeq.rnf [a, b, c, d, e, f, g, h]++instance Num criterionWeight => Bounded (CriteriaWeights criterionWeight) where+	maxBound	= MkCriteriaWeights maxBound maxBound maxBound maxBound maxBound maxBound maxBound maxBound+	minBound	= MkCriteriaWeights minBound minBound minBound minBound minBound minBound minBound minBound++instance (+	HXT.XmlPickler	criterionWeight,+	Num		criterionWeight,+	Ord		criterionWeight,+	Show		criterionWeight+ ) => HXT.XmlPickler (CriteriaWeights criterionWeight) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag $ HXT.xpWrap (+		\(a, b, c, d, e, f, g, h) -> mkCriteriaWeights a b c d e f g h,	-- Construct.+		\MkCriteriaWeights {+			getWeightOfMaterial		= weightOfMaterial,+			getWeightOfMobility		= weightOfMobility,+			getWeightOfPieceSquareValue	= weightOfPieceSquareValue,+			getWeightOfCastlingPotential	= weightOfCastlingPotential,+			getWeightOfDefence		= weightOfDefence,+			getWeightOfDoubledPawns		= weightOfDoubledPawns,+			getWeightOfIsolatedPawns	= weightOfIsolatedPawns,+			getWeightOfPassedPawns		= weightOfPassedPawns+		} -> (+			weightOfMaterial,+			weightOfMobility,+			weightOfPieceSquareValue,+			weightOfCastlingPotential,+			weightOfDefence,+			weightOfDoubledPawns,+			weightOfIsolatedPawns,+			weightOfPassedPawns+		) -- Deconstruct.+	 ) $ HXT.xp8Tuple (+		xpickle' weightOfMaterialTag+	 ) (+		xpickle' weightOfMobilityTag+	 ) (+		xpickle' weightOfPieceSquareValueTag+	 ) (+		xpickle' weightOfCastlingPotentialTag+	 ) (+		xpickle' weightOfDefenceTag+	 ) (+		xpickle' weightOfDoubledPawnsTag+	 ) (+		xpickle' weightOfIsolatedPawnsTag+	 ) (+		xpickle' weightOfPassedPawnsTag+	 ) where+		xpickle'	= HXT.xpDefault Data.Default.def . (`HXT.xpAttr` HXT.xpickle)++{- |+	* Returns the weighted sum of the specified criteria, divided by the sum of the weights; <https://chessprogramming.wikispaces.com/evaluation>++	* Each criterion increases in proportion to some desirable attribute of the proposed /game/.++	* Each criterion should be in the same range of magnitudes, so that none dominates the total, thus making the total a clear measure of the value attributed to each.++	* Also writes individual unweighted /criterion-value/s, to facilitate post-analysis; if the corresponding weight is zero, for efficiency evaluation of the criterion is avoided.+-}+calculateWeightedMean :: (+	Fractional	weightedMean,+	Real		criterionValue,+	Real		criterionWeight+ )+	=> CriteriaWeights criterionWeight+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /material/:	maximum if a player's /move/ equals the maximum total piece value (including /queened/ @Pawn@s), while their opponent has just a @King@.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /mobility/:	maximum when the opponent is check-mated.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /pieceSquareValue/:	maximum when this player occupies all the strategically important squares & the opponent none.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /castlingPotential/:	maximum when this player either has /castled/ or can, but the opponent has been permanently prevented.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /defence/:	maximum when this player's /piece/s are fully utilised in defence, but none of the opponent's are.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /doubledPawns/:	maximum when this player hasn't any /doubled/ @Pawn@s & the opponent has two files of four @Pawn@s.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /isolatedPawns/:	maximum when this player hasn't any /isolated/ @Pawn@s & all the opponent's @Pawn@s are /isolated/.+	-> Attribute.CriterionValue.CriterionValue criterionValue						-- ^ /passedPawns/:	maximum when this player has 8 /passed/ @Pawn@s & the opponent has none.+	-> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue	-- ^ The individual /criteria/ values, & their /weighted mean/.+{-# SPECIALISE calculateWeightedMean+	:: CriteriaWeights T.CriterionWeight+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.CriterionValue.CriterionValue T.CriterionValue+	-> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues T.WeightedMean T.CriterionValue+ #-}+calculateWeightedMean MkCriteriaWeights {+	getWeightOfMaterial		= weightOfMaterial,+	getWeightOfMobility		= weightOfMobility,+	getWeightOfPieceSquareValue	= weightOfPieceSquareValue,+	getWeightOfCastlingPotential	= weightOfCastlingPotential,+	getWeightOfDefence		= weightOfDefence,+	getWeightOfDoubledPawns		= weightOfDoubledPawns,+	getWeightOfIsolatedPawns	= weightOfIsolatedPawns,+	getWeightOfPassedPawns		= weightOfPassedPawns+} material mobility pieceSquareValue castlingPotential defence doubledPawns isolatedPawns passedPawns	= Attribute.CriterionValue.calculateWeightedMean [+	(+		material,		weightOfMaterial+	), (+		mobility,		weightOfMobility+	), (+		pieceSquareValue,	weightOfPieceSquareValue+	), (+		castlingPotential,	weightOfCastlingPotential+	), (+		defence,		weightOfDefence+	), (+		doubledPawns,		weightOfDoubledPawns+	), (+		isolatedPawns,		weightOfIsolatedPawns+	), (+		passedPawns,		weightOfPassedPawns+	)+ ]++-- | The type of a function which mutates 'CriteriaWeights'.+type Transformation criterionWeight	= CriteriaWeights criterionWeight -> CriteriaWeights criterionWeight++-- | Adjust the mean weight, so that the maximum weight is @1@.+normalise :: (+	Fractional	criterionWeight,+	Ord		criterionWeight,+	Show		criterionWeight+ ) => Transformation criterionWeight+normalise criteriaWeights@MkCriteriaWeights {+	getWeightOfMaterial		= weightOfMaterial,+	getWeightOfMobility		= weightOfMobility,+	getWeightOfPieceSquareValue	= weightOfPieceSquareValue,+	getWeightOfCastlingPotential	= weightOfCastlingPotential,+	getWeightOfDefence		= weightOfDefence,+	getWeightOfDoubledPawns		= weightOfDoubledPawns,+	getWeightOfIsolatedPawns	= weightOfIsolatedPawns,+	getWeightOfPassedPawns		= weightOfPassedPawns+} = Control.Exception.assert (+	criteriaWeights /= minBound	-- Guard against divide-by-zero.+ ) MkCriteriaWeights {+	getWeightOfMaterial		= normaliseCriterionWeight weightOfMaterial,+	getWeightOfMobility		= normaliseCriterionWeight weightOfMobility,+	getWeightOfPieceSquareValue	= normaliseCriterionWeight weightOfPieceSquareValue,+	getWeightOfCastlingPotential	= normaliseCriterionWeight weightOfCastlingPotential,+	getWeightOfDefence		= normaliseCriterionWeight weightOfDefence,+	getWeightOfDoubledPawns		= normaliseCriterionWeight weightOfDoubledPawns,+	getWeightOfIsolatedPawns	= normaliseCriterionWeight weightOfIsolatedPawns,+	getWeightOfPassedPawns		= normaliseCriterionWeight weightOfPassedPawns+ } where+	normaliseCriterionWeight	= Attribute.CriterionWeight.mkCriterionWeight . (+		/ Attribute.CriterionWeight.deconstruct (+			maximum [+				weightOfMaterial,+				weightOfMobility,+				weightOfPieceSquareValue,+				weightOfCastlingPotential,+				weightOfDefence,+				weightOfDoubledPawns,+				weightOfIsolatedPawns,+				weightOfPassedPawns+			]+		)+	 ) . Attribute.CriterionWeight.deconstruct++{- |+	* Independently perturbs each /criterion-weight/ by a random value, of configurable magnitude.++	* Under this transformation, /criterion-weight/s of @0@, will remain unchanged, thus irrelevant criteria remain irrelevant.+-}+perturbWeights :: (+	Fractional		criterionWeight,+	Real			criterionWeight,+	Show			criterionWeight,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> criterionWeight	-- ^ Change-magnitude.+	-> Transformation criterionWeight+perturbWeights _ 0 criteriaWeights	= criteriaWeights+perturbWeights randomGen changeMagnitude MkCriteriaWeights {+	getWeightOfMaterial		= weightOfMaterial,+	getWeightOfMobility		= weightOfMobility,+	getWeightOfPieceSquareValue	= weightOfPieceSquareValue,+	getWeightOfCastlingPotential	= weightOfCastlingPotential,+	getWeightOfDefence		= weightOfDefence,+	getWeightOfDoubledPawns		= weightOfDoubledPawns,+	getWeightOfIsolatedPawns	= weightOfIsolatedPawns,+	getWeightOfPassedPawns		= weightOfPassedPawns+} = Control.Exception.assert (changeMagnitude > 0) $ normalise MkCriteriaWeights {+	getWeightOfMaterial		= reduceBy a weightOfMaterial,+	getWeightOfMobility		= reduceBy b weightOfMobility,+	getWeightOfPieceSquareValue	= reduceBy c weightOfPieceSquareValue,+	getWeightOfCastlingPotential	= reduceBy d weightOfCastlingPotential,+	getWeightOfDefence		= reduceBy e weightOfDefence,+	getWeightOfDoubledPawns		= reduceBy f weightOfDoubledPawns,+	getWeightOfIsolatedPawns	= reduceBy g weightOfIsolatedPawns,+	getWeightOfPassedPawns		= reduceBy h weightOfPassedPawns+} where+	(a : b : c : d : e : f : g : h : _)	= System.Random.randomRs (1 :: Double, succ $ realToFrac changeMagnitude) randomGen+	reduceBy randomValue			= Attribute.CriterionWeight.mkCriterionWeight . (/ realToFrac randomValue) . Attribute.CriterionWeight.deconstruct	-- N.B. this always reduces the weight, leaving 'normalise' to correct this.++-- | A list of named accessors & mutators.+onymousOperators :: [+	(+		String,												-- Tag.+		CriteriaWeights criterionWeight -> Attribute.CriterionWeight.CriterionWeight criterionWeight,	-- Accessor.+		Attribute.CriterionWeight.CriterionWeight criterionWeight -> Transformation criterionWeight	-- Mutator.+	) -- Triple.+ ]+onymousOperators	= [+	(+		weightOfMaterialTag,+		getWeightOfMaterial,+		\w criteriaWeights -> criteriaWeights { getWeightOfMaterial = w }+	), (+		weightOfMobilityTag,+		getWeightOfMobility,+		\w criteriaWeights -> criteriaWeights { getWeightOfMobility = w }+	), (+		weightOfPieceSquareValueTag,+		getWeightOfPieceSquareValue,+		\w criteriaWeights -> criteriaWeights { getWeightOfPieceSquareValue = w }+	), (+		weightOfCastlingPotentialTag,+		getWeightOfCastlingPotential,+		\w criteriaWeights -> criteriaWeights { getWeightOfCastlingPotential = w }+	), (+		weightOfDefenceTag,+		getWeightOfDefence,+		\w criteriaWeights -> criteriaWeights { getWeightOfDefence = w }+	), (+		weightOfDoubledPawnsTag,+		getWeightOfDoubledPawns,+		\w criteriaWeights -> criteriaWeights { getWeightOfDoubledPawns = w }+	), (+		weightOfIsolatedPawnsTag,+		getWeightOfIsolatedPawns,+		\w criteriaWeights -> criteriaWeights { getWeightOfIsolatedPawns = w }+	), (+		weightOfPassedPawnsTag,+		getWeightOfPassedPawns,+		\w criteriaWeights -> criteriaWeights { getWeightOfPassedPawns = w }+	)+ ]+
+ src-lib/BishBosh/Input/EvaluationOptions.hs view
@@ -0,0 +1,274 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines configurable options related to the evaluation of the game at any instance.++	* N.B.: 'evaluation' is distinct from 'search':+		evaluation => how one assesses the fitness of candidate moves;+		search => the order in which one evaluates candidates before selecting on the basis of their fitness.+-}++module BishBosh.Input.EvaluationOptions(+-- * Types+-- ** Type-synonyms+	IncrementalEvaluation,+	Reader,+-- ** Data-types+	EvaluationOptions(+--		MkEvaluationOptions,+		getRankValues,+		getCriteriaWeights,+		getIncrementalEvaluation,+--		getMaybePieceSquareTables,+		getMaybePieceSquareArray+	),+-- * Constants+	tag,+--	incrementalEvaluationTag,+--	pieceSquareTablesTag,+--	pieceSquareTableEndGameTag,+-- * Functions+-- ** Constructor+	mkEvaluationOptions+) where++import			BishBosh.Data.Bool()+import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.RankValues		as Attribute.RankValues+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Component.PieceSquareArray	as Component.PieceSquareArray+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Input.CriteriaWeights		as Input.CriteriaWeights+import qualified	BishBosh.Input.PieceSquareTable		as Input.PieceSquareTable+import qualified	BishBosh.Property.ShowFloat		as Property.ShowFloat+import qualified	BishBosh.Text.ShowList			as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Control.Monad.Reader+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT++-- | Used to qualify XML.+tag :: String+tag				= "evaluationOptions"++-- | Used to qualify XML.+incrementalEvaluationTag :: String+incrementalEvaluationTag	= "incrementalEvaluation"++-- | Used to qualify XML.+pieceSquareTablesTag :: String+pieceSquareTablesTag		= showString Input.PieceSquareTable.tag "s"++-- | Used to qualify XML.+pieceSquareTableEndGameTag :: String+pieceSquareTableEndGameTag	= showString Input.PieceSquareTable.tag "EndGame"++-- | Whether to generate position-hashes incrementally from the hash of the position prior to the last move.+type IncrementalEvaluation	= Bool++-- | Defines the options related to the automatic selection of /move/s.+data EvaluationOptions criterionWeight pieceSquareValue rankValue x y	= MkEvaluationOptions {+	getRankValues			:: Attribute.RankValues.RankValues rankValue,			-- ^ The static value associated with each /piece/'s /rank/.+	getCriteriaWeights		:: Input.CriteriaWeights.CriteriaWeights criterionWeight,	-- ^ The weights applied to each of the heterogeneous criterion-values used to select a /move/.+	getIncrementalEvaluation	:: IncrementalEvaluation,					-- ^ Whether to generate position-hashes & evaluate the piece-square value, from the previous value or from scratch.+	getMaybePieceSquareTables	:: Maybe (+		Input.PieceSquareTable.PieceSquareTable x y pieceSquareValue,+		Input.PieceSquareTable.PieceSquareTable x y pieceSquareValue+	),												-- ^ Optional piece-square tables; the first governs normal play & the second governs the end-game.+	getMaybePieceSquareArray	:: Maybe (+		Component.PieceSquareArray.PieceSquareArray x y pieceSquareValue+	)												-- ^ The optional value for each type of /piece/ of occupying each coordinate, at each stage in the lifetime of the game.+} deriving (Eq, Show)++instance (+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (EvaluationOptions criterionWeight pieceSquareValue rankValue x y) where+	rnf MkEvaluationOptions {+		getRankValues			= rankValues,+		getCriteriaWeights		= criteriaWeights,+		getIncrementalEvaluation	= incrementalEvaluation,+--		getMaybePieceSquareTables	= maybePieceSquareTables,+		getMaybePieceSquareArray	= maybePieceSquareArray+	} = Control.DeepSeq.rnf (rankValues, criteriaWeights, incrementalEvaluation, maybePieceSquareArray)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Real	criterionWeight,+	Real	pieceSquareValue,+	Real	rankValue,+	Show	pieceSquareValue+ ) => Property.ShowFloat.ShowFloat (EvaluationOptions criterionWeight pieceSquareValue rankValue x y) where+	showsFloat fromDouble MkEvaluationOptions {+		getRankValues			= rankValues,+		getCriteriaWeights		= criteriaWeights,+		getIncrementalEvaluation	= incrementalEvaluation,+		getMaybePieceSquareTables	= maybePieceSquareTables+--		getMaybePieceSquareArray	= maybePieceSquareArray+	} = Text.ShowList.showsAssociationList' $ [+		(+			Attribute.RankValues.tag,	Property.ShowFloat.showsFloat fromDouble rankValues+		), (+			incrementalEvaluationTag,	shows incrementalEvaluation+		), (+			Input.CriteriaWeights.tag,	Property.ShowFloat.showsFloat fromDouble criteriaWeights+		)+	 ] ++ Data.Maybe.maybe [] (+		\(t, t')	-> [+			(+				Input.PieceSquareTable.tag,+				Property.ShowFloat.showsFloat fromDouble t+			), (+				pieceSquareTableEndGameTag,+				Property.ShowFloat.showsFloat fromDouble t'+			)+		]+	 ) maybePieceSquareTables++instance (+	Fractional	rankValue,+	Num		criterionWeight,+	Ord		rankValue,+	Show		rankValue+ ) => Data.Default.Default (EvaluationOptions criterionWeight pieceSquareValue rankValue x y) where+	def = MkEvaluationOptions {+		getRankValues			= Data.Default.def,+		getCriteriaWeights		= Data.Default.def,+		getIncrementalEvaluation	= True,+		getMaybePieceSquareTables	= Nothing,+		getMaybePieceSquareArray	= Nothing+	}++instance (+	Enum		x,+	Enum		y,+	Fractional	pieceSquareValue,+	Fractional	rankValue,+	HXT.XmlPickler	criterionWeight,+	HXT.XmlPickler	rankValue,+	Num		criterionWeight,+	Ord		criterionWeight,+	Ord		pieceSquareValue,+	Ord		rankValue,+	Ord		x,+	Ord		y,+	Real		pieceSquareValue,+	Show		pieceSquareValue,+	Show		criterionWeight,+	Show		rankValue+ ) => HXT.XmlPickler (EvaluationOptions criterionWeight pieceSquareValue rankValue x y) where+	xpickle	= HXT.xpDefault def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d) -> mkEvaluationOptions a b c d,	-- Construct.+		\MkEvaluationOptions {+			getRankValues			= rankValues,+			getCriteriaWeights		= criteriaWeights,+			getIncrementalEvaluation	= incrementalEvaluation,+			getMaybePieceSquareTables	= maybePieceSquareTables+--			getMaybePieceSquareArray	= maybePieceSquareArray+		} -> (+			rankValues,+			criteriaWeights,+			incrementalEvaluation,+			maybePieceSquareTables+		) -- Deconstruct.+	 ) . HXT.xp4Tuple HXT.xpickle {-RankValues-} HXT.xpickle {-CriteriaWeights-} (+		getIncrementalEvaluation def `HXT.xpDefault` HXT.xpAttr incrementalEvaluationTag HXT.xpickle {-Bool-}+	 ) . HXT.xpOption . HXT.xpElem pieceSquareTablesTag $ HXT.xpElem Input.PieceSquareTable.tag HXT.xpickle `HXT.xpPair` HXT.xpElem pieceSquareTableEndGameTag HXT.xpickle where+		def	= Data.Default.def++-- | Smart constructor.+mkEvaluationOptions :: (+	Enum		x,+	Enum		y,+	Eq		pieceSquareValue,+	Eq		criterionWeight,+	Fractional	pieceSquareValue,+	Num		criterionWeight,+	Ord		x,+	Ord		y+ )+	=> Attribute.RankValues.RankValues rankValue												-- ^ The static value associated with each /piece/'s /rank/.+	-> Input.CriteriaWeights.CriteriaWeights criterionWeight										-- ^ The weights applied to the values of the criteria used to select a /move/.+	-> IncrementalEvaluation+	-> Maybe (Input.PieceSquareTable.PieceSquareTable x y pieceSquareValue, Input.PieceSquareTable.PieceSquareTable x y pieceSquareValue)	-- ^ The value to each type of piece, of each square, during normal play & the end-game.+	-> EvaluationOptions criterionWeight pieceSquareValue rankValue x y+mkEvaluationOptions rankValues criteriaWeights incrementalEvaluation maybePieceSquareTables+	| Just (pieceSquareTable, _)	<- maybePieceSquareTables+	, let undefinedRanks	= Input.PieceSquareTable.findUndefinedRanks pieceSquareTable+	, not $ Data.Set.null undefinedRanks+	= Control.Exception.throw . Data.Exception.mkInsufficientData . showString "BishBosh.Input.EvaluationOptions.mkEvaluationOptions:\tranks" . Text.ShowList.showsAssociation $ shows (Data.Set.toList undefinedRanks) " are undefined."+	| Input.CriteriaWeights.getWeightOfPieceSquareValue criteriaWeights /= minBound+	, Data.Maybe.isNothing maybePieceSquareTables+	= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Input.EvaluationOptions.mkEvaluationOptions:\tweight of " . shows Input.CriteriaWeights.weightOfPieceSquareValueTag . showString " is defined but " $ shows Input.PieceSquareTable.tag " isn't."+	| otherwise		= MkEvaluationOptions {+		getRankValues			= rankValues,+		getCriteriaWeights		= criteriaWeights,+		getIncrementalEvaluation	= incrementalEvaluation,+		getMaybePieceSquareTables	= maybePieceSquareTables,+		getMaybePieceSquareArray	= (+			\pieceSquareTablePair -> Component.PieceSquareArray.mkPieceSquareArray (+				\rank -> Cartesian.Coordinates.listArrayByCoordinates . (+					\(normal, maybeEndGame) -> Data.Maybe.maybe (+						map Left normal+					) (+						zipWith interpolatePieceSquareValues normal+					) maybeEndGame+				) $ (+					 Data.Maybe.fromJust . Input.PieceSquareTable.dereference rank *** Input.PieceSquareTable.dereference rank+				) pieceSquareTablePair+			)+		) `fmap` maybePieceSquareTables+	} where+		nPiecesBounds@(minNPieces, maxNPieces)	= (3 {-minimum sufficient material-}, Attribute.LogicalColour.nDistinctLogicalColours * Component.Piece.nPiecesPerSide)++		interpolatePieceSquareValues :: (+			Eq		pieceSquareValue,+			Fractional	pieceSquareValue+		 ) => pieceSquareValue -> pieceSquareValue -> Component.PieceSquareArray.InterpolatedPieceSquareValues pieceSquareValue+		interpolatePieceSquareValues normal endGame+			| endGame /= normal	= Right . Data.Array.IArray.listArray nPiecesBounds . map (+				uncurry (+) . (+					(* normal) &&& (* endGame) . (1 -)+				) . (+					/ fromIntegral (+						maxNPieces - minNPieces+					) -- Normalise into the closed unit-interval [0,1].+				) . fromIntegral . subtract minNPieces+			) $ uncurry enumFromTo nPiecesBounds+			| otherwise		= Left normal	-- Interpolation is unnecessary.++-- | Self-documentation.+type Reader criterionWeight pieceSquareValue rankValue x y	= Control.Monad.Reader.Reader (EvaluationOptions criterionWeight pieceSquareValue rankValue x y)+
+ src-lib/BishBosh/Input/IOOptions.hs view
@@ -0,0 +1,271 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines configurable options related to I/O.+-}++module BishBosh.Input.IOOptions(+-- * Types+-- ** Type-synonyms+--	Transformation,+	MaximumPGNNames,+-- ** Data-types+	IOOptions(+--		MkIOOptions,+		getMaybeOutputConfigFilePath,+		getMaybeMaximumPGNNames,+		getPGNOptionsList,+		getMaybePersistence,+		getUIOptions+	),+-- * Constants+	tag,+	outputConfigFilePathTag,+--	maximumPGNNamesTag,+--	persistenceTag,+--	filePathTag,+--	automaticTag,+-- * Functions+-- ** Constructor+	mkIOOptions,+-- ** Mutators+	setMaybeOutputConfigFilePath,+	setEitherNativeUIOrCECPOptions,+	setMaybePrintMoveTree,+	updateCECPFeature,+	deleteCECPFeature,+	setVerbosity+) where++import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Input.CECPFeatures	as Input.CECPFeatures+import qualified	BishBosh.Input.PGNOptions	as Input.PGNOptions+import qualified	BishBosh.Input.UIOptions	as Input.UIOptions+import qualified	BishBosh.Property.Tree		as Property.Tree+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Distribution.Verbosity+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.Data.Foldable++-- | Used to qualify XML.+tag :: String+tag			= "ioOptions"++-- | Used to qualify XML.+maximumPGNNamesTag :: String+maximumPGNNamesTag	= "maximumPGNNames"++-- | Used to qualify XML.+outputConfigFilePathTag :: String+outputConfigFilePathTag	= "outputConfigFilePath"++-- | Used to qualify XML.+persistenceTag :: String+persistenceTag		= "persistence"++-- | Used to qualify XML.+filePathTag :: String+filePathTag		= "filePath"++-- | Used to qualify XML.+automaticTag :: String+automaticTag		= "automatic"++-- | The maximum number names, of matching games from the PGN-database, to display.+type MaximumPGNNames	= Int++-- | Defines options related to i/o.+data IOOptions row column	= MkIOOptions {+	getMaybeOutputConfigFilePath	:: Maybe System.FilePath.FilePath,		-- ^ An optional path to a file, into which the unprocessed configuration, formatted as XML, should be written (obliterating any existing file-contents).+	getMaybeMaximumPGNNames		:: Maybe MaximumPGNNames,			-- ^ The maximum number names, of matching games from the PGN-database, to display; @Nothing@ implies no maximum.+	getPGNOptionsList		:: [Input.PGNOptions.PGNOptions],		-- ^ How to construct PGN-databases.+	getMaybePersistence		:: Maybe (System.FilePath.FilePath, Bool),	-- ^ Optional path to a file, into which game-state can be persisted (obliterating any existing content), & whether to save this state automatically after each move.+	getUIOptions			:: Input.UIOptions.UIOptions row column		-- ^ Options which define the user-interface.+} deriving Eq++instance (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row+ ) => Control.DeepSeq.NFData (IOOptions row column) where+	rnf MkIOOptions {+		getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+		getMaybeMaximumPGNNames		= maybeMaximumPGNNames,+		getPGNOptionsList		= pgnOptionsList,+		getMaybePersistence		= maybePersistence,+		getUIOptions			= uiOptions+	} = Control.DeepSeq.rnf (+		maybeOutputConfigFilePath,+		maybeMaximumPGNNames,+		pgnOptionsList,+		maybePersistence,+		uiOptions+	 )++instance (Show column, Show row) => Show (IOOptions row column) where+	showsPrec _ MkIOOptions {+		getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+		getMaybeMaximumPGNNames		= maybeMaximumPGNNames,+		getPGNOptionsList		= pgnOptionsList,+		getMaybePersistence		= maybePersistence,+		getUIOptions			= uiOptions+	} = Text.ShowList.showsAssociationList' . Data.Maybe.maybe id (+		(:) . (,) outputConfigFilePathTag . shows+	 ) maybeOutputConfigFilePath . Data.Maybe.maybe id (+		(:) . (,) maximumPGNNamesTag . shows+	 ) maybeMaximumPGNNames $ Data.Maybe.maybe id (+		(:) . (,) persistenceTag . shows+	 ) maybePersistence [+		(+			showString Input.PGNOptions.tag "List",+			shows pgnOptionsList+		), (+			Input.UIOptions.tag,+			shows uiOptions+		)+	 ]++instance (Num column, Num row) => Data.Default.Default (IOOptions row column) where+	def = MkIOOptions {+		getMaybeOutputConfigFilePath	= Nothing,+		getMaybeMaximumPGNNames		= Nothing,+		getPGNOptionsList		= [],+		getMaybePersistence		= Nothing,+		getUIOptions			= Data.Default.def+	}++instance (+	HXT.XmlPickler	column,+	HXT.XmlPickler	row,+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => HXT.XmlPickler (IOOptions row column) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e) -> mkIOOptions a b c d e,	-- Construct.+		\MkIOOptions {+			getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+			getMaybeMaximumPGNNames		= maybeMaximumPGNNames,+			getPGNOptionsList		= pgnOptionsList,+			getMaybePersistence		= maybePersistence,+			getUIOptions			= uiOptions+		} -> (+			maybeOutputConfigFilePath,+			maybeMaximumPGNNames,+			pgnOptionsList,+			maybePersistence,+			uiOptions+		) -- Deconstruct.+	 ) $ HXT.xp5Tuple (+		HXT.xpOption $ HXT.xpTextAttr outputConfigFilePathTag {-can't be null-}+	 ) (+		HXT.xpAttrImplied maximumPGNNamesTag HXT.xpInt+	 ) HXT.xpickle {-PGNOptions-} (+		HXT.xpOption $ HXT.xpElem persistenceTag (+			HXT.xpTextAttr filePathTag `HXT.xpPair` HXT.xpDefault True (HXT.xpAttr automaticTag HXT.xpickle {-Bool-})+		)+	 ) HXT.xpickle {-UIOptions-}++-- | Smart constructor.+mkIOOptions+	:: Maybe System.FilePath.FilePath		-- ^ An optional path to a file, into which the unprocessed configuration, formatted as XML, should be written (obliterating any existing file-contents).+	-> Maybe MaximumPGNNames			-- ^ The optional maximum number of names, of matching PGN-games, to display; @Nothing@ implies no maximum.+	-> [Input.PGNOptions.PGNOptions]		-- ^ How to find & process PGN-databases.+	-> Maybe (System.FilePath.FilePath, Bool)	-- ^ Optional path to a file, into which game-state can be persisted (obliterating any existing content), & whether to save this state automatically after each move.+	-> Input.UIOptions.UIOptions row column+	-> IOOptions row column+mkIOOptions maybeOutputConfigFilePath maybeMaximumPGNNames pgnOptionsList maybePersistence uiOptions+	| Data.Maybe.maybe False (+		not . System.FilePath.isValid {-i.e. non-null on POSIX-}+	) maybeOutputConfigFilePath		= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.IOOptions.mkIOOptions:\tinvalid " $ showString outputConfigFilePathTag "."+	| Data.Maybe.isJust maybeMaximumPGNNames+	, null pgnOptionsList			= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "Specification of " $ shows maximumPGNNamesTag " is only irrelevant when at least one PGN-database has been referenced."+	| Just maximumPGNNames	<- maybeMaximumPGNNames+	, maximumPGNNames < 0			= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "The maximum number of names, of matching PGN-games to display, can't be negative; " $ shows maximumPGNNames "."+	| not $ null duplicateFilePaths		= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.Input.IOOptions.mkIOOptions:\tduplicate " . showString Input.PGNOptions.databaseFilePathTag . Text.ShowList.showsAssociation $ shows duplicateFilePaths "."+	| Data.Maybe.maybe False (+		not . System.FilePath.isValid {-i.e. non-null on POSIX-} . fst {-file-path-}+	) maybePersistence			= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.IOOptions.mkIOOptions:\tinvalid path for " $ showString persistenceTag "."+	| otherwise	= MkIOOptions {+		getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+		getMaybeMaximumPGNNames		= maybeMaximumPGNNames,+		getPGNOptionsList		= pgnOptionsList,+		getMaybePersistence		= maybePersistence,+		getUIOptions			= uiOptions+	}+	where+		duplicateFilePaths :: [System.FilePath.FilePath]+		duplicateFilePaths	= map head . filter ((/= 1) . length) . ToolShed.Data.Foldable.gather $ map Input.PGNOptions.getDatabaseFilePath pgnOptionsList++-- | The type of a function used to transform 'IOOptions'.+type Transformation row column	= IOOptions row column -> IOOptions row column++-- | Mutator.+setMaybeOutputConfigFilePath :: Maybe System.FilePath.FilePath -> Transformation row column+setMaybeOutputConfigFilePath maybeOutputConfigFilePath ioOptions+	| Data.Maybe.maybe False (+		not . System.FilePath.isValid {-i.e. non-null on POSIX-}+	) maybeOutputConfigFilePath	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.IOOptions.setMaybeOutputConfigFilePath:\tinvalid " $ showString outputConfigFilePathTag "."+	| otherwise	= ioOptions {+		getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath+	}++-- | Mutator.+setEitherNativeUIOrCECPOptions :: Input.UIOptions.EitherNativeUIOrCECPOptions row column -> Transformation row column+setEitherNativeUIOrCECPOptions eitherNativeUIOrCECPOptions ioOptions@MkIOOptions { getUIOptions = uiOptions }	= ioOptions {+	getUIOptions	= uiOptions {+		Input.UIOptions.getEitherNativeUIOrCECPOptions	= eitherNativeUIOrCECPOptions+	}+}++-- | Mutator.+setMaybePrintMoveTree :: Maybe Property.Tree.Depth -> Transformation row column+setMaybePrintMoveTree maybePrintMoveTree ioOptions@MkIOOptions { getUIOptions = uiOptions }	= ioOptions {+	getUIOptions	= uiOptions {+		Input.UIOptions.getMaybePrintMoveTree	= maybePrintMoveTree+	}+}++-- | Mutator.+updateCECPFeature :: Input.CECPFeatures.Feature -> Transformation row column+updateCECPFeature feature ioOptions@MkIOOptions { getUIOptions = uiOptions }	= ioOptions {+	getUIOptions	= Input.UIOptions.updateCECPFeature feature uiOptions+}++-- | Mutator.+deleteCECPFeature :: Input.CECPFeatures.Feature -> Transformation row column+deleteCECPFeature feature ioOptions@MkIOOptions { getUIOptions = uiOptions }	= ioOptions {+	getUIOptions	= Input.UIOptions.deleteCECPFeature feature uiOptions+}++-- | Mutator.+setVerbosity :: Distribution.Verbosity.Verbosity -> Transformation row column+setVerbosity verbosity ioOptions@MkIOOptions { getUIOptions = uiOptions }	= ioOptions {+	getUIOptions	= uiOptions {+		Input.UIOptions.getVerbosity	= verbosity+	}+}+
+ src-lib/BishBosh/Input/NativeUIOptions.hs view
@@ -0,0 +1,157 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines options common to native interface(s).+-}++module BishBosh.Input.NativeUIOptions(+-- * Types+-- ** Type-synonyms+	ScreenCoordinates,+-- ** Data-types+	NativeUIOptions(+--		MkNativeUIOptions,+		getBoardMagnification,+		getColourScheme+	),+-- * Constants+	tag,+	boardMagnificationTag,+--	nRowsTag,+--	nColumnsTag,+-- * Functions+-- ** Constructors+	mkNativeUIOptions+) where++import			Control.Arrow((***))+import qualified	BishBosh.Attribute.ColourScheme	as Attribute.ColourScheme+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag			= "nativeUIOptions"++-- | Used to qualify XML.+boardMagnificationTag :: String+boardMagnificationTag	= "boardMagnification"++-- | Used to qualify XML.+nRowsTag :: String+nRowsTag		= "nRows"++-- | Used to qualify XML.+nColumnsTag :: String+nColumnsTag		= "nColumns"++-- | The coordinates used to index the screen.+type ScreenCoordinates row column	= (row, column)++-- | Constructor.+data NativeUIOptions row column	= MkNativeUIOptions {+	getBoardMagnification	:: ScreenCoordinates row column,	-- ^ The factor by which the dimensions of the board are stretched when displayed.+	getColourScheme		:: Attribute.ColourScheme.ColourScheme+} deriving Eq++instance (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row+ ) => Control.DeepSeq.NFData (NativeUIOptions row column) where+	rnf MkNativeUIOptions {+		getBoardMagnification	= boardMagnification,+		getColourScheme		= colourScheme+	} = Control.DeepSeq.rnf (+		boardMagnification,+		colourScheme+	 )++instance (Show row, Show column) => Show (NativeUIOptions row column) where+	showsPrec _ MkNativeUIOptions {+		getBoardMagnification	= boardMagnification,+		getColourScheme		= colourScheme+	} = Text.ShowList.showsAssociationList' [+		(+			boardMagnificationTag,+			shows boardMagnification+		), (+			Attribute.ColourScheme.tag,+			shows colourScheme+		)+	 ]++instance (Num row, Num column) => Data.Default.Default (NativeUIOptions row column) where+	def = MkNativeUIOptions {+		getBoardMagnification	= (1, 1),+		getColourScheme		= Data.Default.def+	}++instance (+	HXT.XmlPickler	column,+	HXT.XmlPickler	row,+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => HXT.XmlPickler (NativeUIOptions row column) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry mkNativeUIOptions,	-- Construct.+		\MkNativeUIOptions {+			getBoardMagnification	= boardMagnification,+			getColourScheme		= colourScheme+		} -> (+			boardMagnification,+			colourScheme+		)+	 ) $ HXT.xpPair (+		getBoardMagnification def `HXT.xpDefault` HXT.xpElem boardMagnificationTag (+			HXT.xpAttr nRowsTag HXT.xpickle `HXT.xpPair` HXT.xpAttr nColumnsTag HXT.xpickle+		)+	 ) (+		getColourScheme def `HXT.xpDefault` HXT.xpickle+	 ) where+		def	= Data.Default.def++-- | Smart constructor.+mkNativeUIOptions :: (+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ )+	=> ScreenCoordinates row column		-- ^ The factor by which the dimensions of the board are stretched when displayed.+	-> Attribute.ColourScheme.ColourScheme+	-> NativeUIOptions row column+mkNativeUIOptions boardMagnification colourScheme+	| uncurry (||) $ (+		(< 1) *** (< 1)+	) boardMagnification			= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.NativeUIOptions.mkNativeUIOptions:\t" . showString boardMagnificationTag . Text.ShowList.showsAssociation $ shows boardMagnification " must both exceed zero."+	| uncurry (||) $ (+		even *** even+	) boardMagnification			= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.NativeUIOptions.mkNativeUIOptions:\t" . showString boardMagnificationTag . Text.ShowList.showsAssociation $ shows boardMagnification " must both be odd."+	| otherwise	= MkNativeUIOptions {+		getBoardMagnification	= boardMagnification,+		getColourScheme		= colourScheme+	}
+ src-lib/BishBosh/Input/Options.hs view
@@ -0,0 +1,277 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines configurable options.+-}++module BishBosh.Input.Options(+-- * Types+-- ** Type-synonyms+--	Transformation,+	RandomSeed,+-- ** Data-types+	Options(+--		MkOptions,+		getMaybeMaximumPlies,+		getMaybeRandomSeed,+		getEvaluationOptions,+		getSearchOptions,+		getIOOptions+	),+-- * Constants+	tag,+	maximumPliesTag,+	randomSeedTag,+-- * Functions+-- ** Constructor+	mkOptions,+-- ** Mutators+	setMaybeOutputConfigFilePath,+	setMaybeRandomSeed,+	setMaybePersistence,+	setVerbosity,+	setEitherNativeUIOrCECPOptions,+	setMaybePrintMoveTree,+	swapSearchDepth+) where++import			BishBosh.Data.Bool()		-- For 'HXT.xpickle'.+import			BishBosh.Data.Integral()	-- For 'HXT.XmlPickler NMoves'.+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Input.EvaluationOptions	as Input.EvaluationOptions+import qualified	BishBosh.Input.IOOptions		as Input.IOOptions+import qualified	BishBosh.Input.SearchOptions		as Input.SearchOptions+import qualified	BishBosh.Input.UIOptions		as Input.UIOptions+import qualified	BishBosh.Property.ShowFloat		as Property.ShowFloat+import qualified	BishBosh.Property.Tree			as Property.Tree+import qualified	BishBosh.Text.ShowList			as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Distribution.Verbosity+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT++-- | Used to qualify XML.+tag :: String+tag			= "options"++-- | Used to qualify XML.+maximumPliesTag :: String+maximumPliesTag		= "maximumPlies"++-- | Used to qualify XML.+randomSeedTag :: String+randomSeedTag		= "randomSeed"++-- | A seed from which to construct a pseudo-random number-generator.+type RandomSeed	= Int++-- | Defines the application's options.+data Options column criterionWeight pieceSquareValue rankValue row x y	= MkOptions {+	getMaybeMaximumPlies	:: Maybe Component.Move.NMoves,									-- ^ The maximum number of plies before the game is terminated; required for profiling the application.+	getMaybeRandomSeed	:: Maybe RandomSeed,										-- ^ Optionally seed the pseudo-random number-generator to produce a repeatable sequence.+	getEvaluationOptions	:: Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y,	-- ^ The options by which to automatically evaluate /move/s.+	getSearchOptions	:: Input.SearchOptions.SearchOptions,								-- ^ The options by which to automatically select /move/s.+	getIOOptions		:: Input.IOOptions.IOOptions row column								-- ^ The /ioOptions/ by which to receive commands & present results.+} deriving (Eq, Show)++instance (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	pieceSquareValue,+	Control.DeepSeq.NFData	rankValue,+	Control.DeepSeq.NFData	row,+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (Options column criterionWeight pieceSquareValue rankValue row x y) where+	rnf MkOptions {+		getMaybeMaximumPlies	= maybeMaximumPlies,+		getMaybeRandomSeed	= maybeRandomSeed,+		getEvaluationOptions	= evaluationOptions,+		getSearchOptions	= searchOptions,+		getIOOptions		= ioOptions+	} = Control.DeepSeq.rnf (maybeMaximumPlies, maybeRandomSeed, evaluationOptions, searchOptions, ioOptions)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Real	criterionWeight,+	Real	pieceSquareValue,+	Real	rankValue,+	Show	column,+	Show	pieceSquareValue,+	Show	row+ ) => Property.ShowFloat.ShowFloat (Options column criterionWeight pieceSquareValue rankValue row x y) where+	showsFloat fromDouble MkOptions {+		getMaybeMaximumPlies	= maybeMaximumPlies,+		getMaybeRandomSeed	= maybeRandomSeed,+		getEvaluationOptions	= evaluationOptions,+		getSearchOptions	= searchOptions,+		getIOOptions		= ioOptions+	} = Text.ShowList.showsAssociationList' . Data.Maybe.maybe id (+		(:) . (,) maximumPliesTag . shows+	 ) maybeMaximumPlies $ Data.Maybe.maybe id (+		(:) . (,) randomSeedTag . shows+	 ) maybeRandomSeed [+		(+			Input.EvaluationOptions.tag,+			Property.ShowFloat.showsFloat fromDouble evaluationOptions+		), (+			Input.SearchOptions.tag,+			shows searchOptions+		), (+			Input.IOOptions.tag,+			shows ioOptions+		)+	 ]++instance (+	Fractional	rankValue,+	Num		criterionWeight,+	Num		column,+	Num		row,+	Ord		rankValue,+	Show		rankValue+ ) => Data.Default.Default (Options column criterionWeight pieceSquareValue rankValue row x y) where+	def = MkOptions {+		getMaybeMaximumPlies	= Nothing,+		getMaybeRandomSeed	= Nothing,+		getEvaluationOptions	= Data.Default.def,+		getSearchOptions	= Data.Default.def,+		getIOOptions		= Data.Default.def+	}++instance (+	Enum		x,+	Enum		y,+	Fractional	pieceSquareValue,+	Fractional	rankValue,+	HXT.XmlPickler	column,+	HXT.XmlPickler	criterionWeight,+	HXT.XmlPickler	rankValue,+	HXT.XmlPickler	row,+	Integral	column,+	Integral	row,+	Num		criterionWeight,+	Ord		pieceSquareValue,+	Ord		rankValue,+	Ord		x,+	Ord		y,+	Real		criterionWeight,+	Real		pieceSquareValue,+	Show		column,+	Show		criterionWeight,+	Show		pieceSquareValue,+	Show		rankValue,+	Show		row+ ) => HXT.XmlPickler (Options column criterionWeight pieceSquareValue rankValue row x y) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e) -> mkOptions a b c d e,	-- Construct.+		\MkOptions {+			getMaybeMaximumPlies	= maybeMaximumPlies,+			getMaybeRandomSeed	= maybeRandomSeed,+			getEvaluationOptions	= evaluationOptions,+			getSearchOptions	= searchOptions,+			getIOOptions		= ioOptions+		} -> (+			maybeMaximumPlies,+			maybeRandomSeed,+			evaluationOptions,+			searchOptions,+			ioOptions+		) -- Deconstruct.+	 ) $ HXT.xp5Tuple (+		HXT.xpAttrImplied maximumPliesTag HXT.xpInt {-NMoves-}+	 ) (+		HXT.xpAttrImplied randomSeedTag HXT.xpInt+	 ) HXT.xpickle {-EvaluationOptions-} HXT.xpickle {-SearchOptions-} HXT.xpickle {-IOOptions-}++-- | Smart constructor.+mkOptions+	:: Maybe Component.Move.NMoves	-- ^ The maximum number of plies before the game is terminated; required for profiling the application.+	-> Maybe RandomSeed		-- ^ Optionally seed the pseudo-random number-generator to produce a repeatable sequence.+	-> Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y+	-> Input.SearchOptions.SearchOptions+	-> Input.IOOptions.IOOptions row column+	-> Options column criterionWeight pieceSquareValue rankValue row x y+mkOptions maybeMaximumPlies maybeRandomSeed evaluationOptions searchOptions ioOptions+	| Just maximumPlies	<- maybeMaximumPlies+	, maximumPlies <= 0	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.Options.mkOptions:\t" . showString maximumPliesTag . Text.ShowList.showsAssociation $ shows maximumPlies " must exceed zero."+	| otherwise	= MkOptions {+		getMaybeMaximumPlies	= maybeMaximumPlies,+		getMaybeRandomSeed	= maybeRandomSeed,+		getEvaluationOptions	= evaluationOptions,+		getSearchOptions	= searchOptions,+		getIOOptions		= ioOptions+	}++-- | The type of a function used to transform 'Options'.+type Transformation column criterionWeight pieceSquareValue rankValue row x y	= Options column criterionWeight pieceSquareValue rankValue row x y -> Options column criterionWeight pieceSquareValue rankValue row x y++-- | Mutator.+setMaybeOutputConfigFilePath :: Maybe System.FilePath.FilePath -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setMaybeOutputConfigFilePath maybeOutputConfigFilePath options@MkOptions { getIOOptions	= ioOptions }	= options {+	getIOOptions	= Input.IOOptions.setMaybeOutputConfigFilePath maybeOutputConfigFilePath ioOptions+}++-- | Mutator.+setMaybeRandomSeed :: Maybe RandomSeed -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setMaybeRandomSeed maybeRandomSeed options	= options {+	getMaybeRandomSeed	= maybeRandomSeed+}++-- | Mutator.+setMaybePersistence :: Maybe (System.FilePath.FilePath, Bool) -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setMaybePersistence maybePersistence options@MkOptions { getIOOptions = ioOptions }	= options {+	getIOOptions	= ioOptions {+		Input.IOOptions.getMaybePersistence	= maybePersistence+	}+}++-- | Mutator.+setVerbosity :: Distribution.Verbosity.Verbosity -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setVerbosity verbosity options@MkOptions { getIOOptions = ioOptions }	= options {+	getIOOptions	= Input.IOOptions.setVerbosity verbosity ioOptions+}++-- | Mutator.+setEitherNativeUIOrCECPOptions :: Input.UIOptions.EitherNativeUIOrCECPOptions row column -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setEitherNativeUIOrCECPOptions eitherNativeUIOrCECPOptions options@MkOptions { getIOOptions = ioOptions }	= options {+	getIOOptions	= Input.IOOptions.setEitherNativeUIOrCECPOptions eitherNativeUIOrCECPOptions ioOptions+}++-- | Mutator.+setMaybePrintMoveTree :: Maybe Property.Tree.Depth -> Transformation column criterionWeight pieceSquareValue rankValue row x y+setMaybePrintMoveTree maybePrintMoveTree options@MkOptions { getIOOptions = ioOptions }	= options {+	getIOOptions	= Input.IOOptions.setMaybePrintMoveTree maybePrintMoveTree ioOptions+}++-- | Mutator.+swapSearchDepth :: Transformation column criterionWeight pieceSquareValue rankValue row x y+swapSearchDepth options@MkOptions { getSearchOptions = searchOptions }	= options {+	getSearchOptions	= Input.SearchOptions.swapSearchDepth searchOptions+}+
+ src-lib/BishBosh/Input/PGNOptions.hs view
@@ -0,0 +1,182 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines configurable options for PGN-processing.+-}++module BishBosh.Input.PGNOptions(+-- * Types+-- ** Type-synonyms+-- ** Data-types+	PGNOptions(+--		MkPGNOptions,+		getDatabaseFilePath,+		getIsStrictlySequential,+		getValidateMoves,+		getIdentificationTags,+		getMinimumPlies+	),+-- * Constants+	tag,+	databaseFilePathTag,+--	identificationTagTag,+--	minimumPliesTag,+-- * Functions+-- ** Constructor+	mkPGNOptions+) where++import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.ContextualNotation.PGN			as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	ToolShed.Data.Foldable++-- | Used to qualify XML.+tag :: String+tag			= "pgnOptions"++-- | Used to qualify XML.+databaseFilePathTag :: String+databaseFilePathTag	= "databaseFilePath"++-- | Defines the command-line options.+validateMovesTag :: String+validateMovesTag	= "validateMoves"++-- | Defines the command-line options.+isStrictlySequentialTag :: String+isStrictlySequentialTag	= "isStrictlySequential"++-- | Defines the command-line options.+identificationTagTag :: String+identificationTagTag	= "identificationTag"++-- | Defines the command-line options.+minimumPliesTag :: String+minimumPliesTag		= "minimumPlies"++-- | Defines the options related to PGN.+data PGNOptions	= MkPGNOptions {+	getDatabaseFilePath	:: System.FilePath.FilePath,				-- ^ Path to a PGN-database file.+	getIsStrictlySequential	:: ContextualNotation.PGN.IsStrictlySequential,		-- ^ Whether moves with an unexpected number should be considered to be an error.+	getValidateMoves	:: ContextualNotation.StandardAlgebraic.ValidateMoves,	-- ^ Whether moves should be validated, which can become tedious if they're already known to be valid.+	getIdentificationTags	:: [ContextualNotation.PGN.Tag],			-- ^ The tags to extract from this PGN-database to form a unique composite game-identifier.+	getMinimumPlies		:: Component.Move.NMoves				-- ^ The minimum number of half moves, for the game to be considered useful; most short games result from "forfeit by disconnection".+} deriving Eq++instance Control.DeepSeq.NFData PGNOptions where+	rnf MkPGNOptions {+		getDatabaseFilePath	= databaseFilePath,+		getIsStrictlySequential	= isStrictlySequential,+		getValidateMoves	= validateMoves,+		getIdentificationTags	= identificationTags,+		getMinimumPlies		= minimumPlies+	} = Control.DeepSeq.rnf (databaseFilePath, isStrictlySequential, validateMoves, identificationTags, minimumPlies)++instance Show PGNOptions where+	showsPrec _ MkPGNOptions {+		getDatabaseFilePath	= databaseFilePath,+		getIsStrictlySequential	= isStrictlySequential,+		getValidateMoves	= validateMoves,+		getIdentificationTags	= identificationTags,+		getMinimumPlies		= minimumPlies+	} = Text.ShowList.showsAssociationList' [+		(+			databaseFilePathTag,+			shows databaseFilePath+		), (+			isStrictlySequentialTag,+			shows isStrictlySequential+		), (+			validateMovesTag,+			shows validateMoves+		), (+			showString identificationTagTag "s",+			shows identificationTags+		), (+			minimumPliesTag,+			shows minimumPlies+		)+	 ]++instance Data.Default.Default PGNOptions where+	def = MkPGNOptions {+		getDatabaseFilePath	= "pgn/bishbosh.pgn",	-- CAVEAT: rather arbitrary.+		getIsStrictlySequential	= True,+		getValidateMoves	= True,+		getIdentificationTags	= ["ECO", "Variation"],	-- CAVEAT: rather arbitrary.+		getMinimumPlies		= 1+	}++instance HXT.XmlPickler PGNOptions where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e) -> mkPGNOptions a b c d e,	-- Construct.+		\MkPGNOptions {+			getDatabaseFilePath	= databaseFilePath,+			getIsStrictlySequential	= isStrictlySequential,+			getValidateMoves	= validateMoves,+			getIdentificationTags	= identificationTags,+			getMinimumPlies		= minimumPlies+		} -> (databaseFilePath, isStrictlySequential, validateMoves, identificationTags, minimumPlies) -- Deconstruct.+	 ) $ HXT.xp5Tuple (+		HXT.xpTextAttr databaseFilePathTag+	 ) (+		getIsStrictlySequential def `HXT.xpDefault` HXT.xpAttr isStrictlySequentialTag HXT.xpickle {-Bool-}+	 ) (+		getValidateMoves def `HXT.xpDefault` HXT.xpAttr validateMovesTag HXT.xpickle {-Bool-}+	 ) (+		HXT.xpList . HXT.xpElem identificationTagTag $ HXT.xpTextAttr "tag"+	 ) (+		getMinimumPlies def `HXT.xpDefault` HXT.xpAttr minimumPliesTag HXT.xpickle {-NMoves-}+	 ) where+		def	= Data.Default.def++-- | Smart constructor.+mkPGNOptions+	:: System.FilePath.FilePath	-- ^ Database file-path.+	-> ContextualNotation.PGN.IsStrictlySequential+	-> ContextualNotation.StandardAlgebraic.ValidateMoves+	-> [ContextualNotation.PGN.Tag]	-- ^ Optional identification tags.+	-> Component.Move.NMoves	-- ^ The minimum plies.+	-> PGNOptions+mkPGNOptions databaseFilePath isStrictlySequential validateMoves identificationTags minimumPlies+	| not $ System.FilePath.isValid databaseFilePath	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.PGNOptions.mkPGNOptions:\tinvalid " . showString databaseFilePathTag . Text.ShowList.showsAssociation $ shows databaseFilePath "."+	| any null identificationTags				= Control.Exception.throw . Data.Exception.mkNullDatum . showString "BishBosh.Input.PGNOptions.mkPGNOptions:\tno " $ shows identificationTagTag " can be null."+	| not $ null duplicateTags				= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.Input.PGNOptions.mkPGNOptions:\tduplicate " . showString identificationTagTag . showChar 's' . Text.ShowList.showsAssociation $ shows duplicateTags "."+	| minimumPlies < 0					= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.PGNOptions.mkPGNOptions:\t" $ shows minimumPliesTag " can't be negative."+	| otherwise						= MkPGNOptions {+		getDatabaseFilePath	= databaseFilePath,+		getIsStrictlySequential	= isStrictlySequential,+		getValidateMoves	= validateMoves,+		getIdentificationTags	= identificationTags,+		getMinimumPlies		= minimumPlies+	}+	where+		duplicateTags :: [ContextualNotation.PGN.Tag]+		duplicateTags	= map head . filter ((/= 1) . length) $ ToolShed.Data.Foldable.gather identificationTags+
+ src-lib/BishBosh/Input/PieceSquareTable.hs view
@@ -0,0 +1,219 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the value for each type of piece, of occupying different squares.++	* This metric includes aspects of both control of the centre, & material advantage,+	in that a side's score can increase either by occupying more valuable squares or simply by having more pieces.++	* N.B.: the evaluation of fitness by "material" COULD be entirely built into these tables, so that the average value for a @Queen@ is ~9 times that for a @Pawn@,+	but under these circumstances a non-zero material value for a @King@ must be arbitrarily chosen.++	* N.B. The normal & end-game phases are typically represented by independent instances.+-}++module BishBosh.Input.PieceSquareTable(+-- * Types+-- ** Data-types+	PieceSquareTable(+--		MkPieceSquareTable,+--		getReflectOnY,+		getByRank+	),+-- * Constants+	tag,+	reflectOnYTag,+-- * Functions+--	mirror,+--	unmirror,+	findUndefinedRanks,+	dereference,+-- ** Constructors+	mkPieceSquareTable+) where++import			BishBosh.Data.Bool()	-- HXT.XmlPickler.+import			Control.Arrow((***))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa	as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Data.Num		as Data.Num+import qualified	BishBosh.Property.ShowFloat	as Property.ShowFloat+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.Arrow+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.Map+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag		= "pieceSquareTable"++-- | Used to qualify XML.+reflectOnYTag :: String+reflectOnYTag	= "reflectOnY"++-- | Defines the value for each type of piece, of occupying each square.+data PieceSquareTable x y pieceSquareValue	= MkPieceSquareTable {+	getReflectOnY	:: Bool,	-- ^ Whether values for the RHS of the board should be inferred by reflection about the y-axis.+	getByRank	:: Data.Map.Map Attribute.Rank.Rank (+		Cartesian.Coordinates.ByCoordinates x y pieceSquareValue+	)				-- ^ N.B.: on the assumption that the values for Black pieces are the reflection of those for White, merely the /rank/ of each /piece/ need be defined.+} deriving (Eq, Show)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Real	pieceSquareValue,+	Show	pieceSquareValue+ ) => Property.ShowFloat.ShowFloat (PieceSquareTable x y pieceSquareValue) where+	showsFloat fromDouble MkPieceSquareTable {+		getReflectOnY	= reflectOnY,+		getByRank	= byRank+	} = Text.ShowList.showsAssociationList Text.ShowList.showsSeparator $ (+		reflectOnYTag,+		shows reflectOnY+	 ) : map (+		show {-rank-} *** Text.ShowList.showsFormattedList' (+			fromDouble . realToFrac+		) . (+			if reflectOnY+				then unmirror+				else id+		) . Data.Array.IArray.elems+	 ) (+		Data.Map.assocs byRank+	 )++instance Data.Default.Default (PieceSquareTable x y pieceSquareValue) where+	def = MkPieceSquareTable {+		getReflectOnY	= True,+		getByRank	= Data.Map.empty+	}++instance (+	Enum		x,+	Enum		y,+	Fractional	pieceSquareValue,+	Ord		pieceSquareValue,+	Ord		x,+	Ord		y,+	Real		pieceSquareValue,+	Show		pieceSquareValue+ ) => HXT.XmlPickler (PieceSquareTable x y pieceSquareValue) where+	xpickle	= HXT.xpWrap (+		uncurry mkPieceSquareTable,+		\MkPieceSquareTable {+			getReflectOnY	= reflectOnY,+			getByRank	= byRank+		} -> (+			reflectOnY,+			Data.Map.assocs $ Data.Map.map (+				(+					if reflectOnY+						then unmirror+						else id+				) . Data.Array.IArray.elems+			) byRank+		) -- Pair.+	 ) $ (+		getReflectOnY Data.Default.def `HXT.xpDefault` HXT.xpAttr reflectOnYTag HXT.xpickle {-Bool-}+	 ) `HXT.xpPair` HXT.xpList1 (+		HXT.xpElem "byRank" $ HXT.xpickle {-rank-} `HXT.xpPair` HXT.xpWrap (+			\s -> [+				realToFrac (pieceSquareValue :: Double) |+					word			<- words s,+					(pieceSquareValue, "")	<- reads word+			], -- List-comprehension.+			unwords . map (show . (\pieceSquareValue -> realToFrac pieceSquareValue :: Double))+		 ) (HXT.xpTextAttr "byCoordinates")+	 )++-- | Generates a mirror-symmetric RHS, to build a complete description.+mirror :: Show pieceSquareValue => [pieceSquareValue] -> [pieceSquareValue]+mirror (a : b : c : d : remainder)	= a : b : c : d : d : c : b : a : mirror remainder+mirror []				= []+mirror pieceSquareValues		= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.PieceSquareTable.mirror:\tthe number of piece-square values must be a multiple of " . shows (Cartesian.Abscissa.xLength `div` 2) . showString "; " $ shows pieceSquareValues "."++-- | Removes the mirror-symmetric RHS, for a concise description.+unmirror :: Show pieceSquareValue => [pieceSquareValue] -> [pieceSquareValue]+unmirror (a : b : c : d : remainder)	= a : b : c : d : unmirror (drop (fromIntegral Cartesian.Abscissa.xLength `div` 2) remainder)+unmirror []				= []+unmirror pieceSquareValues		= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.PieceSquareTable.unmirror:\tthe number of piece-square values must be a multiple of " . shows (Cartesian.Abscissa.xLength `div` 2) . showString "; " $ shows pieceSquareValues "."++-- | Smart constructor.+mkPieceSquareTable :: (+	Enum	x,+	Enum	y,+	Num	pieceSquareValue,+	Ord	pieceSquareValue,+	Ord	x,+	Ord	y,+	Show	pieceSquareValue+ )+	=> Bool	-- ^ Whether values for the RHS of the board are inferred by reflection about the y-axis.+	-> [(Attribute.Rank.Rank, [pieceSquareValue])]+	-> PieceSquareTable x y pieceSquareValue+mkPieceSquareTable reflectOnY assocs+	| any (+		(/= nValuesRequired) . length . snd {-pieceSquareValues-}+	) assocs	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Input.PieceSquareTable.mkPieceSquareTable:\texactly " . shows nValuesRequired . showString " values must be defined for each type of piece; " $ shows assocs "."+	| any (+		any (+			not . Data.Num.inClosedUnitInterval+		) . snd {-list-}+	) assocs	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.PieceSquareTable.mkPieceSquareTable:\tall values must be within the closed unit-interval [0,1]; " $ shows assocs "."+	| otherwise	= MkPieceSquareTable {+		getReflectOnY	= reflectOnY,+		getByRank	= Data.Map.fromList . map (Control.Arrow.second Cartesian.Coordinates.listArrayByCoordinates) $ (+			if reflectOnY+				then map $ Control.Arrow.second mirror+				else id+		) assocs+	}+	where+		nValuesRequired	= (+			if reflectOnY+				then (`div` 2)+				else id+		 ) Cartesian.Coordinates.nSquares++-- | Identify any /rank/ lacking a definition.+findUndefinedRanks :: PieceSquareTable x y pieceSquareValue -> Data.Set.Set Attribute.Rank.Rank+findUndefinedRanks MkPieceSquareTable { getByRank = byRank }	= Data.Set.fromAscList Attribute.Rank.range `Data.Set.difference` Data.Map.keysSet byRank++-- | Lookup the value for the specified /rank/.+dereference :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Attribute.Rank.Rank -> PieceSquareTable x y pieceSquareValue -> Maybe [pieceSquareValue]+dereference rank MkPieceSquareTable { getByRank = byRank}	= Data.Array.IArray.elems `fmap` Data.Map.lookup rank byRank+
+ src-lib/BishBosh/Input/SearchOptions.hs view
@@ -0,0 +1,419 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines configurable options related to the process of searching for the optimal move.+-}++module BishBosh.Input.SearchOptions(+-- * Types+-- ** Type-synonyms+	SearchDepth,+	PreferMovesTowardsCentre,+	SortOnStandardOpeningMoveFrequency,+	HammingDistance,+--	Transformation,+--	RecordKillerMoves,+	MaybeRetireAfterNMoves,+	TrapRepeatedPositions,+--	UsePondering,+	MaybeUseTranspositions,+--	StandardOpeningOptions,+--	SearchDepthByLogicalColour,+	Reader,+-- ** Data-types+	SearchOptions(+--		MkSearchOptions,+		getPreferMovesTowardsCentre,+		getSortOnStandardOpeningMoveFrequency,+		getMaybeCaptureMoveSortAlgorithm,+		getMaybeMinimumHammingDistance,+		getMaybeRetireKillerMovesAfter,+		getTrapRepeatedPositions,+		getUsePondering,+		getMaybeUseTranspositions,+		getStandardOpeningOptions,+		getSearchDepthByLogicalColour+	),+-- * Constants+	tag,+--	preferMovesTowardsCentreTag+--	sortOnStandardOpeningMoveFrequencyTag+--	minimumHammingDistanceTag,+--	retireKillerMovesAfterTag,+--	trapRepeatedPositionsTag,+--	usePonderingTag,+--	retireTranspositionsAfterTag,+--	minimumTranspositionSearchDepthTag,+--	standardOpeningOptionsTag,+	searchDepthTag,+--	searchDepthByLogicalColourTag+	minimumSearchDepth,+	defaultSearchDepth,+-- * Functions+-- ** Constructor+	mkSearchOptions,+-- ** Accessors+	getSearchDepth,+	maybeRetireTranspositionsAfter,+	maybeMinimumTranspositionSearchDepth,+-- ** Mutators+	setSearchDepth,+	swapSearchDepth,+-- ** Predicates+	recordKillerMoves+) where++import			BishBosh.Data.Bool()		-- For 'HXT.xpickle'.+import			BishBosh.Data.Integral()	-- For 'HXT.XmlPickler NMoves'.+import			Control.Arrow((***))+import qualified	BishBosh.Attribute.CaptureMoveSortAlgorithm	as Attribute.CaptureMoveSortAlgorithm+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Input.StandardOpeningOptions		as Input.StandardOpeningOptions+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Control.Monad.Reader+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT++-- | Used to qualify XML.+tag :: String+tag					= "searchOptions"++-- | Used to qualify XML.+preferMovesTowardsCentreTag :: String+preferMovesTowardsCentreTag		= "preferMovesTowardsCentre"++-- | Used to qualify XML.+sortOnStandardOpeningMoveFrequencyTag :: String+sortOnStandardOpeningMoveFrequencyTag	= "sortOnStandardOpeningMoveFrequency"++-- | Used to qualify XML.+minimumHammingDistanceTag :: String+minimumHammingDistanceTag		= "minimumHammingDistance"++-- | Used to qualify XML.+retireKillerMovesAfterTag :: String+retireKillerMovesAfterTag		= "retireKillerMovesAfter"++-- | Used to qualify XML.+trapRepeatedPositionsTag :: String+trapRepeatedPositionsTag		= "trapRepeatedPositions"++-- | Used to qualify XML.+usePonderingTag :: String+usePonderingTag				= "usePondering"++-- | Used to qualify XML.+retireTranspositionsAfterTag :: String+retireTranspositionsAfterTag		= "retireTranspositionsAfter"++-- | Used to qualify XML.+minimumTranspositionSearchDepthTag :: String+minimumTranspositionSearchDepthTag	= "minimumTranspositionSearchDepth"++-- | Used to qualify XML.+searchDepthTag :: String+searchDepthTag				= "searchDepth"++-- | Used to qualify XML.+searchDepthByLogicalColourTag :: String+searchDepthByLogicalColourTag		= showString searchDepthTag "ByLogicalColour"++-- | The number of plies to search for the optimal move.+type SearchDepth	= Component.Move.NMoves++-- | The minimum permissible search-depth.+minimumSearchDepth :: SearchDepth+minimumSearchDepth	= 1++{- |+	* The default search-depth.++	* CAVEAT: this is rather arbitrary.+-}+defaultSearchDepth :: SearchDepth+defaultSearchDepth	= 4++-- | Whether to prefer moves which progress towards the centre of the board.+type PreferMovesTowardsCentre		= Bool++-- | Sort moves on the decreasing frequency of occurrence in standard openings.+type SortOnStandardOpeningMoveFrequency	= Bool++-- | The optional minimum Hamming-distance between the random numbers from which Zobrist-hashes are composed.+type HammingDistance			= Int++-- | The number of full moves (one for each player) after which to retire killer moves.+type MaybeRetireAfterNMoves		= Maybe Component.Move.NMoves++-- | Whether to short-circuit the fitness-evaluation of /position/s which have been visited before in the current /game/.+type TrapRepeatedPositions		= Bool++-- | Whether to ponder about one's next move while the opponent is thinking.+type UsePondering			= Bool++-- | The number of full moves (one for each player) after which to retire transpositions & the search-depth beneath which they aren't recorded at all.+type MaybeUseTranspositions		= Maybe (Component.Move.NMoves, SearchDepth)++-- | The depth to search for each /logical colour/.+type SearchDepthByLogicalColour		= Data.Map.Map Attribute.LogicalColour.LogicalColour SearchDepth++-- | Defines options related to searching for a move.+data SearchOptions	= MkSearchOptions {+	getPreferMovesTowardsCentre		:: PreferMovesTowardsCentre,+	getSortOnStandardOpeningMoveFrequency	:: SortOnStandardOpeningMoveFrequency,+	getMaybeCaptureMoveSortAlgorithm	:: Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm,+	getMaybeMinimumHammingDistance		:: Maybe HammingDistance,+	getMaybeRetireKillerMovesAfter		:: MaybeRetireAfterNMoves,+	getTrapRepeatedPositions		:: TrapRepeatedPositions,+	getUsePondering				:: UsePondering,+	getMaybeUseTranspositions		:: MaybeUseTranspositions,+	getStandardOpeningOptions		:: Input.StandardOpeningOptions.StandardOpeningOptions,+	getSearchDepthByLogicalColour		:: SearchDepthByLogicalColour+} deriving Eq++instance Control.DeepSeq.NFData SearchOptions where+	rnf MkSearchOptions {+		getPreferMovesTowardsCentre		= preferMovesTowardsCentre,+		getSortOnStandardOpeningMoveFrequency	= sortOnStandardOpeningMoveFrequency,+		getMaybeCaptureMoveSortAlgorithm	= maybeCaptureMoveSortAlgorithm,+		getMaybeMinimumHammingDistance		= maybeMinimumHammingDistance,+		getMaybeRetireKillerMovesAfter		= maybeRetireKillerMovesAfter,+		getTrapRepeatedPositions		= trapRepeatedPositions,+		getUsePondering				= usePondering,+		getMaybeUseTranspositions		= maybeUseTranspositions,+		getStandardOpeningOptions		= standardOpeningOptions,+		getSearchDepthByLogicalColour		= searchDepthByLogicalColour+	} = Control.DeepSeq.rnf (+		(+			preferMovesTowardsCentre, sortOnStandardOpeningMoveFrequency, maybeCaptureMoveSortAlgorithm, maybeMinimumHammingDistance, maybeRetireKillerMovesAfter+		), (+			trapRepeatedPositions, usePondering, maybeUseTranspositions, standardOpeningOptions, searchDepthByLogicalColour+		)+	 )++instance Show SearchOptions where+	showsPrec _ MkSearchOptions {+		getPreferMovesTowardsCentre		= preferMovesTowardsCentre,+		getSortOnStandardOpeningMoveFrequency	= sortOnStandardOpeningMoveFrequency,+		getMaybeCaptureMoveSortAlgorithm	= maybeCaptureMoveSortAlgorithm,+		getMaybeMinimumHammingDistance		= maybeMinimumHammingDistance,+		getMaybeRetireKillerMovesAfter		= maybeRetireKillerMovesAfter,+		getTrapRepeatedPositions		= trapRepeatedPositions,+		getUsePondering				= usePondering,+		getMaybeUseTranspositions		= maybeUseTranspositions,+		getStandardOpeningOptions		= standardOpeningOptions,+		getSearchDepthByLogicalColour		= searchDepthByLogicalColour+	} = Text.ShowList.showsAssociationList' . Data.Maybe.maybe id (+		(:) . (,) Attribute.CaptureMoveSortAlgorithm.tag . shows+	 ) maybeCaptureMoveSortAlgorithm . Data.Maybe.maybe id (+		(:) . (,) minimumHammingDistanceTag . shows+	 ) maybeMinimumHammingDistance . Data.Maybe.maybe id (+		(:) . (,) retireKillerMovesAfterTag . shows+	 ) maybeRetireKillerMovesAfter $ Data.Maybe.maybe id (+		\(retireTranspositionsAfter, minimumTranspositionSearchDepth)	-> (++) [+			(+				preferMovesTowardsCentreTag,+				shows preferMovesTowardsCentre+			), (+				sortOnStandardOpeningMoveFrequencyTag,+				shows sortOnStandardOpeningMoveFrequency+			), (+				retireTranspositionsAfterTag,+				shows retireTranspositionsAfter+			), (+				minimumTranspositionSearchDepthTag,+				shows minimumTranspositionSearchDepth+			)+		]+	 ) maybeUseTranspositions [+		(+			trapRepeatedPositionsTag,+			shows trapRepeatedPositions+		), (+			usePonderingTag,+			shows usePondering+		), (+			Input.StandardOpeningOptions.tag,+			shows standardOpeningOptions+		), (+			searchDepthByLogicalColourTag,+			Text.ShowList.showsAssociationList' . map (show *** shows) $ Data.Map.assocs searchDepthByLogicalColour+		)+	 ]++instance Data.Default.Default SearchOptions where+	def = MkSearchOptions {+		getPreferMovesTowardsCentre		= True,+		getSortOnStandardOpeningMoveFrequency	= False,+		getMaybeCaptureMoveSortAlgorithm	= Nothing,+		getMaybeMinimumHammingDistance		= Nothing,+		getMaybeRetireKillerMovesAfter		= Nothing,+		getTrapRepeatedPositions		= True,+		getUsePondering				= False,+		getMaybeUseTranspositions		= Nothing,+		getStandardOpeningOptions		= Data.Default.def,+		getSearchDepthByLogicalColour		= Data.Map.empty	-- Manual.+	}++instance HXT.XmlPickler SearchOptions where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i, j) -> mkSearchOptions a b c d e f g h i j,	-- Construct.+		\MkSearchOptions {+			getPreferMovesTowardsCentre		= preferMovesTowardsCentre,+			getSortOnStandardOpeningMoveFrequency	= sortOnStandardOpeningMoveFrequency,+			getMaybeCaptureMoveSortAlgorithm	= maybeCaptureMoveSortAlgorithm,+			getMaybeMinimumHammingDistance		= maybeMinimumHammingDistance,+			getMaybeRetireKillerMovesAfter		= maybeRetireKillerMovesAfter,+			getTrapRepeatedPositions		= trapRepeatedPositions,+			getUsePondering				= usePondering,+			getMaybeUseTranspositions		= maybeUseTranspositions,+			getStandardOpeningOptions		= standardOpeningOptions,+			getSearchDepthByLogicalColour		= searchDepthByLogicalColour+		} -> (+			preferMovesTowardsCentre,+			sortOnStandardOpeningMoveFrequency,+			maybeCaptureMoveSortAlgorithm,+			maybeMinimumHammingDistance,+			maybeRetireKillerMovesAfter,+			trapRepeatedPositions,+			usePondering,+			maybeUseTranspositions,+			standardOpeningOptions,+			searchDepthByLogicalColour+		) -- Deconstruct.+	 ) $ HXT.xp10Tuple (+		getPreferMovesTowardsCentre def `HXT.xpDefault` HXT.xpAttr preferMovesTowardsCentreTag HXT.xpickle {-Bool-}+	 ) (+		getSortOnStandardOpeningMoveFrequency def `HXT.xpDefault` HXT.xpAttr sortOnStandardOpeningMoveFrequencyTag HXT.xpickle+	 ) (+		HXT.xpOption HXT.xpickle {-CaptureMoveSortAlgorithm-}+	 ) (+		HXT.xpAttrImplied minimumHammingDistanceTag HXT.xpInt+	 ) (+		HXT.xpAttrImplied retireKillerMovesAfterTag HXT.xpInt+	 ) (+		getTrapRepeatedPositions def `HXT.xpDefault` HXT.xpAttr trapRepeatedPositionsTag HXT.xpickle {-Bool-}+	 ) (+		getUsePondering def `HXT.xpDefault` HXT.xpAttr usePonderingTag HXT.xpickle {-Bool-}+	 ) (+		HXT.xpOption . HXT.xpElem "transpositions" $ HXT.xpAttr retireTranspositionsAfterTag HXT.xpInt `HXT.xpPair` HXT.xpAttr minimumTranspositionSearchDepthTag HXT.xpInt+	 ) HXT.xpickle {-standardOpeningOptions-} (+		HXT.xpElem searchDepthByLogicalColourTag . HXT.xpWrap (+			Data.Map.fromList,	-- Construct from a List.+			Data.Map.toList		-- Deconstruct to a List.+		) . HXT.xpList {-potentially null-} . HXT.xpElem "byLogicalColour" $ HXT.xpickle {-LogicalColour-} `HXT.xpPair` HXT.xpAttr searchDepthTag HXT.xpInt+	 ) where+		def	= Data.Default.def++-- | Smart constructor.+mkSearchOptions+	:: PreferMovesTowardsCentre+	-> SortOnStandardOpeningMoveFrequency+	-> Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm+	-> Maybe HammingDistance	-- ^ The optional lower bound on the Hamming-distance between the random numbers used to compose Zobrist hashes from /position/s.+	-> MaybeRetireAfterNMoves	-- ^ The number of full moves back from the current position, after which to retire killer-moves.+	-> TrapRepeatedPositions+	-> UsePondering+	-> MaybeUseTranspositions	-- ^ The number of full moves after which to retire transpositions, & the search-depth beneath which transpositions aren't recorded.+	-> Input.StandardOpeningOptions.StandardOpeningOptions+	-> SearchDepthByLogicalColour+	-> SearchOptions+mkSearchOptions preferMovesTowardsCentre sortOnStandardOpeningMoveFrequency maybeCaptureMoveSortAlgorithm maybeMinimumHammingDistance maybeRetireKillerMovesAfter trapRepeatedPositions usePondering maybeUseTranspositions standardOpeningOptions searchDepthByLogicalColour+	| Just minimumHammingDistance		<- maybeMinimumHammingDistance+	, minimumHammingDistance < 1	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" . showString minimumHammingDistanceTag . Text.ShowList.showsAssociation $ shows minimumHammingDistance " must exceed zero."+	| Just retireKillerMovesAfter		<- maybeRetireKillerMovesAfter+	, retireKillerMovesAfter < 0	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" . showString retireKillerMovesAfterTag . Text.ShowList.showsAssociation $ shows retireKillerMovesAfter " can't be negative."+	| let nAutomatedPlayers	= Data.Map.size searchDepthByLogicalColour+	, usePondering && nAutomatedPlayers /= 1+	= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\tpondering is pointless unless there's an automated player who can use the unused CPU-time during a manual player's move, but there're " $ shows nAutomatedPlayers " automated players."+	| Just (retireTranspositionsAfter, _)	<- maybeUseTranspositions+	, retireTranspositionsAfter < 0	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" . showString retireTranspositionsAfterTag . Text.ShowList.showsAssociation $ shows retireTranspositionsAfter " can't be negative."+	| Just (_, minimumTranspositionSearchDepth)	<- maybeUseTranspositions+	, minimumTranspositionSearchDepth < 1	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" . showString minimumTranspositionSearchDepthTag . Text.ShowList.showsAssociation $ shows minimumTranspositionSearchDepth " must exceed zero."+	| Just (_, minimumTranspositionSearchDepth)	<- maybeUseTranspositions+	, not $ Data.Map.null searchDepthByLogicalColour+	, Data.Foldable.all (+		minimumTranspositionSearchDepth >+	) searchDepthByLogicalColour	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" . showString minimumTranspositionSearchDepthTag . Text.ShowList.showsAssociation $ shows minimumTranspositionSearchDepth . showString " exceeds " . showString searchDepthTag . Text.ShowList.showsAssociation $ shows (Data.Map.toList searchDepthByLogicalColour) "."+	| Data.Foldable.any (+		< minimumSearchDepth+	) searchDepthByLogicalColour	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.mkSearchOptions:\t" $ showString searchDepthTag " must be positive."+	| otherwise	= MkSearchOptions {+		getPreferMovesTowardsCentre		= preferMovesTowardsCentre,+		getSortOnStandardOpeningMoveFrequency	= sortOnStandardOpeningMoveFrequency,+		getMaybeCaptureMoveSortAlgorithm	= maybeCaptureMoveSortAlgorithm,+		getMaybeMinimumHammingDistance		= maybeMinimumHammingDistance,+		getMaybeRetireKillerMovesAfter		= maybeRetireKillerMovesAfter,+		getTrapRepeatedPositions		= trapRepeatedPositions,+		getUsePondering				= usePondering,+		getMaybeUseTranspositions		= maybeUseTranspositions,+		getStandardOpeningOptions		= standardOpeningOptions,+		getSearchDepthByLogicalColour		= searchDepthByLogicalColour+	}++-- | Get either player's search-depth, using a default value when none are defined.+getSearchDepth :: SearchOptions -> SearchDepth+getSearchDepth MkSearchOptions { getSearchDepthByLogicalColour = searchDepthByLogicalColour }	= Data.Maybe.fromMaybe defaultSearchDepth . Data.Maybe.listToMaybe $ Data.Map.elems searchDepthByLogicalColour	-- Manual players don't have a searchDepth, so use the opponent's settings.++-- | Self-documentation.+type RecordKillerMoves	= Bool++-- | Whether killer-moves are to be recorded.+recordKillerMoves :: SearchOptions -> RecordKillerMoves+recordKillerMoves MkSearchOptions { getMaybeRetireKillerMovesAfter = maybeRetireKillerMovesAfter }	= Data.Maybe.isJust maybeRetireKillerMovesAfter++-- | When to retire transpositions.+maybeRetireTranspositionsAfter :: SearchOptions -> MaybeRetireAfterNMoves+maybeRetireTranspositionsAfter MkSearchOptions { getMaybeUseTranspositions = maybeUseTranspositions }	= fmap fst maybeUseTranspositions++-- | The search-depth beneath which transpositions aren't recorded.+maybeMinimumTranspositionSearchDepth :: SearchOptions -> Maybe SearchDepth+maybeMinimumTranspositionSearchDepth MkSearchOptions { getMaybeUseTranspositions = maybeUseTranspositions }	= fmap snd maybeUseTranspositions++-- | The type of a function used to transform 'SearchOptions'.+type Transformation	= SearchOptions -> SearchOptions++-- | Mutator.+setSearchDepth :: SearchDepth -> Transformation+setSearchDepth searchDepth searchOptions@MkSearchOptions { getSearchDepthByLogicalColour = searchDepthByLogicalColour }+	| searchDepth < minimumSearchDepth	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.SearchOptions.setSearchDepth:\t" . showString searchDepthTag . Text.ShowList.showsAssociation $ shows searchDepth " must be positive."+	| otherwise	= searchOptions { getSearchDepthByLogicalColour = Data.Map.map (const searchDepth) searchDepthByLogicalColour }++-- | Swap the /logical colour/ associated with any /searchDepth/ currently assigned.+swapSearchDepth :: Transformation+swapSearchDepth searchOptions@MkSearchOptions {+	getSearchDepthByLogicalColour	= searchDepthByLogicalColour+} = searchOptions {+	getSearchDepthByLogicalColour	= Data.Map.fromAscList . map (Control.Arrow.first Property.Opposable.getOpposite) $ Data.Map.toDescList searchDepthByLogicalColour+}++-- | Self-documentation.+type Reader	= Control.Monad.Reader.Reader SearchOptions+
+ src-lib/BishBosh/Input/StandardOpeningOptions.hs view
@@ -0,0 +1,160 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines configurable options related to the process of searching standard-openings.+-}++module BishBosh.Input.StandardOpeningOptions(+-- * Types+-- ** Type-synonyms+--	TryToMatchMoves,+--	TryToMatchViaJoiningMove,+--	TryToMatchColourFlippedPosition,+	MatchSwitches,+-- ** Data-types+	StandardOpeningOptions(+--		MkStandardOpeningOptions,+--		getTryToMatchMoves,+--		getTryToMatchViaJoiningMove,+--		getTryToMatchColourFlippedPosition+	),+-- * Constants+	tag,+--	tryToMatchMovesTag,+--	tryToMatchViaJoiningMoveTag,+--	tryToMatchColourFlippedPositionTag,+-- * Functions+-- ** Constructor+	mkStandardOpeningOptions,+-- ** Accessors+	getMatchSwitches+) where++import			BishBosh.Data.Bool()		-- For 'HXT.xpickle'.+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag					= "standardOpeningOptions"++-- | Used to qualify XML.+tryToMatchMovesTag :: String+tryToMatchMovesTag			= "tryToMatchMoves"++-- | Used to qualify XML.+tryToMatchViaJoiningMoveTag :: String+tryToMatchViaJoiningMoveTag		= "tryToMatchViaJoiningMove"++-- | Used to qualify XML.+tryToMatchColourFlippedPositionTag :: String+tryToMatchColourFlippedPositionTag	= "tryToMatchColourFlippedPosition"++-- | Whether to attempt to exactly match moves with a standard opening; transpositions won't be matched.+type TryToMatchMoves	= Bool++-- | Whether to attempt to join the current position to a standard opening that's only one ply away.+type TryToMatchViaJoiningMove	= Bool++-- | Whether to attempt to match a colour-flipped version of the current position with a standard opening+type TryToMatchColourFlippedPosition	= Bool++-- | The switches used to control attempts to find a match amongst standard openings.+type MatchSwitches	= (TryToMatchMoves, TryToMatchViaJoiningMove, TryToMatchColourFlippedPosition)++-- | Defines options related to searching for a move.+data StandardOpeningOptions	= MkStandardOpeningOptions {+	getTryToMatchMoves			:: TryToMatchMoves,			-- ^ Whether to attempt to exactly match moves with a standard opening; transpositions won't be matched.+	getTryToMatchViaJoiningMove		:: TryToMatchViaJoiningMove,		-- ^ Whether to attempt to join the current position to a standard opening that's only one ply away.+	getTryToMatchColourFlippedPosition	:: TryToMatchColourFlippedPosition	-- ^ Whether to attempt to match a colour-flipped version of the current position with a standard opening.+} deriving Eq++instance Control.DeepSeq.NFData StandardOpeningOptions where+	rnf MkStandardOpeningOptions {+		getTryToMatchMoves			= tryToMatchMoves,+		getTryToMatchViaJoiningMove		= tryToMatchViaJoiningMove,+		getTryToMatchColourFlippedPosition	= tryToMatchColourFlippedPosition+	} = Control.DeepSeq.rnf (tryToMatchMoves, tryToMatchViaJoiningMove, tryToMatchColourFlippedPosition)++instance Show StandardOpeningOptions where+	showsPrec _ MkStandardOpeningOptions {+		getTryToMatchMoves			= tryToMatchMoves,+		getTryToMatchViaJoiningMove		= tryToMatchViaJoiningMove,+		getTryToMatchColourFlippedPosition	= tryToMatchColourFlippedPosition+	} = Text.ShowList.showsAssociationList' [+		(+			tryToMatchMovesTag,+			shows tryToMatchMoves+		), (+			tryToMatchViaJoiningMoveTag,+			shows tryToMatchViaJoiningMove+		), (+			tryToMatchColourFlippedPositionTag,+			shows tryToMatchColourFlippedPosition+		)+	 ]++instance Data.Default.Default StandardOpeningOptions where+	def = MkStandardOpeningOptions {+		getTryToMatchMoves			= True,+		getTryToMatchViaJoiningMove		= True,+		getTryToMatchColourFlippedPosition	= True+	}++instance HXT.XmlPickler StandardOpeningOptions where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c) -> mkStandardOpeningOptions a b c,	-- Construct.+		\MkStandardOpeningOptions {+			getTryToMatchMoves			= tryToMatchMoves,+			getTryToMatchViaJoiningMove		= tryToMatchViaJoiningMove,+			getTryToMatchColourFlippedPosition	= tryToMatchColourFlippedPosition+		} -> (tryToMatchMoves, tryToMatchViaJoiningMove, tryToMatchColourFlippedPosition) -- Deconstruct.+	 ) $ HXT.xpTriple(+		getTryToMatchMoves def `HXT.xpDefault` HXT.xpAttr tryToMatchMovesTag HXT.xpickle+	 ) (+		getTryToMatchViaJoiningMove def `HXT.xpDefault` HXT.xpAttr tryToMatchViaJoiningMoveTag HXT.xpickle+	 ) (+		getTryToMatchColourFlippedPosition def `HXT.xpDefault` HXT.xpAttr tryToMatchColourFlippedPositionTag HXT.xpickle+	 ) where+		def	= Data.Default.def++-- | Smart constructor.+mkStandardOpeningOptions+	:: TryToMatchMoves+	-> TryToMatchViaJoiningMove+	-> TryToMatchColourFlippedPosition+	-> StandardOpeningOptions+mkStandardOpeningOptions tryToMatchMoves tryToMatchViaJoiningMove tryToMatchColourFlippedPosition	= MkStandardOpeningOptions {+	getTryToMatchMoves			= tryToMatchMoves,+	getTryToMatchViaJoiningMove		= tryToMatchViaJoiningMove,+	getTryToMatchColourFlippedPosition	= tryToMatchColourFlippedPosition+}++-- | Accessor.+getMatchSwitches :: StandardOpeningOptions -> MatchSwitches+getMatchSwitches MkStandardOpeningOptions {+	getTryToMatchMoves			= tryToMatchMoves,+	getTryToMatchViaJoiningMove		= tryToMatchViaJoiningMove,+	getTryToMatchColourFlippedPosition	= tryToMatchColourFlippedPosition+} = (tryToMatchMoves, tryToMatchViaJoiningMove, tryToMatchColourFlippedPosition)+
+ src-lib/BishBosh/Input/UIOptions.hs view
@@ -0,0 +1,241 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines options related to the application's user-interface.+-}++module BishBosh.Input.UIOptions(+-- * Types+-- ** Type-synonyms+	EitherNativeUIOrCECPOptions,+--	Transformation,+-- ** Data-types+	UIOptions(+--		MkUIOptions,+		getMoveNotation,+		getMaybePrintMoveTree,+		getNDecimalDigits,+		getEitherNativeUIOrCECPOptions,+		getVerbosity+	),+-- * Constants+	tag,+	printMoveTreeTag,+	nDecimalDigitsTag,+--	maxNDecimalDigits,+-- * Functions+-- ** Constructors+	mkUIOptions,+-- ** Mutators+	updateCECPFeature,+	deleteCECPFeature,+-- ** Predicates+	isCECPManualMode+) where++import			BishBosh.Data.Integral()	-- For 'HXT.XmlPickler NDecimalDigits'.+import			Control.Arrow((&&&))+import qualified	BishBosh.Data.Either		as Data.Either+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Input.CECPFeatures	as Input.CECPFeatures+import qualified	BishBosh.Input.CECPOptions	as Input.CECPOptions+import qualified	BishBosh.Input.NativeUIOptions	as Input.NativeUIOptions+import qualified	BishBosh.Input.Verbosity	as Input.Verbosity+import qualified	BishBosh.Notation.MoveNotation	as Notation.MoveNotation+import qualified	BishBosh.Property.ShowFloat	as Property.ShowFloat+import qualified	BishBosh.Property.Tree		as Property.Tree+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Distribution.Verbosity+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Used to qualify XML.+tag :: String+tag			= "uiOptions"++-- | Used to qualify XML.+printMoveTreeTag :: String+printMoveTreeTag	= "printMoveTree"++-- | Used to qualify XML.+nDecimalDigitsTag :: String+nDecimalDigitsTag	= "nDecimalDigits"++-- | The maximum number of decimal digits that can be represented using a double-precision floating-point number.+maxNDecimalDigits :: Property.ShowFloat.NDecimalDigits+maxNDecimalDigits	= floor $ fromIntegral (+	floatDigits (+		undefined	:: Double	-- CAVEAT: the actual type could be merely 'Float', but that's currently unknown.+	)+ ) * (logBase 10 2 :: Double)++-- | Self-documentation.+type EitherNativeUIOrCECPOptions row column	= Either (Input.NativeUIOptions.NativeUIOptions row column) Input.CECPOptions.CECPOptions++-- | Defines the application's user-interface.+data UIOptions row column = MkUIOptions {+	getMoveNotation			:: Notation.MoveNotation.MoveNotation,		-- ^ The notation used to describe /move/s.+	getMaybePrintMoveTree		:: Maybe Property.Tree.Depth,			-- ^ Print the move-tree to the specified depth.+	getNDecimalDigits		:: Property.ShowFloat.NDecimalDigits,		-- ^ The precision to which fractional auxiliary data is displayed.+	getEitherNativeUIOrCECPOptions	:: EitherNativeUIOrCECPOptions row column,	-- ^ When a native display is configured some additional style-parameters are required.+	getVerbosity			:: Distribution.Verbosity.Verbosity		-- ^ Set the threshold for ancillary information-output.+} deriving Eq++instance (+	Control.DeepSeq.NFData	column,+	Control.DeepSeq.NFData	row+ ) => Control.DeepSeq.NFData (UIOptions row column) where+	rnf MkUIOptions {+		getMoveNotation			= moveNotation,+		getMaybePrintMoveTree		= maybePrintMoveTree,+		getNDecimalDigits		= nDecimalDigits,+		getEitherNativeUIOrCECPOptions	= eitherNativeUIOrCECPOptions,+		getVerbosity			= verbosity+	} = Control.DeepSeq.rnf (+		moveNotation,+		maybePrintMoveTree,+		nDecimalDigits,+		eitherNativeUIOrCECPOptions,+		verbosity+	 )++instance (Show row, Show column) => Show (UIOptions row column) where+	showsPrec _ MkUIOptions {+		getMoveNotation			= moveNotation,+		getMaybePrintMoveTree		= maybePrintMoveTree,+		getNDecimalDigits		= nDecimalDigits,+		getEitherNativeUIOrCECPOptions	= eitherNativeUIOrCECPOptions,+		getVerbosity			= verbosity+	} = Text.ShowList.showsAssociationList' $ Data.Maybe.maybe id (+		(:) . (,) printMoveTreeTag . shows+	 ) maybePrintMoveTree [+		(+			Notation.MoveNotation.tag,+			shows moveNotation+		), (+			nDecimalDigitsTag,+			shows nDecimalDigits+		),+		either (+			(,) Input.NativeUIOptions.tag . shows+		) (+			(,) Input.CECPOptions.tag . shows+		) eitherNativeUIOrCECPOptions, (+			Input.Verbosity.tag,+			shows verbosity+		)+	 ]++instance (Num row, Num column) => Data.Default.Default (UIOptions row column) where+	def = MkUIOptions {+		getMoveNotation			= Data.Default.def,+		getMaybePrintMoveTree		= Nothing,+		getNDecimalDigits		= 3,+		getEitherNativeUIOrCECPOptions	= Left Data.Default.def,+		getVerbosity			= Data.Default.def+	}++instance (+	HXT.XmlPickler	column,+	HXT.XmlPickler	row,+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => HXT.XmlPickler (UIOptions row column) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e) -> mkUIOptions a b c d e,	-- Construct.+		\MkUIOptions {+			getMoveNotation			= moveNotation,+			getMaybePrintMoveTree		= maybePrintMoveTree,+			getNDecimalDigits		= nDecimalDigits,+			getEitherNativeUIOrCECPOptions	= eitherNativeUIOrCECPOptions,+			getVerbosity			= verbosity+		} -> (+			moveNotation,+			maybePrintMoveTree,+			nDecimalDigits,+			eitherNativeUIOrCECPOptions,+			verbosity+		)+	 ) $ HXT.xp5Tuple HXT.xpickle {-MoveNotation-} (+		HXT.xpOption $ HXT.xpAttr printMoveTreeTag HXT.xpickle {-Depth-}+	 ) (+		getNDecimalDigits def `HXT.xpDefault` HXT.xpAttr nDecimalDigitsTag HXT.xpickle {-NDecimalDigits-}+	 ) (+		getEitherNativeUIOrCECPOptions def `HXT.xpDefault` Data.Either.xpickle HXT.xpickle {-NativeUIOptions-} HXT.xpickle {-CECPOptions-}+	 ) (+		getVerbosity def `HXT.xpDefault` HXT.xpickle+	 ) where+		def	= Data.Default.def++-- | Smart constructor.+mkUIOptions+	:: Notation.MoveNotation.MoveNotation	-- ^ The chess-notation used to describe /move/s.+	-> Maybe Property.Tree.Depth+	-> Property.ShowFloat.NDecimalDigits	-- ^ The precision to which fractional auxiliary data is displayed.+	-> EitherNativeUIOrCECPOptions row column+	-> Distribution.Verbosity.Verbosity	-- ^ Set the threshold for logging.+	-> UIOptions row column+mkUIOptions moveNotation maybePrintMoveTree nDecimalDigits eitherNativeUIOrCECPOptions verbosity+	| Just depth <- maybePrintMoveTree+	, depth <= 0				= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.UIOptions.mkUIOptions:\t" . showString printMoveTreeTag . Text.ShowList.showsAssociation $ shows depth " must exceed zero."+	| nDecimalDigits < 1			= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.UIOptions.mkUIOptions:\t" . showString nDecimalDigitsTag . Text.ShowList.showsAssociation $ shows nDecimalDigits " must exceed zero."+	| nDecimalDigits > maxNDecimalDigits	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Input.UIOptions.mkUIOptions:\t" . showString nDecimalDigitsTag . Text.ShowList.showsAssociation . shows nDecimalDigits . showString " shouldn't exceed " $ shows maxNDecimalDigits "."+	| (+		const False `either` const True+	) eitherNativeUIOrCECPOptions && not (+		Notation.MoveNotation.isCoordinate moveNotation+	)					= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Input.UIOptions.mkUIOptions:\t" . shows Input.CECPOptions.tag . showString " is incompatible with " . showString Notation.MoveNotation.tag . Text.ShowList.showsAssociation $ shows moveNotation "."+	| otherwise	= MkUIOptions {+		getMoveNotation			= moveNotation,+		getMaybePrintMoveTree		= maybePrintMoveTree,+		getNDecimalDigits		= nDecimalDigits,+		getEitherNativeUIOrCECPOptions	= eitherNativeUIOrCECPOptions,+		getVerbosity			= verbosity+	}++-- | Whether the chess-engine has been temporarily turned-off in order to set-up pieces.+isCECPManualMode :: UIOptions row column -> Bool+isCECPManualMode MkUIOptions { getEitherNativeUIOrCECPOptions = eitherNativeUIOrCECPOptions }	= (+	const False `either` (+		uncurry (||) . (Input.CECPOptions.getEditMode &&& Input.CECPOptions.getForceMode)+	)+ ) eitherNativeUIOrCECPOptions++-- | The type of a function used to transform 'UIOptions'.+type Transformation row column	= UIOptions row column -> UIOptions row column++-- | Mutator.+updateCECPFeature :: Input.CECPFeatures.Feature -> Transformation row column+updateCECPFeature feature uiOptions@MkUIOptions { getEitherNativeUIOrCECPOptions = eitherNativeUIOrCECPOptions }	= uiOptions {+	getEitherNativeUIOrCECPOptions	= Input.CECPOptions.updateFeature feature `fmap` eitherNativeUIOrCECPOptions+}++-- | Mutator.+deleteCECPFeature :: Input.CECPFeatures.Feature -> Transformation row column+deleteCECPFeature feature uiOptions@MkUIOptions { getEitherNativeUIOrCECPOptions = eitherNativeUIOrCECPOptions }	= uiOptions {+	getEitherNativeUIOrCECPOptions	= Input.CECPOptions.deleteFeature feature `fmap` eitherNativeUIOrCECPOptions+}+
+ src-lib/BishBosh/Input/Verbosity.hs view
@@ -0,0 +1,54 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Instance-definitions for 'Distribution.Verbosity.Verbosity'.+-}++module BishBosh.Input.Verbosity(+-- * Constants+	tag,+	range+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Distribution.Verbosity+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "verbosity"++instance Data.Default.Default Distribution.Verbosity.Verbosity where+	def	= Distribution.Verbosity.normal++instance HXT.XmlPickler Distribution.Verbosity.Verbosity where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range	-- CAVEAT: whether it'll be used as an XML-attribute or an XML-element isn't currently known.++instance Control.DeepSeq.NFData Distribution.Verbosity.Verbosity where+	rnf _	= ()++-- | The constant complete range of values.+range :: [Distribution.Verbosity.Verbosity]+range	= [minBound .. maxBound]+
+ src-lib/BishBosh/Model/DrawReason.hs view
@@ -0,0 +1,101 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Itemises the ways in which a game may be declared a draw.++	* Each reason corresponds to a rule in chess.+-}++module BishBosh.Model.DrawReason(+-- * Types+-- ** Data-types+	DrawReason(),+-- * Constants+	maximumConsecutiveRepeatablePlies,+	maximumConsecutiveRepeatablePositions,+	byAgreement,+--	fiftyMoveRule,+	seventyFiveMoveRule,+	insufficientMaterial,+	staleMate,+--	threeFoldRepetition,+	fiveFoldRepetition,+	range+) where++import qualified	BishBosh.Component.Move	as Component.Move+import qualified	Control.DeepSeq++-- | The ways in which a game can be drawn.+data DrawReason+	= ByAgreement		-- ^ Both players have agreed to a draw.+	| FiftyMoveRule		-- ^ A draw can be claimed if fifty consecutive full /move/s have occured without any capture or any @Pawn@ being moved.+	| SeventyFiveMoveRule	-- ^ Seventy-five consecutive full /move/s have occured without either capture or @Pawn@-movement; <https://chessprogramming.wikispaces.com/Repetitions#Rules-Fide Rule>.+	| InsufficientMaterial	-- ^ Neither player as the fire-power to force /check-mate/.+	| StaleMate		-- ^ The next player hasn't any legal moves, but isn't /in check/.+	| ThreeFoldRepetition	-- ^ A draw can be claimed if the same /position/ has been reached on any three occasions.+	| FiveFoldRepetition	-- ^ The same /position/ has been reached on five successive occasions.+	deriving (Eq, Read, Show)++instance Control.DeepSeq.NFData DrawReason where+	rnf _	= ()++-- | Constant.+byAgreement :: DrawReason+byAgreement	= ByAgreement++-- | Constant.+fiftyMoveRule :: DrawReason+fiftyMoveRule	= FiftyMoveRule++-- | Constant.+seventyFiveMoveRule :: DrawReason+seventyFiveMoveRule	= SeventyFiveMoveRule++-- | Constant.+insufficientMaterial :: DrawReason+insufficientMaterial	= InsufficientMaterial++-- | Constant.+staleMate :: DrawReason+staleMate	= StaleMate++-- | Constant.+threeFoldRepetition :: DrawReason+threeFoldRepetition	= ThreeFoldRepetition++-- | Constant.+fiveFoldRepetition :: DrawReason+fiveFoldRepetition	= FiveFoldRepetition++-- | The constant range of possible values.+range :: [DrawReason]+range	= [byAgreement, fiftyMoveRule, seventyFiveMoveRule, insufficientMaterial, staleMate, threeFoldRepetition, fiveFoldRepetition]++-- | The number of consecutive plies required to trigger a draw by the seventy-five move rule.+maximumConsecutiveRepeatablePlies :: Component.Move.NMoves+maximumConsecutiveRepeatablePlies	= Component.Move.nPliesPerMove * 75++-- | The number of consecutive repeatable positions required for a draw by the five-fold repetition rule.+maximumConsecutiveRepeatablePositions :: Component.Move.NMoves+maximumConsecutiveRepeatablePositions	= 5
+ src-lib/BishBosh/Model/Game.hs view
@@ -0,0 +1,1592 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* This module augments "State.Board" with the history of the game.++	* It therefore understands not only the current state of the /board/, but also; whose turn it is, whether /Castling/ has occured, which @Pawn@s have been /promoted/, when /piece/s were taken.++	* Moves made in this domain conform to the rules of chess, c.f. those made in "State.Board".+-}++module BishBosh.Model.Game(+-- * Types+-- ** Type-synonyms+	NGames,+--	InstancesByPosition,+--	AvailableQualifiedMoves,+--	AvailableQualifiedMovesByLogicalColour,+	Transformation,+-- ** Data-types+	Game(+--		MkGame,+		getNextLogicalColour,+		getCastleableRooksByLogicalColour,+		getBoard,+		getTurnsByLogicalColour,+		getMaybeChecked,+		getInstancesByPosition,+		getAvailableQualifiedMovesByLogicalColour,+		getMaybeTerminationReason+	),+-- * Functions+--	inferMaybeTerminationReason,+	countMovesAvailableTo,+	rollBack,+--	listMaybePromotionRanks,+--	listQualifiedMovesAvailableTo,+	sortAvailableQualifiedMoves,+	findQualifiedMovesAvailableTo,+	findQualifiedMovesAvailableToNextPlayer,+	listTurns,+	listTurnsChronologically,+	maybeLastTurn,+--	findAvailableCastlingMoves,+	validateQualifiedMove,+	validateEitherQualifiedMove,+	incrementalHash,+-- ** Constructors+	mkPosition,+--	mkInstancesByPosition,+	mkGame,+	fromBoard,+	mkAvailableQualifiedMovesFor,+-- ** Mutators+	takeTurn,+	applyQualifiedMove,+	applyEitherQualifiedMove,+	applyEitherQualifiedMoves,+	updateTerminationReasonWith,+--	resignationBy,+	resign,+--	agreeToADraw,+-- ** Predicates+	isValidQualifiedMove,+	isValidEitherQualifiedMove,+	isTerminated,+	cantConverge,+	(=~),+	(/~)+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Vector			as Cartesian.Vector+import qualified	BishBosh.Component.EitherQualifiedMove		as Component.EitherQualifiedMove+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Model.DrawReason			as Model.DrawReason+import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason+import qualified	BishBosh.Model.Result				as Model.Result+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Null				as Property.Null+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Orientated			as Property.Orientated+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.State.CastleableRooksByLogicalColour	as State.CastleableRooksByLogicalColour+import qualified	BishBosh.State.Censor				as State.Censor+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour	as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.EnPassantAbscissa		as State.EnPassantAbscissa+import qualified	BishBosh.State.InstancesByPosition		as State.InstancesByPosition+import qualified	BishBosh.State.MaybePieceByCoordinates		as State.MaybePieceByCoordinates+import qualified	BishBosh.State.Position				as State.Position+import qualified	BishBosh.State.TurnsByLogicalColour		as State.TurnsByLogicalColour+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.Triple++infix 4 =~, /~	-- Same as (==) & (/=).++-- | A number of games.+type NGames	= Int++{- |+	* Focus the polymorphic key-type used by 'State.InstancesByPosition.InstancesByPosition'.++	* N.B. ideally a hash of the position would be used as the key,+	but to achieve that the same random numbers from which it is constructed, would have to be passed to 'takeTurn' throughout the life-time of the 'Game'.+	Regrettably, class-instances can only use @ Data.Default.def :: Zobrist @, which must then be assumed by the users of all methods.+	Building 'Zobrist' into 'Game' would break the instance of 'Eq'.+	Building a hash-constructor into 'Game' would break the instance of @ (Eq, Read, Show) @.+-}+type InstancesByPosition x y	= State.InstancesByPosition.InstancesByPosition (State.Position.Position x y)++-- | The /move/s available to one player, indexed by the source-/coordinates/ of the /move/.+type AvailableQualifiedMoves x y	= Data.Map.Map (+	Cartesian.Coordinates.Coordinates x y	-- Source.+ ) [+	(+		Cartesian.Coordinates.Coordinates x y,	-- Destination.+		Attribute.MoveType.MoveType+	)+ ]++-- | Sort the lists of destinations to faciliate testing for equality.+sortAvailableQualifiedMoves :: (Ord x, Ord y) => AvailableQualifiedMoves x y -> AvailableQualifiedMoves x y+sortAvailableQualifiedMoves	= Data.Map.map . Data.List.sortBy $ Data.Ord.comparing fst {-destination-}++-- | The /move/s available to both players.+type AvailableQualifiedMovesByLogicalColour x y	= Data.Map.Map Attribute.LogicalColour.LogicalColour (AvailableQualifiedMoves x y)++{- |+	* The first three fields represent the state of the /game/.++	* These are augmented by the /game/'s history, i.e. the sequence of /move/s.++	* For efficiency the list of available /move/s is stored.+-}+data Game x y	= MkGame {+	getNextLogicalColour				:: Attribute.LogicalColour.LogicalColour,					-- ^ N.B.: can be derived from 'getTurnsByLogicalColour', unless 'reflectByX' has been called.+	getCastleableRooksByLogicalColour		:: State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x,	-- ^ Those @Rook@s which can still participate in castling.+	getBoard					:: State.Board.Board x y,							-- ^ The current state of the /board/.+	getTurnsByLogicalColour				:: State.CastleableRooksByLogicalColour.TurnsByLogicalColour x y,		-- ^ Successive /move/s & any /piece/ taken, recorded by player.+	getMaybeChecked					:: Maybe Attribute.LogicalColour.LogicalColour,					-- ^ The player (if any), whose currently /checked/; which will typically be 'getNextLogicalColour', but 'listQualifiedMovesAvailableTo' can be called for either player.+	getInstancesByPosition				:: InstancesByPosition x y,							-- ^ The number of instances of various positions since the last unrepeatable move.+	getAvailableQualifiedMovesByLogicalColour	:: AvailableQualifiedMovesByLogicalColour x y,					-- ^ The /move/s available to each player. Since this is merely required for efficiency, it needn't have an entry for both players; & typically doesn't when checked, since radical pruning would otherwise be required. CAVEAT: doesn't account for game-termination.+	getMaybeTerminationReason			:: Maybe Model.GameTerminationReason.GameTerminationReason			-- ^ The reason (where appropriate) why the game was terminated.+}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Eq (Game x y) where+	MkGame {+		getNextLogicalColour				= nextLogicalColour,+		getCastleableRooksByLogicalColour		= castleableRooksByLogicalColour,+		getBoard					= board,+		getTurnsByLogicalColour				= turnsByLogicalColour,+		getMaybeChecked					= maybeChecked,+		getInstancesByPosition				= instancesByPosition,+		getAvailableQualifiedMovesByLogicalColour	= availableQualifiedMovesByLogicalColour,+		getMaybeTerminationReason			= maybeTerminationReason+	} == MkGame {+		getNextLogicalColour				= nextLogicalColour',+		getCastleableRooksByLogicalColour		= castleableRooksByLogicalColour',+		getBoard					= board',+		getTurnsByLogicalColour				= turnsByLogicalColour',+		getMaybeChecked					= maybeChecked',+		getInstancesByPosition				= instancesByPosition',+		getAvailableQualifiedMovesByLogicalColour	= availableQualifiedMovesByLogicalColour',+		getMaybeTerminationReason			= maybeTerminationReason'+	} = (+		nextLogicalColour,+		castleableRooksByLogicalColour,+		board,+		turnsByLogicalColour,+		maybeChecked,+		instancesByPosition,+		Data.Map.map sortAvailableQualifiedMoves availableQualifiedMovesByLogicalColour,+		maybeTerminationReason+	 ) == (+		nextLogicalColour',+		castleableRooksByLogicalColour',+		board',+		turnsByLogicalColour',+		maybeChecked',+		instancesByPosition',+		Data.Map.map sortAvailableQualifiedMoves availableQualifiedMovesByLogicalColour',+		maybeTerminationReason'+	 )++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (Game x y) where+	rnf MkGame {+		getNextLogicalColour				= nextLogicalColour,+		getCastleableRooksByLogicalColour		= castleableRooksByLogicalColour,+		getBoard					= board,+		getTurnsByLogicalColour				= turnsByLogicalColour,+		getMaybeChecked					= maybeChecked,+		getInstancesByPosition				= instancesByPosition,+		getAvailableQualifiedMovesByLogicalColour	= availableQualifiedMovesByLogicalColour,+		getMaybeTerminationReason			= maybeTerminationReason+	} = Control.DeepSeq.rnf (+		nextLogicalColour,+		castleableRooksByLogicalColour,+		board,+		turnsByLogicalColour,+		maybeChecked,+		instancesByPosition,+		availableQualifiedMovesByLogicalColour,+		maybeTerminationReason+	 ) -- Represent as a tuple.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Show (Game x y) where+	showsPrec _ MkGame {+		getBoard			= board,+		getTurnsByLogicalColour		= turnsByLogicalColour,+		getMaybeTerminationReason	= maybeTerminationReason+	} = shows (+		board,+		turnsByLogicalColour,+		maybeTerminationReason+	 ) -- Represent as a tuple those fields which can't be inferred.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y,+	Show	x,+	Show	y+ ) => Read (Game x y) where+	{-# SPECIALISE instance Read (Game T.X T.Y) #-}+	readsPrec _	= map (+		Control.Arrow.first $ \(+			board,+			turnsByLogicalColour,+			maybeTerminationReason+		) {-tuple-} -> let+			game = (+				uncurry mkGame (+					State.TurnsByLogicalColour.inferNextLogicalColour &&& State.CastleableRooksByLogicalColour.fromTurnsByLogicalColour $ turnsByLogicalColour+				) board turnsByLogicalColour+			 ) {+				getInstancesByPosition		= mkInstancesByPosition game,+				getMaybeTerminationReason	= maybeTerminationReason+			}+		in game+	 ) . reads++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Data.Default.Default (Game x y) where+	{-# SPECIALISE instance Data.Default.Default (Game T.X T.Y) #-}+	def = (+		mkGame Attribute.LogicalColour.White Data.Default.def {-castleableRooksByLogicalColour-} Data.Default.def {-board-} Data.Default.def {-turnsByLogicalColour-}+	 ) {+		getMaybeChecked					= Nothing,+		getAvailableQualifiedMovesByLogicalColour	= Data.Map.fromAscList $ map (+			id &&& (`mkAvailableQualifiedMovesFor` Data.Default.def {-game-})+		) Attribute.LogicalColour.range+	}++-- CAVEAT: some information is lost during 'showsFEN', which can't subsequently be recovered by 'readsFEN'.+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Read	x,+	Read	y,+	Show	x,+	Show	y+ ) => Property.ForsythEdwards.ReadsFEN (Game x y) where+	{-# SPECIALISE instance Property.ForsythEdwards.ReadsFEN (Game T.X T.Y) #-}+	readsFEN s	= [+		(+			mkGame nextLogicalColour castleableRooksByLogicalColour board turnsByLogicalColour,+			remainder	-- En-passant target, half-move clock, full-move number.+		) |+			(board, s1)				<- Property.ForsythEdwards.readsFEN s,+			(nextLogicalColour, s2)			<- Property.ForsythEdwards.readsFEN s1,+			(castleableRooksByLogicalColour, s3)	<- Property.ForsythEdwards.readsFEN s2,+			(turnsByLogicalColour, remainder)	<- case Data.List.Extra.trimStart s3 of+				'-' : remainder	-> [(Property.Empty.empty {-TurnsByLogicalColour-}, remainder)]+				s4		-> Control.Arrow.first (+					\enPassantDestination -> let+						opponentsLogicalColour	= Property.Opposable.getOpposite nextLogicalColour+					 in State.TurnsByLogicalColour.fromAssocs [+						(+							nextLogicalColour,+							[]+						), (+							opponentsLogicalColour,+							[+								Component.Turn.mkTurn (+									Component.QualifiedMove.mkQualifiedMove (+										uncurry Component.Move.mkMove $ (+											uncurry Cartesian.Coordinates.retreat &&& uncurry Cartesian.Coordinates.advance+										) (opponentsLogicalColour, enPassantDestination)	-- Construct a Pawn double-advance.+									) Data.Default.def {-move-type-}+								 ) Attribute.Rank.Pawn+							] -- Singleton.+						) -- Pair.+					]+				 ) `map` reads s4+	 ] -- List-comprehension.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ShowsFEN (Game x y) where+	showsFEN game@MkGame {+		getNextLogicalColour			= nextLogicalColour,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+		getBoard				= board,+		getTurnsByLogicalColour			= turnsByLogicalColour,+		getInstancesByPosition			= instancesByPosition+	 } = Text.ShowList.showsDelimitedList Property.ForsythEdwards.showsSeparator id id [+		Property.ForsythEdwards.showsFEN board,					-- Placement of pieces.+		Property.ForsythEdwards.showsFEN nextLogicalColour,			-- Active colour.+		Property.ForsythEdwards.showsFEN castleableRooksByLogicalColour,	-- Castling availability.+		Data.Maybe.maybe Property.ForsythEdwards.showsNullField (+			\turn -> if Component.Turn.isPawnDoubleAdvance (Property.Opposable.getOpposite nextLogicalColour) turn+				then Notation.MoveNotation.showsNotation Data.Default.def {-Smith is the same as the required Algebraic notation in this limited role-} . Cartesian.Coordinates.advance nextLogicalColour . Component.Move.getDestination . Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove turn+				else Property.ForsythEdwards.showsNullField+		) $ maybeLastTurn game,	-- En-passant target square. CAVEAT: in contrast to X-FEN, the opponent isn't required to have a Pawn in position to take en-passant.+		shows $ State.InstancesByPosition.countConsecutiveRepeatablePlies instancesByPosition,	-- Half move clock.+		shows . succ {-the full-move count starts at '1', before any move has occurred-} . length $ State.TurnsByLogicalColour.dereference Attribute.LogicalColour.Black turnsByLogicalColour	-- Full move number.+	 ]++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Property.Empty.Empty (Game x y) where+	{-# SPECIALISE instance Property.Empty.Empty (Game T.X T.Y) #-}+	empty	= Data.Default.def	-- i.e. zero turns have been taken, rather than zero pieces remain (which is illegal).++instance Property.Null.Null (Game x y) where+	isNull MkGame { getTurnsByLogicalColour = turnsByLogicalColour }	= Property.Null.isNull turnsByLogicalColour++{- |+	* Create an alternative game in which @Black@ moved first; <https://chessprogramming.wikispaces.com/Color+Flipping>++	* N.B.: 'Property.Reflectable.ReflectableOnY' isn't implemented,+	since /reflectOnY/ produces a mirror-image /board/ in which the royal /piece/s start in a non-standard position & castling occurs the wrong way.+-}+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Property.Reflectable.ReflectableOnX (Game x y) where+	{-# SPECIALISE instance Property.Reflectable.ReflectableOnX (Game T.X T.Y) #-}+	reflectOnX MkGame {+		getNextLogicalColour			= nextLogicalColour,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+		getBoard				= board,+		getTurnsByLogicalColour			= turnsByLogicalColour,+		getInstancesByPosition			= instancesByPosition,+		getMaybeTerminationReason		= maybeTerminationReason+	} = (+		mkGame (+			Property.Opposable.getOpposite nextLogicalColour+		) (+			Property.Reflectable.reflectOnX castleableRooksByLogicalColour+		) (+			Property.Reflectable.reflectOnX board+		) (+			Property.Reflectable.reflectOnX turnsByLogicalColour+		)+	 ) {+		getInstancesByPosition		= Property.Reflectable.reflectOnX instancesByPosition,+		getMaybeTerminationReason	= fmap Property.Opposable.getOpposite maybeTerminationReason+	}++instance (Data.Array.IArray.Ix x, Enum x, Enum y, Ord y) => Component.Zobrist.Hashable2D Game x y {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms2D game@MkGame {+		getNextLogicalColour			= nextLogicalColour,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+		getBoard				= board+	} zobrist	= (+		if Attribute.LogicalColour.isBlack nextLogicalColour+			then (Component.Zobrist.getRandomForBlacksMove zobrist :)+			else id+	 ) . Data.Maybe.maybe id (+		(++) . (`Component.Zobrist.listRandoms1D` zobrist)+	 ) (+		maybeLastTurn game >>= State.EnPassantAbscissa.mkMaybeEnPassantAbscissa nextLogicalColour (+			State.Board.getMaybePieceByCoordinates board+		)+	 ) $ Component.Zobrist.listRandoms1D castleableRooksByLogicalColour zobrist ++ Component.Zobrist.listRandoms2D board zobrist++-- | Smart constructor.+mkGame :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The player who is required to move next.+	-> State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x+	-> State.Board.Board x y+	-> State.CastleableRooksByLogicalColour.TurnsByLogicalColour x y+	-> Game x y+{-# SPECIALISE mkGame :: Attribute.LogicalColour.LogicalColour -> State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour T.X -> State.Board.Board T.X T.Y -> State.CastleableRooksByLogicalColour.TurnsByLogicalColour T.X T.Y -> Game T.X T.Y #-}+mkGame nextLogicalColour castleableRooksByLogicalColour board turnsByLogicalColour+	| not . State.Censor.hasBothKings $ State.Board.getCoordinatesByRankByLogicalColour board	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Model.Game.mkGame:\tboth Kings must exist; " $ shows board "."+	| State.Board.isKingChecked (+		Property.Opposable.getOpposite nextLogicalColour+	) board		= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Model.Game.mkGame:\tthe player who last moved, is still checked; " $ shows board "."+	| otherwise	= game+	where+		game = MkGame {+			getNextLogicalColour				= nextLogicalColour,+			getCastleableRooksByLogicalColour		= castleableRooksByLogicalColour,+			getBoard					= board,+			getTurnsByLogicalColour				= turnsByLogicalColour,+			getMaybeChecked					= Data.List.find (`State.Board.isKingChecked` board) Attribute.LogicalColour.range,+			getInstancesByPosition				= State.InstancesByPosition.mkSingleton $ mkPosition game,+			getAvailableQualifiedMovesByLogicalColour	= Data.Map.fromAscList [+				(logicalColour, mkAvailableQualifiedMovesFor logicalColour game) |+					logicalColour	<- Attribute.LogicalColour.range,+					Data.Maybe.maybe True (/= logicalColour) $ getMaybeChecked game	-- Define the available qualified moves for unchecked players only.+			], -- List-comprehension.+			getMaybeTerminationReason			= inferMaybeTerminationReason game+		}++{- | Constructor.+	For convenience, the following assumptions are made in the absence of any move-history:++		* The next player's /logical colour/ is assumed to be @White@;++		* Provided that the @King@ is at its starting /coordinates/, then all @Rook@s which exist at their starting /coordinates/ are considered to be castleable;++		* There're zero previous turns.+-}+fromBoard :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => State.Board.Board x y -> Game x y+{-# SPECIALISE fromBoard :: State.Board.Board T.X T.Y -> Game T.X T.Y #-}+fromBoard board	= mkGame Attribute.LogicalColour.White (+	State.CastleableRooksByLogicalColour.fromBoard board+ ) board Property.Empty.empty {-TurnsByLogicalColour-}++-- | Gets the sequence of /turn/s, with the latest at the head & the opening one last.+listTurns :: Game x y -> [Component.Turn.Turn x y]+listTurns MkGame {+	getNextLogicalColour	= nextLogicalColour,+	getTurnsByLogicalColour	= turnsByLogicalColour+} = uncurry ToolShed.Data.List.interleave $ (+	State.TurnsByLogicalColour.dereference (Property.Opposable.getOpposite nextLogicalColour) &&& State.TurnsByLogicalColour.dereference nextLogicalColour+ ) turnsByLogicalColour++-- | Gets the sequence of /turn/s in the order they occured.+listTurnsChronologically :: Game x y -> [Component.Turn.Turn x y]+listTurnsChronologically	= reverse . listTurns++-- | The last /turn/, if there was one.+maybeLastTurn :: Game x y -> Maybe (Component.Turn.Turn x y)+maybeLastTurn MkGame {+	getNextLogicalColour	= nextLogicalColour,+	getTurnsByLogicalColour	= turnsByLogicalColour+} = Data.Maybe.listToMaybe $ State.TurnsByLogicalColour.dereference (+	Property.Opposable.getOpposite nextLogicalColour+ ) turnsByLogicalColour++{- |+	* Returns the castling /move/s currently available to the @King@ of the specified /logical colour/.++	* N.B.: only the @King@'s component of the /move/ is returned.++	* CAVEAT: this is a performance-hotspot; refactor => re-profile.+-}+findAvailableCastlingMoves :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Attribute.LogicalColour.LogicalColour -> Game x y -> [Component.QualifiedMove.QualifiedMove x y]+{-# SPECIALISE findAvailableCastlingMoves :: Attribute.LogicalColour.LogicalColour -> Game T.X T.Y -> [Component.QualifiedMove.QualifiedMove T.X T.Y] #-}+findAvailableCastlingMoves logicalColour MkGame {+	getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+	getBoard				= board,+	getMaybeChecked				= maybeChecked+}+	| Just checkedLogicalColour	<- maybeChecked+	, checkedLogicalColour == logicalColour	= []	-- One can't Castle out of check.+	| Just rooksStartingXs	<- State.CastleableRooksByLogicalColour.locateForLogicalColour logicalColour castleableRooksByLogicalColour	= [+		Component.QualifiedMove.mkQualifiedMove castlingKingsMove moveType |+			x							<- rooksStartingXs,+			(moveType, castlingKingsMove, castlingRooksMove)	<- Component.Move.castlingMovesByLogicalColour ! logicalColour,+			let castlingRooksSource	= Component.Move.getSource castlingRooksMove,+			Cartesian.Coordinates.getX castlingRooksSource == x,+			State.MaybePieceByCoordinates.isClear (+				Cartesian.Coordinates.kingsStartingCoordinates logicalColour+			) castlingRooksSource $ State.Board.getMaybePieceByCoordinates board,+			all (+				null . ($ board) . State.Board.findAttackersOf logicalColour+			) $ Component.Move.interpolate castlingKingsMove	-- The King mustn't be checked anywhere alongs its route.+	] {-list-comprehension-}+	| otherwise	= [] {-have already Castled-}++-- | List any /rank/s to which the specified /piece/ can be promoted on moving to the specified /destination/.+listMaybePromotionRanks+	:: (Enum y, Eq y)+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> Component.Piece.Piece+	-> [Maybe Attribute.Rank.Rank]+{-# INLINE listMaybePromotionRanks #-}+listMaybePromotionRanks destination piece+	| Component.Piece.isPawnPromotion destination piece	= map Just Attribute.Rank.promotionProspects+	| otherwise						= [Nothing]++-- | The type of a function which transforms a /game/.+type Transformation x y	= Game x y -> Game x y++{- |+	* Moves the referenced /piece/ between the specified /coordinates/.++	* As a result of the /turn/, the next logical-colour is changed, the /move/s available to each player are updated, & any reason for game-termination recorded.++	* CAVEAT: no validation of the /turn/ is performed since the /move/ may have been automatically selected & therefore known to be valid.++	* CAVEAT: doesn't account for any previous game-termination when updating 'getAvailableQualifiedMovesByLogicalColour'.+-}+takeTurn :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Component.Turn.Turn x y -> Transformation x y+{-# SPECIALISE takeTurn :: Component.Turn.Turn T.X T.Y -> Transformation T.X T.Y #-}+takeTurn turn game@MkGame {+	getNextLogicalColour				= nextLogicalColour,+	getCastleableRooksByLogicalColour		= castleableRooksByLogicalColour,+	getBoard					= board,+	getTurnsByLogicalColour				= turnsByLogicalColour,+	getInstancesByPosition				= instancesByPosition,+	getAvailableQualifiedMovesByLogicalColour	= availableQualifiedMovesByLogicalColour+} = Control.Exception.assert (+	not $ isTerminated game	-- CAVEAT: otherwise any resignation will be overwritten.+ ) game' where+	((move, moveType), sourceRank)	= (Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType) . Component.Turn.getQualifiedMove &&& Component.Turn.getRank $ turn	-- Deconstruct.+	(source, destination)		= Component.Move.getSource &&& Component.Move.getDestination $ move	-- Deconstruct.++	opponentsLogicalColour :: Attribute.LogicalColour.LogicalColour+	opponentsLogicalColour	= Property.Opposable.getOpposite nextLogicalColour++	inferredRooksMove+		| Just (_, _, rooksMove) <- Data.List.find (+			\(_, kingsMove, _) -> kingsMove == move+		) $ Component.Move.castlingMovesByLogicalColour ! nextLogicalColour	-- CAVEAT: use 'isCastle' to guard calls to this function.+		= rooksMove+		| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.Model.Game.takeTurn:\tfailed to find any Rook's move corresponding to " $ shows (move, moveType) "."++	board'	= (+		if Attribute.MoveType.isCastle moveType+			then State.Board.movePiece inferredRooksMove $ Just Data.Default.def {-move-type for the Rook's component of the Castling-}+			else id+	 ) $ State.Board.movePiece move (Just moveType) board++	maybePieceByCoordinates'	= State.Board.getMaybePieceByCoordinates board'	-- Deconstruct.++	game' = game {+		getNextLogicalColour				= opponentsLogicalColour,+		getCastleableRooksByLogicalColour		= State.CastleableRooksByLogicalColour.takeTurn nextLogicalColour turn castleableRooksByLogicalColour,+		getBoard					= board',+		getTurnsByLogicalColour				= State.TurnsByLogicalColour.prepend nextLogicalColour turn turnsByLogicalColour,+		getMaybeChecked					= Data.List.find (`State.Board.isKingChecked` board') [opponentsLogicalColour],+		getInstancesByPosition				= State.InstancesByPosition.insertPosition (Component.Turn.getIsRepeatableMove turn) (mkPosition game') instancesByPosition,+		getAvailableQualifiedMovesByLogicalColour	= let+			moveEndpoints	= (+				case moveType of+					Attribute.MoveType.Castle _	-> (++) [+						Component.Move.getSource inferredRooksMove,+						Component.Move.getDestination inferredRooksMove+					 ] -- The move-type of a move by the Castler's opponent, to either of the corresponding Rook's end-points, has now changed.+					Attribute.MoveType.EnPassant	-> (Cartesian.Coordinates.retreat nextLogicalColour destination :)	-- An opposing piece may have been blocked by their own Pawn, which has just been taken En-passant.+					_				-> id+			 ) [source, destination]++			kingsByCoordinates	= map (+				(`State.CoordinatesByRankByLogicalColour.getKingsCoordinates` State.Board.getCoordinatesByRankByLogicalColour board') &&& Component.Piece.mkKing+			 ) Attribute.LogicalColour.range++			(affected, affected')	= (+				Data.List.nub . (:) (+					destination,+					Component.Piece.mkPiece nextLogicalColour . Data.Maybe.fromMaybe sourceRank $ Attribute.Rank.getMaybePromotionRank moveType+				) *** Data.List.nub+			 ) . Data.List.partition (+				(== nextLogicalColour) . Component.Piece.getLogicalColour . snd {-piece-}+			 ) . (+				if Component.Turn.isPawnDoubleAdvance nextLogicalColour turn+					then (++) [+						(pawnCoordinates, oppositePiece) |+							let oppositePiece	= Component.Piece.mkPiece opponentsLogicalColour sourceRank,+							pawnCoordinates	<- Cartesian.Coordinates.getAdjacents destination,+							Data.Maybe.maybe False (== oppositePiece) . State.MaybePieceByCoordinates.dereference pawnCoordinates $ State.Board.getMaybePieceByCoordinates board	-- Find any opposing Pawn which can capture En-passant.+					] {-list-comprehension-}+					else id+			 ) $ kingsByCoordinates {-moves available to either King may be constrained or liberated, even if misaligned with move-endpoints-} ++ [+				(knightsCoordinates, Component.Piece.mkKnight knightsColour) |+					knightsColour		<- Attribute.LogicalColour.range,	-- The moves for one's own Knights may be have been blocked by a friendly piece occupying an end-point, whereas the moves for opposing Knights will have a new move-type.+					moveEndpoint		<- moveEndpoints,+					knightsCoordinates	<- State.Board.findProximateKnights knightsColour moveEndpoint board'+			 ] {-list-comprehension-} ++ (+				if sourceRank == Attribute.Rank.King+					then [+						(blockingCoordinates, blockingPiece) |+							(kingsCoordinates, _)			<- kingsByCoordinates,+							direction				<- Attribute.Direction.range,+							(blockingCoordinates, blockingPiece)	<- Data.Maybe.maybeToList $ State.MaybePieceByCoordinates.findBlockingPiece direction kingsCoordinates maybePieceByCoordinates'+					] -- List-comprehension. Re-evaluate the moves available to all pieces aligned with a King.+					else [+						(blockingCoordinates, blockingPiece) |+							(kingsCoordinates, _)			<- kingsByCoordinates,+							moveEndpoint				<- moveEndpoints,+							direction				<- Data.Maybe.maybeToList $ Cartesian.Vector.toMaybeDirection (+								Cartesian.Vector.measureDistance kingsCoordinates moveEndpoint	:: Cartesian.Vector.VectorInt+							), -- N.B. null when the King isn't aligned with any move-endpoint.+							let findBlockingPieceFrom coordinates	= State.MaybePieceByCoordinates.findBlockingPiece direction coordinates maybePieceByCoordinates',+							(blockingCoordinates, blockingPiece)	<- Data.Maybe.maybeToList $ (+								\pair@(coordinates, _) -> if coordinates /= destination+									then Just pair+									else {-blocker is destination-} if Data.Maybe.maybe False (== direction) $ Cartesian.Vector.toMaybeDirection (+										Cartesian.Vector.measureDistance kingsCoordinates source	:: Cartesian.Vector.VectorInt+									)+										then Nothing+										else findBlockingPieceFrom coordinates	-- Look through the destination to the previous blocker; which might be the source.+							) =<< findBlockingPieceFrom kingsCoordinates+					] -- List-comprehension. Re-evaluate the moves available to all pieces aligned with a King & a move-endpoint.+			 ) ++ [+				(coordinates, affectedPiece) |+					moveEndpoint			<- moveEndpoints,+					direction			<- Attribute.Direction.range,+					(coordinates, affectedPiece)	<- Data.Maybe.maybeToList $ State.MaybePieceByCoordinates.findBlockingPiece direction moveEndpoint maybePieceByCoordinates',+					coordinates /= destination,	-- Added above.+					not . uncurry (||) $ (Component.Piece.isKnight &&& Component.Piece.isKing) affectedPiece,	-- Added above.+					Component.Piece.canMoveBetween coordinates moveEndpoint affectedPiece+			 ] -- List-comprehension. Re-evaluate the moves available to all pieces, which either could move to the source, or can now move to the destination, of the requested move.++			insertMovesFrom	= foldr $ \(source', piece') -> let+				logicalColour			= Component.Piece.getLogicalColour piece'+				isSafeDestination destination'	= not $ State.Board.exposesKing logicalColour (Component.Move.mkMove source' destination') board'+			 in case [+				(destination', Attribute.MoveType.EnPassant) |+					Cartesian.Coordinates.isEnPassantRank logicalColour source',+					Component.Piece.isPawn piece',+					destination'	<- Component.Piece.findAttackDestinations source' piece',+					State.MaybePieceByCoordinates.isVacant destination' maybePieceByCoordinates',+					uncurry (&&) . (+						Data.Maybe.maybe False {-unoccupied-} (== Property.Opposable.getOpposite piece') . (+							`State.MaybePieceByCoordinates.dereference` maybePieceByCoordinates'+						) &&& (== move) . Component.Move.mkMove (Cartesian.Coordinates.advance logicalColour destination')+					) $ Cartesian.Coordinates.retreat logicalColour destination',	-- Did an opposing Pawn just double-advance to the expected position ?+					isSafeDestination destination'+			 ] {-list-comprehension-} ++ [+				(+					destination',+					Attribute.MoveType.mkNormalMoveType maybeTakenRank maybePromotionRank+				) |+					(destination', maybeTakenRank)	<- State.MaybePieceByCoordinates.listDestinationsFor source' piece' maybePieceByCoordinates',+					Data.Maybe.maybe True {-unoccupied-} (/= Attribute.Rank.King) maybeTakenRank,	-- This move can never be made; the option will either be immediately removed or check-mate declared.+					isSafeDestination destination',+					maybePromotionRank		<- listMaybePromotionRanks destination' piece'+			 ] {-list-comprehension-} of+				[]			-> Data.Map.delete source'				-- There're zero moves from here.+				qualifiedDestinations	-> Data.Map.insert source' qualifiedDestinations	-- Overwrite any existing moves.++			insertCastlingMoves logicalColour	= case findAvailableCastlingMoves logicalColour game' of+				[]			-> id+				validCastlingMoves	-> uncurry (+					Data.Map.insertWith (++)+				 ) $ (+					Component.Move.getSource {-the King-} . Component.QualifiedMove.getMove . head &&& map (+						Component.Move.getDestination . Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType+					)+				 ) validCastlingMoves+		in (+			\availableQualifiedMovesByLogicalColour' -> (+				case (Data.Map.member opponentsLogicalColour availableQualifiedMovesByLogicalColour', Data.Maybe.isJust $ getMaybeChecked game') of+					(True, True)	-> Data.Map.delete opponentsLogicalColour	-- Many changes result from the King being checked.+					(True, _)	-> Data.Map.adjust (+						insertCastlingMoves opponentsLogicalColour . (+							`insertMovesFrom` affected'	-- Reconstruct any moves for affected pieces.+						) . (+							if Attribute.MoveType.isEnPassant moveType+								then Data.Map.delete $ Cartesian.Coordinates.retreat nextLogicalColour destination+								else id+						) . Data.Map.delete destination	-- Delete the moves originally available to any taken piece.+					 ) opponentsLogicalColour+					(_, True)	-> id	-- We neither want an entry in the map, nor is there one.+					_		-> Data.Map.insert opponentsLogicalColour $ mkAvailableQualifiedMovesFor opponentsLogicalColour game'	-- Reconstruct.+			) availableQualifiedMovesByLogicalColour'+		) $ (+			if Data.Maybe.maybe True {-not a member-} (+				\availableQualifiedMoves -> sourceRank == Attribute.Rank.King || Data.Maybe.maybe False {-zero previous turns-} (+					Component.Turn.isPawnDoubleAdvance opponentsLogicalColour+				) (+					maybeLastTurn game	-- I.E. one's opponent.+				) {-only required for efficiency-} && Data.Foldable.any (+					any $ Attribute.MoveType.isEnPassant . snd {-moveType-}+				) availableQualifiedMoves+			) $ Data.Map.lookup nextLogicalColour availableQualifiedMovesByLogicalColour+				then Data.Map.insert nextLogicalColour $ mkAvailableQualifiedMovesFor nextLogicalColour game'	-- Reconstruct.+				else Data.Map.adjust (+					insertCastlingMoves nextLogicalColour . (+						`insertMovesFrom` affected	-- Reconstruct any moves for affected pieces.+					) . Data.Map.delete source		-- Delete the moves originally available to the moved piece.+				) nextLogicalColour+		) availableQualifiedMovesByLogicalColour,+		getMaybeTerminationReason	= inferMaybeTerminationReason game'	-- CAVEAT: this will overwrite any previous resignation.+	}++-- | Construct a /turn/ & relay the request to 'takeTurn'.+applyQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Component.QualifiedMove.QualifiedMove x y -> Transformation x y+{-# SPECIALISE applyQualifiedMove :: Component.QualifiedMove.QualifiedMove T.X T.Y -> Transformation T.X T.Y #-}+applyQualifiedMove qualifiedMove game@MkGame { getBoard = board }+	| Just piece	<- State.MaybePieceByCoordinates.dereference (Component.Move.getSource move) $ State.Board.getMaybePieceByCoordinates board+	= takeTurn (Component.Turn.mkTurn qualifiedMove $ Component.Piece.getRank piece) game+	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.Model.Game.applyQualifiedMove:\tthere isn't a piece at the source of " . shows move . showString "; " $ shows game "."+	where+		move	= Component.QualifiedMove.getMove qualifiedMove++-- | Construct a /qualifiedMove/ & relay the request to "applyQualifiedMove".+applyEitherQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Component.EitherQualifiedMove.EitherQualifiedMove x y -> Transformation x y+{-# SPECIALISE applyEitherQualifiedMove :: Component.EitherQualifiedMove.EitherQualifiedMove T.X T.Y -> Transformation T.X T.Y #-}+applyEitherQualifiedMove eitherQualifiedMove game@MkGame { getBoard = board } = applyQualifiedMove (+	Component.QualifiedMove.mkQualifiedMove move $ either (+		($ State.Board.getMaybePieceByCoordinates board) . State.MaybePieceByCoordinates.inferMoveType move+	) id $ Component.EitherQualifiedMove.getPromotionRankOrMoveType eitherQualifiedMove+ ) game where+	move	= Component.EitherQualifiedMove.getMove eitherQualifiedMove++-- | Constructs /eitherQualifiedMove/s from the data provided, validating & applying each in the specified order.+applyEitherQualifiedMoves :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> (a -> Either String (Component.EitherQualifiedMove.EitherQualifiedMove x y))	-- ^ A constructor which can return an error-message.+	-> Game x y									-- ^ The /game/ to which the /move/s should be sequentially applied.+	-> [a]										-- ^ An ordered sequence of data from which /move/s are constructed.+	-> Either (a, String) (Game x y)						-- ^ Either a rogue datum & the corresponding error-message, or the resulting /game/.+{-# SPECIALISE applyEitherQualifiedMoves :: (a -> Either String (Component.EitherQualifiedMove.EitherQualifiedMove T.X T.Y)) -> Game T.X T.Y -> [a] -> Either (a, String) (Game T.X T.Y) #-}+applyEitherQualifiedMoves moveConstructor	= Data.List.foldl' (+	\eitherGame datum -> eitherGame >>= (+		\game -> either (+			Left . (,) datum	-- Constructor failed.+		) (+			\eitherQualifiedMove -> Data.Maybe.maybe (+				Right $ applyEitherQualifiedMove eitherQualifiedMove game+			 ) (+				\errorMessage -> Left (+					datum,+					showString "board" . Text.ShowList.showsAssociation . shows (getBoard game) . showString " (" $ shows errorMessage ")"+				) -- Pair.+			 ) $ validateEitherQualifiedMove eitherQualifiedMove game+		) $ moveConstructor datum+	)+ ) . Right++{- |+	* True if the specified /move/ is valid, given the implied /piece/ & the current state of the /game/.++	* N.B.: it is considered valid to take a @King@, one just never has the opportunity, since the game terminates the move before.+-}+validateQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Component.QualifiedMove.QualifiedMove x y+	-> Game x y	-- ^ Prior to playing the /qualified move/.+	-> Maybe String	-- ^ Error-message.+{-# SPECIALISE validateQualifiedMove :: Component.QualifiedMove.QualifiedMove T.X T.Y -> Game T.X T.Y -> Maybe String #-}+validateQualifiedMove qualifiedMove game@MkGame {+	getNextLogicalColour		= nextLogicalColour,+	getBoard			= board,+	getMaybeChecked			= maybeChecked,+	getMaybeTerminationReason	= maybeTerminationReason+} = Control.Exception.assert (+	State.Censor.hasBothKings (+		State.Board.getCoordinatesByRankByLogicalColour board+	) && maybeChecked == Data.List.find (`State.Board.isKingChecked` board) Attribute.LogicalColour.range+ ) $ Data.Maybe.maybe (+	Data.Maybe.maybe (+		Just "there isn't a piece at the specified source-coordinates"	-- N.B.: this is also caught by 'validateEitherQualifiedMove'.+	) (+		\sourcePiece -> let+			sourceLogicalColour	= Component.Piece.getLogicalColour sourcePiece	-- Deconstruct.+		in lookup True $ Data.Maybe.maybe id (+			\destinationPiece -> (++) [+				(+					Component.Piece.isKing destinationPiece,			-- N.B.: this would otherwise prevent construction of the move-type.+					showString "a '" $ shows destinationPiece "' can't be taken"	-- N.B.: one should never be in a position where this can arise.+				), (+					Component.Piece.isFriend destinationPiece sourcePiece,+					showString "your own '" $ shows destinationPiece "' occupies the requested destination"+				)+			] -- Tests which depend on any taken piece.+		) maybeDestinationPiece [+			(+				sourceLogicalColour /= nextLogicalColour,+				showString "it's " . shows nextLogicalColour . showString "'s turn, but the referenced piece is " $ show sourceLogicalColour+			), (+				Attribute.MoveType.isPromotion moveType && not (Component.Piece.isPawn sourcePiece),+				showString "only a '" $ shows (Component.Piece.mkPawn sourceLogicalColour) "' can be promoted"+			)+		] {-tests which are independent of the type of the moving piece-} ++ map (+			Control.Arrow.second $ showString "regarding moving your '" . shows sourcePiece . showString "', "	-- Provide context.+		) (+			(+				case Component.Piece.getRank sourcePiece of+					Attribute.Rank.Pawn+						| destination `elem` Component.Piece.findAttackDestinations source sourcePiece	-> Data.Maybe.maybe (+							let+								opponentsCoordinates	= Cartesian.Coordinates.retreat sourceLogicalColour destination+								opponentsPawn		= Property.Opposable.getOpposite sourcePiece+							in [+								(+									not $ Cartesian.Coordinates.isEnPassantRank sourceLogicalColour source,+									showString "one can't take a '" $ shows opponentsPawn "' en-passant, from this rank"+								), (+									State.MaybePieceByCoordinates.isOccupied destination maybePieceByCoordinates,+									showString "taking a '" $ shows opponentsPawn "' en-passant, requires a move to a vacant square"+								), (+									Data.Maybe.maybe True {-unoccupied-} (/= opponentsPawn) $ State.MaybePieceByCoordinates.dereference opponentsCoordinates maybePieceByCoordinates,+									shows "en-passant" . showString " requires a '" $ shows opponentsPawn "' to be taken"+								), (+									Data.Maybe.maybe True {-zero previous turns-} (+										(+											/= Component.Move.mkMove (Cartesian.Coordinates.advance sourceLogicalColour destination) opponentsCoordinates+										) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+									 ) $ maybeLastTurn game,+									showString "a '" $ shows opponentsPawn "' can only be taken en-passant, immediately after it has advanced two squares"+								)+							] -- En-Passant.+						) (+							const []	-- The Pawn is moving diagonally forwards, to a square occupied by the opponent's piece => valid.+						) maybeDestinationPiece+						| otherwise {-advance-}	-> (+							case (+								if Attribute.LogicalColour.isBlack sourceLogicalColour+									then negate+									else id+							) $ Cartesian.Vector.getYDistance distance of+								1	-> id+								2	-> (++) [+									(+										not $ Cartesian.Coordinates.isPawnsFirstRank sourceLogicalColour source,+										"it only has the option to advance two squares on its first move"+									), (+										isObstructed,+										"an obstruction can't be jumped"+									)+								 ]+								nSquares	-> (:) (+									True,+									if nSquares == 0+										then "it must advance"+										else if nSquares > 0+											then showString "it can't advance " $ shows nSquares " squares"+											else "it can't retreat"+								 )+						) [+							(+								Cartesian.Vector.getXDistance distance /= 0,+								"it may only have a sideways component during attack"+							), (+								Data.Maybe.isJust maybeDestinationPiece,+								"an advance must be to a vacant square"+							)+						]+					Attribute.Rank.Rook	-> [+						(+							not $ Property.Orientated.isParallel move,+							"only moves parallel to the edges of the board are permissible"+						), (+							isObstructed,+							"an obstruction can't be jumped"+						)+					 ]+					Attribute.Rank.Knight	-> [+						(+							distance `notElem` Cartesian.Vector.attackVectorsForKnight,+							"the jump must be to the opposite corner of a 3 x 2 rectangle."+						) -- Pair.+					 ]+					Attribute.Rank.Bishop	-> [+						(+							not $ Property.Orientated.isDiagonal move,+							"only moves diagonal to the edges of the board are permissible"+						), (+							isObstructed,+							"an obstruction can't be jumped"+						)+					 ]+					Attribute.Rank.Queen	-> [+						(+							not $ Property.Orientated.isStraight move,+							"only straight moves are permissible"+						), (+							isObstructed,+							"an obstruction can't be jumped"+						)+					 ]+					Attribute.Rank.King+						| distance `elem` Cartesian.Vector.attackVectorsForKing	-> []	-- i.e. a normal move.+						| otherwise {-castling-}				-> Data.Maybe.maybe [+							(+								True,	-- i.e. validation-failure.+								"it can only castle (move two squares left or right from its starting position), or move one square in any direction"+							) -- Pair.+						] (+							\rooksSource -> [+								(+									not . State.CastleableRooksByLogicalColour.canCastleWith sourceLogicalColour rooksSource $ getCastleableRooksByLogicalColour game,+									showString "it has either already castled or lost the right to castle with the implied '" $ shows (Component.Piece.mkRook sourceLogicalColour) "'"+								), (+									State.MaybePieceByCoordinates.isObstructed source rooksSource maybePieceByCoordinates,+									"it can't castle through an obstruction"+								)+							]+						) (+							Data.Maybe.listToMaybe [+								Component.Move.getSource rooksMove |+									(_, kingsMove, rooksMove)	<- Component.Move.castlingMovesByLogicalColour ! sourceLogicalColour,+									kingsMove == move+							] -- List-comprehension.+						) ++ [+							(+								Data.Maybe.maybe False {-not in check-} (== sourceLogicalColour) maybeChecked,+								"it can't castle out of check"+							), (+								any (+									not . null . ($ board) . State.Board.findAttackersOf sourceLogicalColour+								) $ Component.Move.interpolate move,	-- The King mustn't pass through check when moving from source to destination (inclusive); a long castle still permits the square right of the Rook to be checked.+								"it can't castle through check"+							)+						] -- Tests which are independent of the implied Rook.+			) {-rank-specific test-} ++ [+				Control.Arrow.second (+					if Component.Piece.isKing sourcePiece+						then showString "it"+						else showString "your '" . shows (Component.Piece.mkKing sourceLogicalColour) . showChar '\''+				) $ if Data.Maybe.maybe False (== sourceLogicalColour) maybeChecked+					then (+						State.Board.isKingChecked sourceLogicalColour $ State.Board.movePiece move (Just moveType) board,	-- CAVEAT: don't perform an unvalidated move at the Game-level.+						" remains checked"+					) -- Pair.+					else (+						State.Board.exposesKing sourceLogicalColour move board,+						" would become exposed"+					) -- Pair.+			] -- Post-move tests on one's King.+		)+	) $ State.MaybePieceByCoordinates.dereference source maybePieceByCoordinates+ ) (+	Just . show	-- The game has been terminated, so there aren't any valid moves.+ ) maybeTerminationReason where+	(move, moveType)	= Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ qualifiedMove+	(source, destination)	= Component.Move.getSource &&& Component.Move.getDestination $ move	-- Deconstruct.+	maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	maybeDestinationPiece	= State.MaybePieceByCoordinates.dereference destination maybePieceByCoordinates	-- Query.++	distance :: Cartesian.Vector.VectorInt+	distance	= Component.Move.measureDistance move++	isObstructed :: Bool+	isObstructed	= State.MaybePieceByCoordinates.isObstructed source destination maybePieceByCoordinates++-- | Validates the /move-type/ than forwards the request to 'validateQualifiedMove'.+validateEitherQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Component.EitherQualifiedMove.EitherQualifiedMove x y+	-> Game x y	-- ^ Prior to playing the /move/.+	-> Maybe String	-- ^ Error-message.+{-# SPECIALISE validateEitherQualifiedMove :: Component.EitherQualifiedMove.EitherQualifiedMove T.X T.Y -> Game T.X T.Y -> Maybe String #-}+validateEitherQualifiedMove eitherQualifiedMove game@MkGame { getBoard = board }+	| State.MaybePieceByCoordinates.isVacant (+		Component.Move.getSource move+	) maybePieceByCoordinates		= Just "there isn't a piece at the specified source-coordinates"	-- Guard the call to 'State.MaybePieceByCoordinates.inferMoveType'.+	| Right moveType	<- promotionRankOrMoveType+	, moveType /= inferredMoveType		= Just . showString "the implied " . showString Attribute.MoveType.tag . Text.ShowList.showsAssociation . shows moveType . showString " /= " $ show inferredMoveType+	| otherwise				= validateQualifiedMove (Component.QualifiedMove.mkQualifiedMove move inferredMoveType) game+	where+		(move, promotionRankOrMoveType)	= Component.EitherQualifiedMove.getMove &&& Component.EitherQualifiedMove.getPromotionRankOrMoveType $ eitherQualifiedMove++		maybePieceByCoordinates		= State.Board.getMaybePieceByCoordinates board++		inferredMoveType :: Attribute.MoveType.MoveType+		inferredMoveType	= State.MaybePieceByCoordinates.inferMoveType move (+			either id Attribute.Rank.getMaybePromotionRank promotionRankOrMoveType	-- Discard any move-type.+		 ) maybePieceByCoordinates++-- | Whether the specified /qualifiedMove/ is valid.+isValidQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Component.QualifiedMove.QualifiedMove x y -> Game x y -> Bool+{-# SPECIALISE isValidQualifiedMove :: Component.QualifiedMove.QualifiedMove T.X T.Y -> Game T.X T.Y -> Bool #-}+isValidQualifiedMove qualifiedMove	= Data.Maybe.isNothing . validateQualifiedMove qualifiedMove++-- | Whether the specified /eitherQualifiedMove/ is valid.+isValidEitherQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Component.EitherQualifiedMove.EitherQualifiedMove x y -> Game x y -> Bool+{-# SPECIALISE isValidEitherQualifiedMove :: Component.EitherQualifiedMove.EitherQualifiedMove T.X T.Y -> Game T.X T.Y -> Bool #-}+isValidEitherQualifiedMove eitherQualifiedMove	= Data.Maybe.isNothing . validateEitherQualifiedMove eitherQualifiedMove++{- |+	* Roll-back the specified /game/ until the start, returning each previous /game/ paired with the /ply/ which was then made.++	* The list-head contains the most recent /ply/, while the tail contains the first.+-}+rollBack :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Game x y -> [(Game x y, Component.Turn.Turn x y)]+{-# SPECIALISE rollBack :: Game T.X T.Y -> [(Game T.X T.Y, Component.Turn.Turn T.X T.Y)] #-}+rollBack	= Data.List.unfoldr (+	\game@MkGame {+		getNextLogicalColour	= nextLogicalColour,+		getBoard		= board,+		getTurnsByLogicalColour	= turnsByLogicalColour,+		getInstancesByPosition	= instancesByPosition+	} -> let+		previousColour	= Property.Opposable.getOpposite nextLogicalColour+	 in case State.TurnsByLogicalColour.dereference previousColour turnsByLogicalColour of+		turn : previousTurns	-> let+			(move, moveType)	= (Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType) $ Component.Turn.getQualifiedMove turn	-- Deconstruct.+			destination		= Component.Move.getDestination move	-- Deconstruct.++			game'@MkGame {+				getBoard		= board',+				getTurnsByLogicalColour	= turnsByLogicalColour',+				getMaybeChecked		= maybeChecked'+			} = game {+				getNextLogicalColour			= previousColour,+				getCastleableRooksByLogicalColour	= State.CastleableRooksByLogicalColour.fromTurnsByLogicalColour turnsByLogicalColour',+				getMaybeChecked				= Data.List.find (`State.Board.isKingChecked` board') [previousColour],+				getBoard				= (+					case moveType of+						Attribute.MoveType.Castle isShort	-> State.Board.movePiece (+							uncurry Component.Move.mkMove $ (+								Cartesian.Coordinates.translateX (+									if isShort then pred else succ+								) {-rook's source relative to the King-} &&& Cartesian.Coordinates.translateX (+									const $ if isShort then Cartesian.Abscissa.xMax else Cartesian.Abscissa.xMin+								) {-rook's destination-}+							) destination+						 ) $ Just Data.Default.def {-move-type-}	-- CAVEAT: this is only the Rook's part of the Castling.+						Attribute.MoveType.EnPassant		-> State.Board.placePiece (+							Component.Piece.mkPawn nextLogicalColour+						 ) $ Cartesian.Coordinates.advance nextLogicalColour destination	-- Re-instate the opponent's passing Pawn.+						_ {-normal-}+							| Attribute.MoveType.isPromotion moveType	-> State.Board.defineCoordinates (+								Just $ Component.Piece.mkPawn previousColour	-- Demote the piece just returned to the source of the move.++							) $ Component.Move.getSource move+							| otherwise					-> id+				 ) . Data.Maybe.maybe id (+					(`State.Board.placePiece` destination) . Component.Piece.mkPiece nextLogicalColour+				 ) (+					Attribute.MoveType.getMaybeExplicitlyTakenRank moveType	-- Reconstruct any piece taken (except en-passant), inferring the logical colour.+				 ) $ State.Board.movePiece (Property.Opposable.getOpposite move) Nothing {-MoveType-} board,	-- N.B.: operate directly on the board to avoid creating a new Turn in the Game-structure.+				getTurnsByLogicalColour	= State.TurnsByLogicalColour.update turnsByLogicalColour [(previousColour, previousTurns)],+				getInstancesByPosition	= if Component.Turn.getIsRepeatableMove turn+					then State.InstancesByPosition.deletePosition (mkPosition game) instancesByPosition+					else mkInstancesByPosition game',	-- Reconstruct the map prior to the unrepeatable move.+				getAvailableQualifiedMovesByLogicalColour	= Data.Map.fromAscList [+					(logicalColour, mkAvailableQualifiedMovesFor logicalColour game') |+						logicalColour	<- Attribute.LogicalColour.range,+						Data.Maybe.maybe True (/= logicalColour) maybeChecked'+				], -- List-comprehension.+				getMaybeTerminationReason	= Nothing+			}+		 in Just ((game', turn), game')+		_	-> Nothing+ )++{- |+	* List all the /move/s available to the specified player; which may not be the player who is required to move next.++	* CAVEAT: to avoid an infinite loop, this doesn't check whether the game has already terminated.+-}+listQualifiedMovesAvailableTo :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ Define the player for whom the moves are required.+	-> Game x y+	-> [Component.QualifiedMove.QualifiedMove x y]+{-# SPECIALISE listQualifiedMovesAvailableTo :: Attribute.LogicalColour.LogicalColour -> Game T.X T.Y -> [Component.QualifiedMove.QualifiedMove T.X T.Y] #-}+listQualifiedMovesAvailableTo logicalColour game@MkGame {+	getBoard	= board,+	getMaybeChecked	= maybeChecked+}+	| Data.Maybe.maybe False (== logicalColour) maybeChecked	= let+		kingsCoordinates	= State.CoordinatesByRankByLogicalColour.getKingsCoordinates logicalColour coordinatesByRankByLogicalColour+	in [+		Component.QualifiedMove.mkQualifiedMove move moveType |+			(destination, maybeTakenRank)	<- State.MaybePieceByCoordinates.listDestinationsFor kingsCoordinates (Component.Piece.mkKing logicalColour) maybePieceByCoordinates,+			let+				move		= Component.Move.mkMove kingsCoordinates destination+				moveType	= Attribute.MoveType.mkNormalMoveType maybeTakenRank Nothing {-promotion-rank-},+			null . State.Board.findAttackersOf logicalColour destination $ State.Board.movePiece move (Just moveType) board -- Avoid moving the King into another check. CAVEAT: one can't merely use 'Board.exposesKing' since that assumes that one isn't already checked.+	] {-list-comprehension-} ++ case State.Board.findAttackersOf logicalColour kingsCoordinates board of+		[(checkedFrom, checkedByRank)]	-> Control.Exception.assert (checkedByRank /= Attribute.Rank.King) . filter isSafeQualifiedMove $ (+			if checkedByRank == Attribute.Rank.Pawn+				then Data.Maybe.maybe [] {-CAVEAT: this can occur if the game has just been read from FEN-} (+					(+						\lastMove -> let+							lastDestination	= Component.Move.getDestination lastMove+							pawn		= Component.Piece.mkPawn logicalColour+						in [+							Component.QualifiedMove.mkQualifiedMove (+								Component.Move.mkMove source $ Cartesian.Coordinates.advance logicalColour lastDestination	-- Construct a move which takes the attacker.+							) Attribute.MoveType.enPassant |+								Component.Move.isPawnDoubleAdvance opponentsLogicalColour lastMove,+								source	<- Cartesian.Coordinates.getAdjacents lastDestination,+								Data.Maybe.maybe False {-unoccupied-} (== pawn) $ State.MaybePieceByCoordinates.dereference source maybePieceByCoordinates+						] -- List-comprehension.+					) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+				) $ maybeLastTurn game	-- The King is checked by a Pawn, which must also have been the last piece to move.+				else [] -- The King is checked by a piece other than a Pawn, so even if one can legitimately take en-passant, it won't resolve the issue.+		 ) ++ [+			Component.QualifiedMove.mkQualifiedMove (+				Component.Move.mkMove source checkedFrom	-- Construct a move which takes the attacker.+			) $ Attribute.MoveType.mkNormalMoveType (Just checkedByRank) maybePromotionRank |+				(source, attackersRank)	<- State.Board.findAttackersOf opponentsLogicalColour checkedFrom board,	-- See if the attacker can be taken (excluding en-passant).+				attackersRank /= Attribute.Rank.King,	-- The King can take its attacker, but it's already addressed above.+				maybePromotionRank	<- listMaybePromotionRanks checkedFrom {-destination-} $ Component.Piece.mkPiece logicalColour attackersRank+		 ] {-list-comprehension-} ++ [+			Component.QualifiedMove.mkQualifiedMove (+				Component.Move.mkMove source destination+			) $ Attribute.MoveType.mkNormalMoveType Nothing {-taken rank-} maybePromotionRank |+				checkedByRank /= Attribute.Rank.Knight,	-- A Knight can't be blocked.+				rank			<- Attribute.Rank.expendable,	-- Find pieces that might be able to block the checking piece.+				let piece	= Component.Piece.mkPiece logicalColour rank,+				source			<- State.CoordinatesByRankByLogicalColour.dereference logicalColour rank coordinatesByRankByLogicalColour,	-- Find the source of a potential blocking move.+				(destination, Nothing)	<- State.MaybePieceByCoordinates.listDestinationsFor source piece maybePieceByCoordinates,	-- The blocker must move to an empty square, otherwise the checker was already blocked.+				Control.Exception.assert (checkedFrom /= kingsCoordinates) . elem destination . init {-drop King's location-} $ Cartesian.Coordinates.interpolate checkedFrom kingsCoordinates,+				maybePromotionRank	<- listMaybePromotionRanks destination piece+		 ] -- List-comprehension.+		attackers		-> Control.Exception.assert (+			length attackers == 2	-- Triple-check isn't possible.+		 ) []	-- If checked by more than one piece, then the King must be moved; see options above.+	| otherwise {-not checked-}	= findAvailableCastlingMoves logicalColour game ++ filter isSafeQualifiedMove (+		[+			Component.QualifiedMove.mkQualifiedMove (+				Component.Move.mkMove source destination+			) Attribute.MoveType.enPassant |+				let pawn	= Component.Piece.mkPawn logicalColour,+				source		<- State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.Pawn coordinatesByRankByLogicalColour,+				Cartesian.Coordinates.isEnPassantRank logicalColour source,+				destination	<- Component.Piece.findAttackDestinations source pawn,+				State.MaybePieceByCoordinates.isVacant destination maybePieceByCoordinates,+				let opponentsCoordinates	= Cartesian.Coordinates.retreat logicalColour destination,+				Data.Maybe.maybe False {-unoccupied-} (== Property.Opposable.getOpposite pawn) $ State.MaybePieceByCoordinates.dereference opponentsCoordinates maybePieceByCoordinates,+				Data.Maybe.maybe False {-zero previous turns-} (+					uncurry (&&) . (+						(== opponentsCoordinates) . Component.Move.getDestination &&& (+							== Cartesian.Coordinates.advance logicalColour destination+						) . Component.Move.getSource+					 ) . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+				) $ maybeLastTurn game+		] {-List-comprehension. Include en-passant moves-} ++ [+			Component.QualifiedMove.mkQualifiedMove (+				Component.Move.mkMove source destination+			) $ Attribute.MoveType.mkNormalMoveType maybeTakenRank maybePromotionRank |+				(source, piece)			<- State.CoordinatesByRankByLogicalColour.findPiecesOfColour logicalColour coordinatesByRankByLogicalColour,+				(destination, maybeTakenRank)	<- State.MaybePieceByCoordinates.listDestinationsFor source piece maybePieceByCoordinates,+				Data.Maybe.maybe True {-unoccupied-} (/= Attribute.Rank.King) maybeTakenRank,	-- This move can never be made; the option will either be immediately removed or check-mate declared.+				maybePromotionRank		<- listMaybePromotionRanks destination piece+		] -- List-comprehension.+	)+	where+		opponentsLogicalColour						= Property.Opposable.getOpposite logicalColour+		(maybePieceByCoordinates, coordinatesByRankByLogicalColour)	= State.Board.getMaybePieceByCoordinates &&& State.Board.getCoordinatesByRankByLogicalColour $ board+		isSafeQualifiedMove qualifiedMove				= not $ State.Board.exposesKing logicalColour (Component.QualifiedMove.getMove qualifiedMove) board++-- | Construct 'AvailableQualifiedMoves' for the player of the specified /logical colour/.+mkAvailableQualifiedMovesFor :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Attribute.LogicalColour.LogicalColour -> Game x y -> AvailableQualifiedMoves x y+{-# SPECIALISE mkAvailableQualifiedMovesFor :: Attribute.LogicalColour.LogicalColour -> Game T.X T.Y -> AvailableQualifiedMoves T.X T.Y #-}+{-+mkAvailableQualifiedMovesFor logicalColour	= Data.Map.fromAscList . map (+	getSource . head &&& map (+		Component.Move.getDestination . Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType+	)+ ) . Data.List.Extra.groupSortBy (Data.Ord.comparing getSource) . listQualifiedMovesAvailableTo logicalColour	where+	getSource	= Component.Move.getSource . Component.QualifiedMove.getMove+mkAvailableQualifiedMovesFor logicalColour	= foldr (+	uncurry (+		Data.Map.insertWith (++)+	) . (+		Component.Move.getSource . Component.QualifiedMove.getMove &&& return {-to List-monad-} . (+			Component.Move.getDestination . Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType+		)+	)+ ) Data.Map.empty . listQualifiedMovesAvailableTo logicalColour+-}+mkAvailableQualifiedMovesFor logicalColour	= foldr {-maintains destination-order-} (+	\qualifiedMove -> let+		move	= Component.QualifiedMove.getMove qualifiedMove+	in Data.Map.insertWith (++) (+		Component.Move.getSource move	-- Key.+	) [+		(+			Component.Move.getDestination move,+			Component.QualifiedMove.getMoveType qualifiedMove+		) -- Pair.+	] {-singleton-}+ ) Data.Map.empty . listQualifiedMovesAvailableTo logicalColour++{- |+	* Retrieve the recorded value, or generate the list of /move/s available to the player of the specified /logical colour/.++	* CAVEAT: doesn't account for game-termination.+-}+findQualifiedMovesAvailableTo :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Attribute.LogicalColour.LogicalColour+	-> Game x y+	-> [Component.QualifiedMove.QualifiedMove x y]+{-# SPECIALISE findQualifiedMovesAvailableTo :: Attribute.LogicalColour.LogicalColour -> Game T.X T.Y -> [Component.QualifiedMove.QualifiedMove T.X T.Y] #-}+findQualifiedMovesAvailableTo logicalColour game@MkGame { getAvailableQualifiedMovesByLogicalColour = availableQualifiedMovesByLogicalColour }+	| Just availableQualifiedMoves <- Data.Map.lookup logicalColour availableQualifiedMovesByLogicalColour	= [+		Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) moveType |+			(source, qualifiedDestinations)	<- Data.Map.assocs availableQualifiedMoves,+			(destination, moveType)		<- qualifiedDestinations+	] -- List-comprehension.+	| otherwise	= listQualifiedMovesAvailableTo logicalColour game	-- Generate the list of moves for this player.++-- | Count the number of moves available to the specified player.+countMovesAvailableTo :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Attribute.LogicalColour.LogicalColour -> Game x y -> Component.Move.NMoves+{-# SPECIALISE countMovesAvailableTo :: Attribute.LogicalColour.LogicalColour -> Game T.X T.Y -> Component.Move.NMoves #-}+countMovesAvailableTo logicalColour game@MkGame { getAvailableQualifiedMovesByLogicalColour = availableQualifiedMovesByLogicalColour }+	| isTerminated game	= 0+	| Just availableQualifiedMoves	<- Data.Map.lookup logicalColour availableQualifiedMovesByLogicalColour	-- N.B.: 'findQualifiedMovesAvailableToNextPlayer' unnecessarily constructs a list.+--	= length $ Data.Foldable.concat availableQualifiedMoves			-- CAVEAT: terrible performance.+--	= Data.Map.foldl' (flip $ (+) . length) 0 availableQualifiedMoves	-- CAVEAT: poor performance.+	= Data.Map.foldl' (\acc -> (+ acc) . length) 0 availableQualifiedMoves+	| otherwise	= length $ listQualifiedMovesAvailableTo logicalColour game++-- | Retrieve the recorded value, or generate the list of /move/s available to the next player.+findQualifiedMovesAvailableToNextPlayer :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Game x y -> [Component.QualifiedMove.QualifiedMove x y]+{-# SPECIALISE findQualifiedMovesAvailableToNextPlayer :: Game T.X T.Y -> [Component.QualifiedMove.QualifiedMove T.X T.Y] #-}+findQualifiedMovesAvailableToNextPlayer game@MkGame { getNextLogicalColour = nextLogicalColour }	= findQualifiedMovesAvailableTo nextLogicalColour game++-- | Let the specified player resign.+resignationBy :: Attribute.LogicalColour.LogicalColour -> Transformation x y+resignationBy logicalColour game+	| isTerminated game	= game	-- Already terminated.+	| otherwise		= game {+		getMaybeTerminationReason	= Just $ Model.GameTerminationReason.mkResignation logicalColour+	}++-- | Resignation by the player who currently holds the choice of /move/.+resign :: Transformation x y+resign game@MkGame { getNextLogicalColour = nextLogicalColour }	= resignationBy nextLogicalColour game++-- | Agree to a draw.+agreeToADraw :: Transformation x y+agreeToADraw game+	| isTerminated game	= game	-- Already terminated.+	| otherwise		= game {+		getMaybeTerminationReason	= Just $ Model.GameTerminationReason.mkDraw Model.DrawReason.byAgreement+	}++-- | Whether the game has been terminated.+isTerminated :: Game x y -> Bool+isTerminated MkGame { getMaybeTerminationReason	= maybeTerminationReason }	= Data.Maybe.isJust maybeTerminationReason++{- |+	* Inspects the current state of the /board/ to infer any reason for termination.++	* N.B.: resignation isn't included, because it leaves no evidence on the board.+-}+inferMaybeTerminationReason :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Game x y -> Maybe Model.GameTerminationReason.GameTerminationReason+{-# SPECIALISE inferMaybeTerminationReason :: Game T.X T.Y -> Maybe Model.GameTerminationReason.GameTerminationReason #-}+inferMaybeTerminationReason game@MkGame {+	getBoard		= board,+	getInstancesByPosition	= instancesByPosition+}+	| haveZeroMoves+	, Just logicalColour <- getMaybeChecked game	= Just $ Model.GameTerminationReason.mkCheckMate logicalColour+	| otherwise					= fmap Model.GameTerminationReason.mkDraw maybeDrawReason+	where+		haveZeroMoves :: Bool+		haveZeroMoves	= null $ findQualifiedMovesAvailableToNextPlayer game++		maybeDrawReason :: Maybe Model.DrawReason.DrawReason+		maybeDrawReason+			| haveZeroMoves																= Just Model.DrawReason.staleMate+			| State.InstancesByPosition.anyInstancesByPosition (== Model.DrawReason.maximumConsecutiveRepeatablePositions) instancesByPosition	= Just Model.DrawReason.fiveFoldRepetition+			| State.InstancesByPosition.countConsecutiveRepeatablePlies instancesByPosition == Model.DrawReason.maximumConsecutiveRepeatablePlies	= Just Model.DrawReason.seventyFiveMoveRule+			| State.Censor.hasInsufficientMaterial $ State.Board.getCoordinatesByRankByLogicalColour board						= Just Model.DrawReason.insufficientMaterial+			| otherwise																= Nothing++-- | Provided that the game hasn't already terminated, update the termination-reason according to whether the specified result implies either a /draw by agreement/ or a /resignation/.+updateTerminationReasonWith :: Model.Result.Result -> Transformation x y+updateTerminationReasonWith result game+	| Just victorsLogicalColour <- Model.Result.findMaybeVictor result	= resignationBy (Property.Opposable.getOpposite victorsLogicalColour) game+	| otherwise								= agreeToADraw game++-- | Forwards request to "State.CastleableRooksByLogicalColour".+cantConverge :: Game x y -> Game x y -> Bool+cantConverge MkGame {+	getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour+} MkGame {+	getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour'+} = State.CastleableRooksByLogicalColour.cantConverge castleableRooksByLogicalColour castleableRooksByLogicalColour'++-- | Constructor.+mkPosition :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Game x y -> State.Position.Position x y+mkPosition game@MkGame {+	getNextLogicalColour			= nextLogicalColour,+	getBoard				= board,+	getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour+} = State.Position.mkPosition nextLogicalColour (State.Board.getMaybePieceByCoordinates board) castleableRooksByLogicalColour $ maybeLastTurn game++-- | Constructor. Count the instances of each repeatable /position/.+mkInstancesByPosition :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Game x y -> InstancesByPosition x y+{-# SPECIALISE mkInstancesByPosition :: Game T.X T.Y -> InstancesByPosition T.X T.Y #-}+mkInstancesByPosition	= State.InstancesByPosition.mkInstancesByPosition . uncurry (+	foldr $ flip (Data.Map.insertWith $ const succ) 1 . mkPosition . fst {-game-}+ ) . (+	(`Data.Map.singleton` 1) . mkPosition &&& takeWhile (+		Component.Turn.getIsRepeatableMove . snd {-turn-}+	) . rollBack+ )++{- |+	* Whether the specified /game/'s /position/s have converged, & despite perhaps having reached this /position/ from different /move/-sequences, now have equal opportunities.++	* CAVEAT: this is different from equality.++	* CAVEAT: this test doesn't account for the possibility that one game may more quickly be drawn according to either the "Seventy-five-move Rule" or "Five-fold Repetition".++	* CAVEAT: though convenient, this function shouldn't be called for repeated tests against a constant /position/, resulting in unnecessary repeated construction of that /position/.+-}+(=~) :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Game x y -> Game x y -> Bool+game =~ game'	= mkPosition game == mkPosition game'++-- | Whether the state of the specified /game/s is different.+(/~) :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Game x y -> Game x y -> Bool+game /~ game'	= not $ game =~ game'++-- | Amend the /position-hash/ of the /game/ prior to application of the last /move/.+incrementalHash :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Enum			x,+	Enum			y,+	Ord			y+ )+	=> Game x y		-- ^ The /game/ before application of the last move.+	-> positionHash		-- ^ The value before application of the last move.+	-> Game x y		-- ^ The current game.+	-> Component.Zobrist.Zobrist x y positionHash+	-> positionHash+{-# SPECIALISE incrementalHash :: Game T.X T.Y -> T.PositionHash -> Game T.X T.Y -> Component.Zobrist.Zobrist T.X T.Y T.PositionHash -> T.PositionHash #-}+incrementalHash game positionHash game' zobrist	= Component.Zobrist.combine positionHash . (++) randomsFromMoveType . (+	let+		(castleableRooksByLogicalColour, castleableRooksByLogicalColour')	= ($ game) &&& ($ game') $ getCastleableRooksByLogicalColour+	in if isCastle || castleableRooksByLogicalColour /= castleableRooksByLogicalColour'+		then (+			State.CastleableRooksByLogicalColour.listIncrementalRandoms castleableRooksByLogicalColour castleableRooksByLogicalColour' zobrist +++		) -- Section.+		else id+ ) $ [+	random |+		Just enPassantAbscissa	<- map (+			\g -> maybeLastTurn g >>= State.EnPassantAbscissa.mkMaybeEnPassantAbscissa (+				getNextLogicalColour g+			) (+				State.Board.getMaybePieceByCoordinates $ getBoard g+			) -- CAVEAT: accounts for any change to the En-passant option, rather than the act of taking En-passant.+		) [game, game'],+		random			<- Component.Zobrist.listRandoms1D enPassantAbscissa zobrist+ ] {-list-comprehension-} ++ Component.Zobrist.getRandomForBlacksMove zobrist : [+	Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour lastLogicalColour (rankAccessor turn) (coordinatesAccessor move) zobrist |+		(rankAccessor, coordinatesAccessor)	<- zip [Component.Turn.getRank, (`Data.Maybe.fromMaybe` Attribute.Rank.getMaybePromotionRank moveType) . Component.Turn.getRank] coordinatesAccessors+ ] {-list-comprehension-} where+	lastLogicalColour	= getNextLogicalColour game+	turn			= Data.Maybe.fromMaybe (+		Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Model.Game.incrementalHash:\tzero turns have been made."+	 ) $ maybeLastTurn game'+	(move, moveType)	= Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ Component.Turn.getQualifiedMove turn+	isCastle		= Attribute.MoveType.isCastle moveType+	coordinatesAccessors	= [Component.Move.getSource, Component.Move.getDestination]++	randomsFromMoveType+		| Just rank <- Attribute.MoveType.getMaybeExplicitlyTakenRank moveType	= [Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour nextLogicalColour rank destination zobrist] -- Singleton.+		| isCastle	= [+			Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour lastLogicalColour Attribute.Rank.Rook (coordinatesAccessor rooksMove) zobrist |+				let+					rooksMove	= ToolShed.Data.Triple.getThird . Data.Maybe.fromMaybe (+						Control.Exception.throw $ Data.Exception.mkSearchFailure "BishBosh.Model.Game.incrementalHash.randomsFromMoveType:\tfailed to find castling move."+					 ) . Data.List.find ((== move) . ToolShed.Data.Triple.getSecond) $ Component.Move.castlingMovesByLogicalColour ! lastLogicalColour,+				coordinatesAccessor	<- coordinatesAccessors++		] -- List-comprehension.+		| Attribute.MoveType.isEnPassant moveType	= [Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour nextLogicalColour Attribute.Rank.Pawn (Cartesian.Coordinates.advance nextLogicalColour destination) zobrist] -- Singleton.+		| otherwise	= []+		where+			nextLogicalColour	= getNextLogicalColour game'+			destination		= Component.Move.getDestination move+
+ src-lib/BishBosh/Model/GameTerminationReason.hs view
@@ -0,0 +1,119 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Itemises the various reasons for terminating a game.++	* Each reason corresponds to a rule in chess.+-}++module BishBosh.Model.GameTerminationReason(+-- * Types+-- ** Data-types+	GameTerminationReason(),+-- * Function+	toResult,+-- ** Constructors+	mkCheckMate,+	mkResignation,+	mkDraw,+-- ** Predicates+	isCheckMateBy,+	isCheckMate,+	isResignation,+	isDraw,+	isDrawByInsufficientMaterial,+	isStaleMate+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Model.DrawReason		as Model.DrawReason+import qualified	BishBosh.Model.Result			as Model.Result+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	Control.DeepSeq++-- | The ways in which a game can legally be terminated.+data GameTerminationReason+	= CheckMateOf Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /check-mated/ player.+	| ResignationBy Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the player who resigned.+	| Draw Model.DrawReason.DrawReason+	deriving (Eq, Read, Show)++instance Control.DeepSeq.NFData GameTerminationReason where+	rnf (CheckMateOf logicalColour)		= Control.DeepSeq.rnf logicalColour+	rnf (ResignationBy logicalColour)	= Control.DeepSeq.rnf logicalColour+	rnf (Draw drawReason)			= Control.DeepSeq.rnf drawReason++instance Property.Opposable.Opposable GameTerminationReason where+	getOpposite (CheckMateOf logicalColour)		= CheckMateOf $ Property.Opposable.getOpposite logicalColour+	getOpposite (ResignationBy logicalColour)	= ResignationBy $ Property.Opposable.getOpposite logicalColour+	getOpposite draw				= draw++-- | Convert to a /result/.+toResult :: GameTerminationReason -> Model.Result.Result+toResult gameTerminationReason	= Property.Opposable.getOpposite . Model.Result.mkResult $ case gameTerminationReason of+	CheckMateOf logicalColour	-> Just logicalColour+	ResignationBy logicalColour	-> Just logicalColour+	Draw _				-> Nothing++-- | Constructor.+mkCheckMate :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason+mkCheckMate	= CheckMateOf++-- | Constructor.+mkResignation :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason+mkResignation	= ResignationBy++-- | Constructor.+mkDraw :: Model.DrawReason.DrawReason -> GameTerminationReason+mkDraw	= Draw++-- | Whether the game was won by the specified player.+isCheckMateBy :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason -> Bool+isCheckMateBy logicalColour (CheckMateOf logicalColour')	= logicalColour /= logicalColour'+isCheckMateBy _ _						= False++-- | Whether the game terminated in check-mate.+isCheckMate :: GameTerminationReason -> Bool+isCheckMate (CheckMateOf _)	= True+isCheckMate _			= False++-- | Whether the game was resigned.+isResignation :: GameTerminationReason -> Bool+isResignation (ResignationBy _)	= True+isResignation _			= False++-- | Whether the game was drawn.+isDraw :: GameTerminationReason -> Bool+isDraw (Draw _)	= True+isDraw _	= False++-- | Predicate.+isDrawByInsufficientMaterial :: GameTerminationReason -> Bool+isDrawByInsufficientMaterial (Draw draw)	= draw == Model.DrawReason.insufficientMaterial+isDrawByInsufficientMaterial _			= False++-- | Predicate.+isStaleMate :: GameTerminationReason -> Bool+isStaleMate (Draw draw)	= draw == Model.DrawReason.staleMate+isStaleMate _		= False+
+ src-lib/BishBosh/Model/GameTree.hs view
@@ -0,0 +1,289 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines chess as a constant tree of all possible moves.++	* Because of the conceptually infinite size of this data-structure, care must be taken not to attempt to call 'show', '(==)', ...+-}++module BishBosh.Model.GameTree(+-- * Types+-- ** Type-synonyms+--	BareGameTree,+	MoveFrequency,+--	Transformation,+-- ** Data-types+	GameTree(+--		MkGameTree,+		deconstruct+	),+-- * Function+--	compareByMVVLVA,+--	getLastMove,+--	staticExchangeEvaluation,+--	getRankAndMove,+	countGames,+	countMoves,+	traceRoute,+	sortGameTree,+	toMoveFrequency,+-- ** Constructor+	fromBareGameTree,+	fromGame+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.CaptureMoveSortAlgorithm	as Attribute.CaptureMoveSortAlgorithm+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Data.RoseTree				as Data.RoseTree+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.MoveFrequency			as Model.MoveFrequency+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.Null				as Property.Null+import qualified	BishBosh.Property.Tree				as Property.Tree+import qualified	BishBosh.State.TurnsByLogicalColour		as State.TurnsByLogicalColour+import qualified	BishBosh.Types					as T+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Tree++-- | Each node defines the state of the game.+type BareGameTree x y	= Data.Tree.Tree (Model.Game.Game x y)++-- | Forwards request to 'Component.Turn.compareByMVVLVA'.+compareByMVVLVA+	:: Ord rankValue+	=> Attribute.Rank.EvaluateRank rankValue+	-> BareGameTree x y+	-> BareGameTree x y+	-> Ordering+compareByMVVLVA evaluateRank Data.Tree.Node { Data.Tree.rootLabel = gameL } Data.Tree.Node { Data.Tree.rootLabel = gameR }	= uncurry (+	Component.Turn.compareByMVVLVA evaluateRank+ ) . (+	($ gameL) &&& ($ gameR)+ ) $ Data.Maybe.fromJust . Model.Game.maybeLastTurn++-- | Get the last move responsible for the current position.+getLastMove :: BareGameTree x y -> Component.Move.Move x y+{-# INLINE getLastMove #-}+getLastMove Data.Tree.Node { Data.Tree.rootLabel = game }	= Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove . Data.Maybe.fromJust $ Model.Game.maybeLastTurn game++{- |+	* <https://chessprogramming.wikispaces.com/Static+Exchange+Evaluation>.++	* Returns the net /rankValue/-difference in the /piece/s lost by either side, after a continuous battle at the specified coordinates.++	* CAVEAT: assumes that the battle continues until either player concludes it's disadvantageous to continue, or fire-power has been exhausted.+-}+staticExchangeEvaluation :: (+	Eq	x,+	Eq	y,+	Num	rankValue,+	Ord	rankValue+ )+	=> Attribute.Rank.EvaluateRank rankValue+	-> BareGameTree x y+	-> rankValue+staticExchangeEvaluation evaluateRank node@Data.Tree.Node { Data.Tree.rootLabel = game }	= Data.Maybe.maybe 0 {-nothing taken-} (slave node) $ getMaybeImplicitlyTakenRank game where	-- Find the rank of any victim.+	getMaybeImplicitlyTakenRank game'	= Attribute.MoveType.getMaybeImplicitlyTakenRank . Component.QualifiedMove.getMoveType . Component.Turn.getQualifiedMove =<< Model.Game.maybeLastTurn game'++	slave node'@Data.Tree.Node { Data.Tree.subForest = forest' }	= max 0 {-this player shouldn't progress the battle-} . subtract (+		case filter (+			(+				== Component.Move.getDestination (getLastMove node')+			) . Component.Move.getDestination . getLastMove	-- Find counter-attacks at the same coordinates.+		 ) forest' of+			[]		-> 0	-- Fire-power has been exhausted => terminate recursion.+			forest''	-> let+				node''@Data.Tree.Node { Data.Tree.rootLabel = game'' }	= Data.List.minimumBy (+					\Data.Tree.Node { Data.Tree.rootLabel = gameL } Data.Tree.Node { Data.Tree.rootLabel = gameR } -> uncurry (+						Component.Turn.compareByLVA evaluateRank+					) . (+						($ gameL) &&& ($ gameR)+					) $ Data.Maybe.fromMaybe (+						Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.Model.GameTree:\tModel.Game.maybeLastTurn failed."+					) . Model.Game.maybeLastTurn+				 ) forest'' -- Select the least valuable aggressor.+			 in slave node'' . Data.Maybe.fromJust $ getMaybeImplicitlyTakenRank game''	-- Recurse.+	 ) . evaluateRank {-of victim-}++-- | Accessor.+getRankAndMove :: Model.MoveFrequency.GetRankAndMove (BareGameTree x y) (Component.Move.Move x y)+{-# INLINE getRankAndMove #-}+getRankAndMove Data.Tree.Node { Data.Tree.rootLabel = game }	= (Component.Turn.getRank &&& Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove) . Data.Maybe.fromJust $ Model.Game.maybeLastTurn game++-- | Wrap a 'BareGameTree'.+newtype GameTree x y	= MkGameTree {+	deconstruct	:: BareGameTree x y+} deriving Show {-CAVEAT: required by QuickCheck, but shouldn't actually be called-}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Data.Default.Default (GameTree x y) where+	{-# SPECIALISE instance Data.Default.Default (GameTree T.X T.Y) #-}+	def	= fromGame Data.Default.def++instance Property.Tree.Prunable (GameTree x y) where+	prune depth MkGameTree { deconstruct = bareGameTree }	= MkGameTree $ Property.Tree.prune depth bareGameTree++instance (Enum x, Enum y) => Notation.MoveNotation.ShowNotation (GameTree x y) where+	showsNotation moveNotation MkGameTree {+		deconstruct	= bareGameTree@Data.Tree.Node {+			Data.Tree.rootLabel	= game,+			Data.Tree.subForest	= forest+		}+	} = showString $ if Property.Null.isNull game+		then Data.RoseTree.drawForest toString forest+		else Data.RoseTree.drawTree toString bareGameTree+		where+			toString	= Notation.MoveNotation.showNotation moveNotation . Data.Maybe.fromJust . Model.Game.maybeLastTurn++-- | Constructor.+fromBareGameTree :: BareGameTree x y -> GameTree x y+fromBareGameTree	= MkGameTree++-- | Constructs a game-tree with the specified game at its root.+fromGame :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Model.Game.Game x y -> GameTree x y+{-# SPECIALISE fromGame :: Model.Game.Game T.X T.Y -> GameTree T.X T.Y #-}+fromGame	= MkGameTree . Data.Tree.unfoldTree (+	\game -> (+		game,+		if Model.Game.isTerminated game+			then []+			else map (+				`Model.Game.applyQualifiedMove` game+			) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	) -- Pair.+ )++{- |+	* Counts the number of /game-state/s in the constant game of chess, at the specified depth, including any which terminated earlier.++	* N.B.: some of the /game-state/s may have identical positions, reached by different sequences of /move/s.+-}+countGames :: Property.Tree.Depth -> Model.Game.NGames+countGames depth	= Data.RoseTree.countTerminalNodes . deconstruct $ Property.Tree.prune depth (Data.Default.def :: GameTree T.X T.Y)++-- | Counts the number of possible plies in chess, down to the specified depth.+countMoves :: Property.Tree.Depth -> Model.Game.NGames+countMoves depth	= pred {-the apex is constructed without moving-} . Data.Foldable.length . deconstruct $ Property.Tree.prune depth (Data.Default.def :: GameTree T.X T.Y)++-- | Trace the route down the tree which matches the specified list of turns.+traceRoute+	:: (Eq x, Eq y)+	=> GameTree x y+	-> [Component.Turn.Turn x y]	-- ^ The data against which, nodes from the tree should be matched.+	-> Maybe [Model.Game.Game x y]	-- ^ Returns 'Nothing' on match-failure.+traceRoute MkGameTree { deconstruct = bareGameTree }	= Data.RoseTree.traceRoute (\turn -> Data.Maybe.maybe False (== turn) . Model.Game.maybeLastTurn) bareGameTree++-- | Focus the underlying type.+type MoveFrequency x y	= Model.MoveFrequency.MoveFrequency (Component.Move.Move x y)++-- | Self-documentation.+type Transformation x y	= GameTree x y -> GameTree x y++{- |+	* Independently sorts the forest of moves at each node of the tree, without regard to runtime-data.++	* Depending on preferences, the list of moves available to each game is sequentially sorted by:+		those which reduce the radius from the centre of the board.+		either those which capture a valuable piece using a cheap piece, or those which win extended battles at a specific location.++	* The above sort-algorithms are stable & can therefore be applied independently.+-}+sortGameTree :: (+	Integral	x,+	Integral	y,+	Num		rankValue,+	Ord		rankValue+ )+	=> Bool	-- ^ preferMovesTowardsCentre.+	-> Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm+	-> Attribute.Rank.EvaluateRank rankValue+	-> MoveFrequency x y+	-> Transformation x y+{-# SPECIALISE sortGameTree :: Bool -> Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm -> Attribute.Rank.EvaluateRank T.RankValue -> MoveFrequency T.X T.Y -> Transformation T.X T.Y #-}+sortGameTree preferMovesTowardsCentre maybeCaptureMoveSortAlgorithm evaluateRank standardOpeningMoveFrequency MkGameTree { deconstruct = bareGameTree }	= MkGameTree $ Data.RoseTree.mapForest (+	\game -> Data.Maybe.maybe id (+		\captureMoveSortAlgorithm -> case captureMoveSortAlgorithm of+			Attribute.CaptureMoveSortAlgorithm.MVVLVA	-> Data.List.sortBy $ compareByMVVLVA evaluateRank+			Attribute.CaptureMoveSortAlgorithm.SEE		-> Data.List.sortOn $ negate {-largest first-} . staticExchangeEvaluation evaluateRank+	 ) maybeCaptureMoveSortAlgorithm . (+		if Property.Null.isNull standardOpeningMoveFrequency+			then id+			else Model.MoveFrequency.sortByDescendingMoveFrequency (Model.Game.getNextLogicalColour game) getRankAndMove standardOpeningMoveFrequency+	 ) . (+		if preferMovesTowardsCentre+			then Data.List.sortOn $ \node -> Component.Move.getDeltaRadiusSquared $ getLastMove node	:: Double+			else id+	 )+ ) bareGameTree++{- |+	* Count the instances of each /move/ in the specified tree, including any pre-applied to the apex game.++	* CAVEAT: ambiguity remains regarding the /move-type/ (especially any piece taken).++	* CAVEAT: a node is counted as just one instance of the move, rather than the number of games which passed through that node.+	Had the move-frequency been derived from a list of games, a different distribution would result,+	but then early moves would appear popular rather than just the consequence of limited choice.+-}+toMoveFrequency :: (Ord x, Ord y) => GameTree x y -> MoveFrequency x y+toMoveFrequency MkGameTree {+	deconstruct	= bareGameTree@Data.Tree.Node { Data.Tree.rootLabel = rootGame }+} = slave (+	Data.List.foldl' (+		\moveFrequency logicalColour -> Model.MoveFrequency.insertMoves logicalColour (+			Component.Turn.getRank &&& Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+		) moveFrequency . State.TurnsByLogicalColour.dereference logicalColour $ Model.Game.getTurnsByLogicalColour rootGame+	) Property.Empty.empty {-MoveFrequency-} Attribute.LogicalColour.range+ ) bareGameTree where+	slave moveFrequency Data.Tree.Node {+		Data.Tree.rootLabel	= game,+		Data.Tree.subForest	= forest+	} = Data.List.foldl' slave {-recurse-} (+		Model.MoveFrequency.insertMoves (Model.Game.getNextLogicalColour game) getRankAndMove moveFrequency forest+	 ) forest+
+ src-lib/BishBosh/Model/MoveFrequency.hs view
@@ -0,0 +1,151 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* The instances of various moves, categorised by /logical colour/ & /rank/, are recorded from a large resource of games.++	* The frequency-distribution can then be used to sort the moves in the current game, to prioritise evaluation of likely candidates.+-}++module BishBosh.Model.MoveFrequency(+-- * Types+-- ** Type-synonyms+--	InstancesByMoveByRankByLogicalColour,+	GetRankAndMove,+-- ** Data-types+	MoveFrequency(),+-- * Functions+	countEntries,+--	countDistinctEntries,+	insertMoves,+	sortByDescendingMoveFrequency+) where++import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Property.Empty			as Property.Empty+import qualified	BishBosh.Property.Null			as Property.Null+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Ord++{- |+	* Records the number of instances, by /logical colour/, by /rank/, of /move/s.++	* CAVEAT: no record of the /move-type/ is stored.+-}+type InstancesByMoveByRankByLogicalColour move	= Attribute.LogicalColour.ByLogicalColour (Attribute.Rank.ByRank (Data.Map.Map move Component.Move.NMoves))++-- | The number of recorded instances of each move.+newtype MoveFrequency move	= MkMoveFrequency {+	deconstruct	:: InstancesByMoveByRankByLogicalColour move+} deriving Eq++instance Property.Empty.Empty (MoveFrequency move) where+	empty	= MkMoveFrequency . Attribute.LogicalColour.listArrayByLogicalColour . repeat . Attribute.Rank.listArrayByRank $ repeat Data.Map.empty++instance Property.Null.Null (MoveFrequency move) where+	isNull MkMoveFrequency { deconstruct = instancesByMoveByRankByLogicalColour }	= Data.Foldable.all (Data.Foldable.all Data.Map.null) instancesByMoveByRankByLogicalColour++-- | Count the total number of entries.+countEntries :: MoveFrequency move -> Component.Move.NMoves+countEntries MkMoveFrequency { deconstruct = instancesByMoveByRankByLogicalColour }	= Data.Foldable.foldl' (+	Data.Foldable.foldl' $ \acc -> (acc +) . Data.Foldable.sum+ ) 0 instancesByMoveByRankByLogicalColour++-- | Count the total number of distinct entries.+countDistinctEntries :: MoveFrequency move -> Component.Move.NMoves+countDistinctEntries MkMoveFrequency { deconstruct = instancesByMoveByRankByLogicalColour }	= Data.Foldable.foldl' (+	Data.Foldable.foldl' $ \acc -> (acc +) . Data.Map.size+ ) 0 instancesByMoveByRankByLogicalColour++-- | The type of a function which can extract the /rank/ & /move/ from a datum.+type GetRankAndMove a move	= a -> (Attribute.Rank.Rank, move)++{- |+	* Inserts a list of data from which /rank/ & /move/ can be extracted, each of which were made by pieces of the same /logical colour/, i.e. by the same player.++	* If the entry already exists, then the count for that /rank/ & /move/, is increased.+-}+insertMoves+	:: Ord move+	=> Attribute.LogicalColour.LogicalColour	-- ^ References the player who is required to make any one of the specified moves.+	-> GetRankAndMove a move			-- ^ How to extract the required /rank/ & /move/ from a datum.+	-> MoveFrequency move+	-> [a]						-- ^ The data from each of which, /rank/ & /move/ can be extracted.+	-> MoveFrequency move+insertMoves logicalColour getRankAndMove MkMoveFrequency { deconstruct = instancesByMoveByRankByLogicalColour } l	= MkMoveFrequency $ case l of+	[]	-> instancesByMoveByRankByLogicalColour+	[datum]	-> let+		(rank, move)	= getRankAndMove datum+		instancesByMove	= instancesByMoveByRank ! rank+	 in instancesByMoveByRankByLogicalColour // [+		(+			logicalColour,+			instancesByMoveByRank // [+				(+					rank,+					Data.Map.insertWith (+) move 1 instancesByMove+				) -- Pair.+			] -- Singleton.+		) -- Pair.+	 ] -- Singleton.+	_	-> instancesByMoveByRankByLogicalColour // [+		(+			logicalColour,+			instancesByMoveByRank // [+				(+					rank,+					foldr (+						\(_, move) -> Data.Map.insertWith (+) move 1+					) (+						instancesByMoveByRank ! rank+					) assocs+--				) | assocs@((rank, _) : _) <- Data.List.Extra.groupSortOn fst {-rank-} $ map getRankAndMove l	-- CAVEAT: wastes space.+				) | assocs@((rank, _) : _) <- Data.List.Extra.groupSortBy (Data.Ord.comparing fst {-rank-}) $ map getRankAndMove l+			] -- List-comprehension.+		) -- Pair.+	 ] -- Singleton.+	where+		instancesByMoveByRank	= instancesByMoveByRankByLogicalColour ! logicalColour++{- |+	* Sorts an arbitrary list on the recorded frequency of the /rank/ & /move/ accessible from each list-item.++	* The /rank/ & /move/ extracted from each list-item, is assumed to have been made by the player of the specified /logical colour/.+-}+sortByDescendingMoveFrequency+	:: Ord move+	=> Attribute.LogicalColour.LogicalColour	-- ^ References the player who is required to make any one of the specified moves.+	-> GetRankAndMove a move			-- ^ How to extract the required /rank/ & /move/ from a datum.+	-> MoveFrequency move+	-> [a]						-- ^ The data from each of which, /rank/ & /move/ can be extracted.+	-> [a]+{-# INLINE sortByDescendingMoveFrequency #-}+sortByDescendingMoveFrequency logicalColour getRankAndMove MkMoveFrequency { deconstruct = instancesByMoveByRankByLogicalColour }	= Data.List.sortOn $ negate {-most frequent first-} . (+	\(rank, move) -> Data.Map.findWithDefault 0 move $ instancesByMoveByRankByLogicalColour ! logicalColour ! rank+ ) . getRankAndMove+
+ src-lib/BishBosh/Model/PositionHashTree.hs view
@@ -0,0 +1,100 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]+-}++module BishBosh.Model.PositionHashTree(+-- * Types+-- ** Type-synonyms+--	BarePositionHashTree,+-- ** Data-types+	PositionHashTree(),+-- * Function+	countDistinctPositions,+-- ** Constructors+	mkPositionHashTree+) where++import qualified	BishBosh.Component.Zobrist	as Component.Zobrist+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Model.Game		as Model.Game+import qualified	BishBosh.Model.GameTree		as Model.GameTree+import qualified	BishBosh.Property.Tree		as Property.Tree+import qualified	BishBosh.Text.ShowList		as Text.ShowList+import qualified	BishBosh.Types			as T+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Set+import qualified	Data.Tree+import qualified	System.Random++-- | The hash of a /game-tree/.+type BarePositionHashTree positionHash	= Data.Tree.Tree positionHash++-- | Wrap a 'BarePositionHashTree'.+newtype PositionHashTree positionHash	= MkPositionHashTree {+	deconstruct	:: BarePositionHashTree positionHash+}++instance (+	Data.Bits.FiniteBits	positionHash,+	Num			positionHash,+	System.Random.Random	positionHash+ ) => Data.Default.Default (PositionHashTree positionHash) where+	def	= mkPositionHashTree Data.Default.def (Data.Default.def :: Model.GameTree.GameTree T.X T.Y)++-- | Hash the specified 'game-tree/.+mkPositionHashTree :: (+	Data.Array.IArray.Ix	x,+	Data.Bits.Bits		positionHash,+	Enum			x,+	Enum			y,+	Ord			y+ )+	=> Component.Zobrist.Zobrist x y positionHash+	-> Model.GameTree.GameTree x y+	-> PositionHashTree positionHash+mkPositionHashTree zobrist	= MkPositionHashTree . fmap (`Component.Zobrist.hash2D` zobrist) . Model.GameTree.deconstruct++-- | Count the number of distinct games, irrespective of the sequence of moves taken to reach that state.+countDistinctPositions+	:: Ord positionHash+	=> Property.Tree.Depth+	-> PositionHashTree positionHash+	-> Model.Game.NGames+{-# SPECIALISE countDistinctPositions :: Property.Tree.Depth -> PositionHashTree T.PositionHash -> Model.Game.NGames #-}+countDistinctPositions depth MkPositionHashTree { deconstruct = barePositionHashTree }+	| depth < 0	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Component.PositionHashTree.countDistinctPositions:\tdepth" . Text.ShowList.showsAssociation $ shows depth "must be positive"+	| otherwise	= Data.Set.size $ slave depth barePositionHashTree+	where+		slave 0 Data.Tree.Node { Data.Tree.rootLabel = hash }		= Data.Set.singleton hash	-- Having reached the maximum depth, include this game's hash.+		slave _ Data.Tree.Node {+			Data.Tree.rootLabel	= hash,+			Data.Tree.subForest	= []+		}								= Data.Set.singleton hash	-- Being unable to descend further, include the terminal game's hash.+		slave depth' Data.Tree.Node { Data.Tree.subForest = forest }	= Data.List.foldl' (+			\s -> Data.Set.union s . slave (pred depth') {-recurse-}+		 ) Data.Set.empty forest+
+ src-lib/BishBosh/Model/Result.hs view
@@ -0,0 +1,99 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the result of a /game/.+-}++module BishBosh.Model.Result(+-- * Types+-- ** Data-types+	Result(+--		VictoryBy,+--		Draw+	),+-- * Constants+	range,+-- * Function+	findMaybeVictor,+-- ** Constructor+	mkResult,+-- ** Predicates+	isDraw+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	Control.DeepSeq+import qualified	Data.List.Extra++-- | The ways in which a game can legally be terminated.+data Result+	= VictoryBy Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the victor.+	| Draw+	deriving Eq++instance Control.DeepSeq.NFData Result where+	rnf (VictoryBy logicalColour)		= Control.DeepSeq.rnf logicalColour+	rnf Draw				= ()++-- | Convert a game-termination reason into PGN's @Result@ field; <https://www.chessclub.com/user/help/pgn-spec>.+instance Show Result where+	showsPrec _ result	= (+		\(showsWhiteResult, showsBlackResult) -> showsWhiteResult . showChar '-' . showsBlackResult+	 ) $ case result of+		VictoryBy Attribute.LogicalColour.Black -> (lose, win)+		VictoryBy _				-> (win, lose)+		_					-> (draw, draw)+		where+			lose	= showChar '0'+			win	= showChar '1'+			draw	= showString "1/2"++instance Read Result where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		'0' : '-' : '1' : remainder				-> [(VictoryBy Attribute.LogicalColour.Black, remainder)]+		'1' : '-' : '0' : remainder				-> [(VictoryBy Attribute.LogicalColour.White, remainder)]+		'1' : '/' : '2' : '-' : '1' : '/' : '2' : remainder	-> [(Draw, remainder)]+		_							-> []	-- No Parse.++instance Property.Opposable.Opposable Result where+	getOpposite (VictoryBy logicalColour)	= VictoryBy $ Property.Opposable.getOpposite logicalColour+	getOpposite _				= Draw++-- | The constant range of values.+range :: [Result]+range	= Draw : map VictoryBy Attribute.LogicalColour.range++-- | Constructor.+mkResult :: Maybe Attribute.LogicalColour.LogicalColour -> Result+mkResult (Just logicalColour)	= VictoryBy logicalColour+mkResult _			= Draw++-- | Whether the game was drawn.+isDraw :: Result -> Bool+isDraw Draw	= True+isDraw _	= False++-- | Find any winner.+findMaybeVictor :: Result -> Maybe Attribute.LogicalColour.LogicalColour+findMaybeVictor (VictoryBy logicalColour)	= Just logicalColour+findMaybeVictor _				= Nothing+
+ src-lib/BishBosh/Notation/Coordinate.hs view
@@ -0,0 +1,153 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://chessprogramming.wikispaces.com/Algebraic+Chess+Notation#Pure coordinate notation>.++	* CAVEAT: <https://en.wikipedia.org/wiki/Chess_notation> defined a variant of this notation.++	* N.B.: used for communication via /CECP/ with /xboard/.+-}++module BishBosh.Notation.Coordinate(+-- * Types+-- ** Data-types+	Coordinate(+--		MkCoordinate,+		getMove+--		getMaybePromotionRank+	),+-- * Constants+--	xOrigin,+--	yOrigin,+	origin,+	regexSyntax,+-- * Functions+--	encode,+	showsCoordinates,+-- ** Constructors+	mkCoordinate,+	mkCoordinate'+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa	as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	Control.Arrow+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.List.Extra+import qualified	Data.Maybe++-- | The /x/-origin.+xOrigin :: Int+xOrigin	= Data.Char.ord 'a'++-- | The /y/-origin.+yOrigin :: Int+yOrigin	= Data.Char.ord '1'++-- | The origin.+origin :: (Int, Int)+origin	= (xOrigin, yOrigin)++-- | Defines using a regex, the required syntax.+regexSyntax :: String+regexSyntax	= showString "([a-h][1-8]){2}[" $ showString (+	concatMap show Attribute.Rank.promotionProspects+ ) "]?"++-- | Defines a /move/, to enable i/o in /Coordinate/-notation.+data Coordinate x y	= MkCoordinate {+	getMove			:: Component.Move.Move x y,+	getMaybePromotionRank	:: Maybe Attribute.Rank.Rank+} deriving Eq++-- | Smart constructor.+mkCoordinate :: Component.Move.Move x y -> Maybe Attribute.Rank.Rank -> Coordinate x y+mkCoordinate move maybePromotionRank+	| Just rank	<- maybePromotionRank+	, rank `notElem` Attribute.Rank.promotionProspects	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Notation.Coordinate.Coordinate:\tcan't promote to a " $ shows rank "."+	| otherwise						= MkCoordinate {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	}++-- | Smart constructor.+mkCoordinate' :: Attribute.Rank.Promotable promotable => Component.Move.Move x y -> promotable -> Coordinate x y+mkCoordinate' move	= mkCoordinate move . Attribute.Rank.getMaybePromotionRank++-- | Encodes the ordinate & abscissa.+encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)+encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY++-- | Shows the specified /coordinates/.+showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS+showsCoordinates	= uncurry (.) . encode++instance (Enum x, Enum y) => Show (Coordinate x y) where+	showsPrec _ MkCoordinate {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	} = showsCoordinates (+		Component.Move.getSource move+	 ) . showsCoordinates (+		Component.Move.getDestination move+	 ) . Data.Maybe.maybe id shows maybePromotionRank++-- N.B. this merely validates the syntax, leaving any semantic errors to 'Model.Game.validate'.+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (Coordinate x y) where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		x : y : x' : y' : remainder	-> let+			translate x'' y''	= Cartesian.Coordinates.mkMaybeCoordinates (+				toEnum $ Data.Char.ord x'' + (Cartesian.Abscissa.xOrigin - xOrigin)+			 ) (+				toEnum $ Data.Char.ord y'' + (Cartesian.Ordinate.yOrigin - yOrigin)+			 )+		 in [+			Control.Arrow.first (+				mkCoordinate $ Component.Move.mkMove source destination+			) (+				case reads $ take 1 remainder of+					[(rank, "")]	-> if rank `elem` Attribute.Rank.promotionProspects+						then (Just rank, tail remainder)+						else (Nothing, remainder)+					_	-> (Nothing, remainder)+			) |+				source		<- Data.Maybe.maybeToList $ translate x y,+				destination	<- Data.Maybe.maybeToList $ translate x' y',+				source /= destination+		 ] -- List-comprehension.+		_					-> []	-- No parse.++instance Attribute.Rank.Promotable (Coordinate x y) where+	getMaybePromotionRank	= getMaybePromotionRank+
+ src-lib/BishBosh/Notation/ICCFNumeric.hs view
@@ -0,0 +1,158 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	<https://en.wikipedia.org/wiki/ICCF_numeric_notation>.+-}++module BishBosh.Notation.ICCFNumeric(+-- * Types+-- ** Data-types+	ICCFNumeric(+--		MkICCFNumeric,+		getMove+--		getMaybePromotionRank+	),+-- * Constants+--	xOrigin,+--	yOrigin,+	origin,+	regexSyntax,+	toRank,+-- * Functions+--	encode,+	showsCoordinates,+-- ** Constructors+	mkICCFNumeric,+	mkICCFNumeric'+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa	as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	Control.Arrow+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Tuple++-- | The /x/-origin.+xOrigin :: Int+xOrigin	= Data.Char.ord '1'++-- | The /y/-origin.+yOrigin :: Int+yOrigin	= Data.Char.ord '1'++-- | The origin.+origin :: (Int, Int)+origin	= (xOrigin, yOrigin)++-- | Defines using a regex, the required syntax.+regexSyntax :: String+regexSyntax	= "[1-8]{4}[1-4]?"++-- | Constant translation from integral promotion-specifications to the corresponding /rank/.+toRank :: [(Int, Attribute.Rank.Rank)]+toRank	= zip [1 ..] [+	Attribute.Rank.Queen,+	Attribute.Rank.Rook,+	Attribute.Rank.Bishop,+	Attribute.Rank.Knight+ ]++-- | Defines a /move/, to enable i/o in /ICCF Numeric/-notation.+data ICCFNumeric x y	= MkICCFNumeric {+	getMove			:: Component.Move.Move x y,+	getMaybePromotionRank	:: Maybe Attribute.Rank.Rank+} deriving Eq++-- | Smart constructor.+mkICCFNumeric :: Component.Move.Move x y -> Maybe Attribute.Rank.Rank -> ICCFNumeric x y+mkICCFNumeric move maybePromotionRank+	| Just rank	<- maybePromotionRank+	, rank `notElem` Attribute.Rank.promotionProspects	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Notation.ICCFNumeric.mkICCFNumeric:\tcan't promote to a " $ shows rank "."+	| otherwise						= MkICCFNumeric {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	}++-- | Smart constructor.+mkICCFNumeric' :: Attribute.Rank.Promotable promotable => Component.Move.Move x y -> promotable -> ICCFNumeric x y+mkICCFNumeric' move	= mkICCFNumeric move . Attribute.Rank.getMaybePromotionRank++-- | Encodes the ordinate & abscissa.+encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)+encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY++-- | Shows the specified /coordinates/.+showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS+showsCoordinates	= uncurry (.) . encode++instance (Enum x, Enum y) => Show (ICCFNumeric x y) where+	showsPrec _ MkICCFNumeric {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	} = showsCoordinates (+		Component.Move.getSource move+	 ) . showsCoordinates (+		Component.Move.getDestination move+	 ) . Data.Maybe.maybe id (+		shows . Data.Maybe.fromJust . (`lookup` map Data.Tuple.swap toRank)+	 ) maybePromotionRank++-- N.B. this merely validates the syntax, leaving any semantic errors to 'Model.Game.validate'.+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (ICCFNumeric x y) where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		x : y : x' : y' : remainder	-> let+			fromICCFNumeric x'' y''	= Cartesian.Coordinates.mkMaybeCoordinates (+				toEnum $ Data.Char.ord x'' + (Cartesian.Abscissa.xOrigin - xOrigin)+			 ) (+				toEnum $ Data.Char.ord y'' + (Cartesian.Ordinate.yOrigin - yOrigin)+			 )+		 in [+			Control.Arrow.first (+				mkICCFNumeric $ Component.Move.mkMove source destination+			) (+				case reads $ take 1 remainder of+					[(digit, _)]+						| Just rank <- lookup digit toRank	-> (Just rank, tail remainder)+						| otherwise				-> (Nothing, remainder)+					_						-> (Nothing, remainder)+			) |+				source		<- Data.Maybe.maybeToList $ fromICCFNumeric x y,+				destination	<- Data.Maybe.maybeToList $ fromICCFNumeric x' y',+				source /= destination+		 ] -- List-comprehension.+		_				-> []	-- No parse.++instance Attribute.Rank.Promotable (ICCFNumeric x y) where+	getMaybePromotionRank	= getMaybePromotionRank+
+ src-lib/BishBosh/Notation/MoveNotation.hs view
@@ -0,0 +1,159 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements various move-notations <https://en.wikipedia.org/wiki/Chess_notation Chess-notation>.+-}++module BishBosh.Notation.MoveNotation(+-- * Type-classes+	ShowNotation(..),+	ShowNotationFloat(..),+-- * Types+-- ** Data-types+	MoveNotation(),+-- * Constants+	tag,+	coordinate,+	range,+-- * Functions+	readsQualifiedMove,+	showNotation,+	showsMoveSyntax,+	getOrigin,+	showsNotationFloatToNDecimals,+-- ** Predicates+	isCoordinate+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.EitherQualifiedMove	as Component.EitherQualifiedMove+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Component.Turn			as Component.Turn+import qualified	BishBosh.Notation.Coordinate		as Notation.Coordinate+import qualified	BishBosh.Notation.ICCFNumeric		as Notation.ICCFNumeric+import qualified	BishBosh.Notation.Smith			as Notation.Smith+import qualified	BishBosh.Property.ShowFloat		as Property.ShowFloat+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Numeric+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "moveNotation"++{- |+	* Identifies the move-notations which can be used.++	* /Standard Algebraic/ isn't included here because conversion to or from a /QualifiedMove/ requires access to the /game/.+-}+data MoveNotation+	= Coordinate	-- ^ As used for communication with /xboard/.+	| ICCFNumeric	-- ^ <https://en.wikipedia.org/wiki/ICCF_numeric_notation>.+	| Smith		-- ^ <https://www.chessclub.com/user/chessviewer/smith.html>.+	deriving (Eq, Read, Show)++instance Control.DeepSeq.NFData MoveNotation where+	rnf _	= ()++instance Data.Default.Default MoveNotation where+	def	= Smith++instance HXT.XmlPickler MoveNotation where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range	-- CAVEAT: whether it'll be used as an XML-attribute or an XML-element isn't currently known.++-- | Constant.+coordinate :: MoveNotation+coordinate	= Coordinate++-- | The constant complete range of values.+range :: [MoveNotation]+range	= [Coordinate, ICCFNumeric, Smith]++-- | Reads a /move/ & /move-type/ from the specified 'MoveNotation'.+readsQualifiedMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> MoveNotation+	-> ReadS (Component.EitherQualifiedMove.EitherQualifiedMove x y)+readsQualifiedMove Coordinate	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkPartiallyQualifiedMove . (Notation.Coordinate.getMove &&& Attribute.Rank.getMaybePromotionRank)) . reads+readsQualifiedMove ICCFNumeric	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkPartiallyQualifiedMove . (Notation.ICCFNumeric.getMove &&& Attribute.Rank.getMaybePromotionRank)) . reads+readsQualifiedMove Smith	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkFullyQualifiedMove . (Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType) . Notation.Smith.getQualifiedMove) . reads++-- | Show the syntax required by a specific 'MoveNotation'.+showsMoveSyntax :: MoveNotation -> ShowS+showsMoveSyntax moveNotation	= showChar '/' . showString (+	case moveNotation of+		Coordinate	-> Notation.Coordinate.regexSyntax+		ICCFNumeric	-> Notation.ICCFNumeric.regexSyntax+		Smith		-> Notation.Smith.regexSyntax+ ) . showChar '/'++-- | Returns the origin of the specified coordinate-system.+getOrigin :: MoveNotation -> (Int, Int)+getOrigin Coordinate	= Notation.Coordinate.origin+getOrigin ICCFNumeric	= Notation.ICCFNumeric.origin+getOrigin Smith		= Notation.Smith.origin++-- | Predicate.+isCoordinate :: MoveNotation -> Bool+isCoordinate Coordinate	= True+isCoordinate _		= False++-- | An interface for types which can be rendered in a chess-notation.+class ShowNotation a where+	showsNotation	:: MoveNotation -> a -> ShowS++instance (Enum x, Enum y) => ShowNotation (Component.QualifiedMove.QualifiedMove x y) where+	showsNotation moveNotation qualifiedMove	= case moveNotation of+		Coordinate	-> shows $ Notation.Coordinate.mkCoordinate' move moveType+		ICCFNumeric	-> shows $ Notation.ICCFNumeric.mkICCFNumeric' move moveType+		Smith		-> shows $ Notation.Smith.fromQualifiedMove qualifiedMove+		where+			(move, moveType)	= Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ qualifiedMove++instance (Enum x, Enum y) => ShowNotation (Component.Turn.Turn x y) where+	showsNotation moveNotation	= showsNotation moveNotation . Component.Turn.getQualifiedMove++instance (Enum x, Enum y) => ShowNotation (Cartesian.Coordinates.Coordinates x y) where+	showsNotation Coordinate	= Notation.Coordinate.showsCoordinates+	showsNotation ICCFNumeric	= Notation.ICCFNumeric.showsCoordinates+	showsNotation Smith		= Notation.Smith.showsCoordinates++-- | Show an arbitrary datum using the specified notation.+showNotation :: (ShowNotation a) => MoveNotation -> a -> String+showNotation moveNotation	= ($ "") . showsNotation moveNotation++-- | An alternative to 'Property.ShowFloat.ShowFloat', which permits access to a specific move-notation.+class ShowNotationFloat a where+	showsNotationFloat	:: MoveNotation -> (Double -> ShowS) -> a -> ShowS++-- | Render the specified data in the specified notation, & to the specified number of decimal digits.+showsNotationFloatToNDecimals :: ShowNotationFloat a => MoveNotation -> Property.ShowFloat.NDecimalDigits -> a -> ShowS+showsNotationFloatToNDecimals moveNotation nDecimalDigits	= showsNotationFloat moveNotation (Numeric.showFFloat $ Just nDecimalDigits)+
+ src-lib/BishBosh/Notation/Smith.hs view
@@ -0,0 +1,166 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	<https://www.chessclub.com/user/chessviewer/smith.html Smith-notation>+-}++module BishBosh.Notation.Smith(+-- * Types+-- ** Data-types+	Smith(+--		MkSmith,+		getQualifiedMove+	),+-- * Constants+--	xOrigin,+--	yOrigin,+	origin,+	regexSyntax,+-- * Functions+--	encode,+	showsCoordinates,+-- ** Constructor+	fromQualifiedMove+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	Control.Arrow+import qualified	Data.Char+import qualified	Data.Default+import qualified	Data.List.Extra+import qualified	Data.Maybe++-- | The /x/-origin.+xOrigin :: Int+xOrigin	= Data.Char.ord 'a'++-- | The /y/-origin.+yOrigin :: Int+yOrigin	= Data.Char.ord '1'++-- | The origin.+origin :: (Int, Int)+origin	= (xOrigin, yOrigin)++-- | Defines using a regex, the required syntax.+regexSyntax :: String+regexSyntax	= showString "([a-h][1-8]){2}[" . showString (+	concatMap show Attribute.Rank.range+ ) . showString "EcC]?[" $ showString (+	Data.List.Extra.upper $ map (head . show) Attribute.Rank.promotionProspects+ ) "]?"++-- | Defines a /move/, to enable i/o in /Smith/-notation.+newtype Smith x y	= MkSmith {+	getQualifiedMove	:: Component.QualifiedMove.QualifiedMove x y+} deriving Eq++-- | Constructor.+fromQualifiedMove :: Component.QualifiedMove.QualifiedMove x y -> Smith x y+fromQualifiedMove	= MkSmith++-- | Encodes the ordinate & abscissa.+encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)+encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY++-- | Shows the specified /coordinates/.+showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS+showsCoordinates	= uncurry (.) . encode++instance (Enum x, Enum y) => Show (Smith x y) where+	showsPrec _ MkSmith { getQualifiedMove = qualifiedMove }	= let+		(move, moveType)	= Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ qualifiedMove+	 in showsCoordinates (+		Component.Move.getSource move+	 ) . showsCoordinates (+		Component.Move.getDestination move+	 ) . (+		case moveType of+			Attribute.MoveType.Castle isShort	-> showChar $ if isShort+				then 'c'+				else 'C'+			Attribute.MoveType.EnPassant		-> showChar 'E'+			_ {-normal-}				-> Data.Maybe.maybe id shows (+				Attribute.MoveType.getMaybeExplicitlyTakenRank moveType+			 ) . Data.Maybe.maybe id (+				showString . Data.List.Extra.upper . show+			 ) (+				Attribute.Rank.getMaybePromotionRank moveType+			 )+	 )++-- N.B. this merely validates the syntax, leaving any semantic errors to 'Model.Game.validate'.+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (Smith x y) where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		x : y : x' : y' : remainder	-> let+			fromSmith x'' y''	= Cartesian.Coordinates.mkMaybeCoordinates (+				toEnum $ Data.Char.ord x'' + (Cartesian.Abscissa.xOrigin - xOrigin)+			 ) (+				toEnum $ Data.Char.ord y'' + (Cartesian.Ordinate.yOrigin - yOrigin)+			 )+		 in [+			(+				fromQualifiedMove $ Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) moveType,+				remainder'+			) |+				source			<- Data.Maybe.maybeToList $ fromSmith x y,+				destination		<- Data.Maybe.maybeToList $ fromSmith x' y',+				source /= destination,+				(moveType, remainder')	<- case remainder of+					[]		-> [(Data.Default.def, remainder)]+					'c' : s1	-> [(Attribute.MoveType.shortCastle, s1)]+					'C' : s1	-> [(Attribute.MoveType.longCastle, s1)]+					'E' : s1	-> [(Attribute.MoveType.enPassant, s1)]+					c1 : s1		-> (+						\(moveType, remainder')	-> Data.Maybe.maybe [] {-no parse-} (+							return {-List-monad-} . flip (,) remainder'+						) $ uncurry Attribute.MoveType.mkMaybeNormalMoveType moveType+					 ) $ case reads [c1] of+						[(rank, "")]+							| Data.Char.isUpper c1 {-promotion-}	-> ((Nothing, Just rank), s1)+							| otherwise {-lower-case => capture-}	-> Control.Arrow.first (+								(,) $ Just rank+							) $ case s1 of+								c2 : s2+									| Data.Char.isUpper c2	-> case reads [c2] of+										[(promotionRank, "")]	-> (Just promotionRank, s2)+										_			-> (Nothing, s1)+									| otherwise		-> (Nothing, s1)+								[]	-> (Nothing, s1)+						_	-> ((Nothing, Nothing), remainder)+		 ] -- List-comprehension.+		_				-> []	-- No parse.++instance Attribute.Rank.Promotable (Smith x y) where+	getMaybePromotionRank MkSmith { getQualifiedMove = qualifiedMove }	= Attribute.Rank.getMaybePromotionRank $ Component.QualifiedMove.getMoveType qualifiedMove+
+ src-lib/BishBosh/Property/Empty.hs view
@@ -0,0 +1,42 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* An interface for data which can support the concept of being empty.++	* N.B.: the empty state of the type must be unique.++	* cf. "Data.Default" or 'zero' for a numeric type.+-}++module BishBosh.Property.Empty(+-- * Type-classes+	Empty(..)+) where++-- | An interface which data which can support the concept of being empty, may implement.+class Empty a where+	empty	:: a	-- ^ Constant.++instance (Empty a, Empty b) => Empty (a, b) where+	empty	= (empty, empty)+
+ src-lib/BishBosh/Property/ForsythEdwards.hs view
@@ -0,0 +1,66 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://chessprogramming.wikispaces.com/Forsyth-Edwards+Notation>.++	* <https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation>.+-}++module BishBosh.Property.ForsythEdwards(+-- * Type-classes+	ReadsFEN(..),+	ShowsFEN(..),+-- * Constants+	showsNullField,+	showsSeparator,+-- * Functions+	readFEN,+	showFEN+) where++-- | An alternative to 'Read'.+class ReadsFEN a where+	readsFEN	:: ReadS a	-- ^ Read a datum from FEN.++-- | An alternative to 'Show'.+class ShowsFEN a where+	showsFEN	:: a -> ShowS	-- ^ Stringify a FEN-datum.++-- | Read from FEN.+readFEN	:: ReadsFEN a => String -> a+readFEN s	= case readsFEN s of+	[(a, _)]	-> a+	_		-> error . showString "BishBosh.Property.ForsythEdwards.readFEN:\tfailed to parse " $ shows s "."++-- | Display in FEN.+showFEN	:: ShowsFEN a => a -> String+showFEN a	= showsFEN a ""++-- | The standard way to denote the absence of a field.+showsNullField :: ShowS+showsNullField	= showChar '-'++-- | The standard separator between fields in FEN.+showsSeparator :: ShowS+showsSeparator	= showChar ' '+
+ src-lib/BishBosh/Property/Null.hs view
@@ -0,0 +1,34 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* An interface for data which can support the concept of being null.+-}++module BishBosh.Property.Null(+-- * Type-classes+	Null(..)+) where++class Null a where+	isNull	:: a -> Bool	-- ^ Predicate, cf. 'null' for a list.+
+ src-lib/BishBosh/Property/Opposable.hs view
@@ -0,0 +1,34 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	An interface for data which have the concept of an opposite.+-}++module BishBosh.Property.Opposable(+-- * Type-classes+	Opposable(..)+) where++import Prelude()++-- | An interface which data which have the concept of an opposite, may implement.+class Opposable a where+	getOpposite	:: a -> a
+ src-lib/BishBosh/Property/Orientated.hs view
@@ -0,0 +1,39 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	An interface for vector-like data which is orientated to the edges of the board.+-}++module BishBosh.Property.Orientated (+-- * Type-classes+	Orientated(..)+) where++import	Control.Arrow((&&&))++-- | An interface for vector-like data.+class Orientated a where+	isDiagonal	:: a -> Bool	-- ^ Whether it is diagonal wrt the edges of the board.+	isParallel	:: a -> Bool	-- ^ Whether it is parallel to an edge of the board.++	isStraight :: a -> Bool+	isStraight	= uncurry (||) . (isParallel &&& isDiagonal)	-- Default implementation.+
+ src-lib/BishBosh/Property/Reflectable.hs view
@@ -0,0 +1,38 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	An interface for data which can be transformed by reflection.+-}++module BishBosh.Property.Reflectable (+-- * Type-classes+	ReflectableOnX(..),+	ReflectableOnY(..)+) where++-- | An interface which data which can be transformed by reflection about the /x/-axis, may implement.+class ReflectableOnX a where+	reflectOnX	:: a -> a	-- ^ Reflect about the /x/-axis, i.e. to top to bottom & vice-versa.++-- | An interface which data which can be transformed by reflection about the /y/-axis, may implement.+class ReflectableOnY a where+	reflectOnY	:: a -> a	-- ^ Reflect about the /y/-axis, i.e. left to right & vice-versa.+
+ src-lib/BishBosh/Property/Rotatable.hs view
@@ -0,0 +1,44 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* An interface for data which can be transformed by rotation.++	* CAVEAT: only rotations in discrete 90-degrees steps are considered.+-}++module BishBosh.Property.Rotatable (+-- * Type-classes+	Rotatable(..)+) where++import qualified	BishBosh.Property.Reflectable	as Property.Reflectable++-- | An interface which data which can be transformed by rotation, may implement.+class (Property.Reflectable.ReflectableOnX a, Property.Reflectable.ReflectableOnY a) => Rotatable a where+	rotate90	:: a -> a	-- ^ Rotate anticlockwise by 90 degrees, so that @N@ becomes @W@.++	rotate180	:: a -> a	-- ^ Rotate by 180 degrees.+	rotate180	= Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnY	-- CAVEAT: perhaps not be the most efficient implementation.++	rotate270	:: a -> a	-- ^ Rotate clockwise by 90 degrees, so that @N@ becomes @E@.+
+ src-lib/BishBosh/Property/ShowFloat.hs view
@@ -0,0 +1,47 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	An interface for floating-point data, which provides an alterative to 'Show'.+-}++module BishBosh.Property.ShowFloat(+-- * Type-classes+	ShowFloat(..),+-- * Types+-- ** Type-synonyms+	NDecimalDigits,+-- * Functions+	showsFloatToN+) where++import qualified	Numeric++-- | A number of decimals digits.+type NDecimalDigits	= Int++-- | An alternative to 'Show', for floating-point data.+class ShowFloat a where+	showsFloat	:: (Double -> ShowS) -> a -> ShowS++-- | Render the specified data to the specified number of decimal digits.+showsFloatToN :: ShowFloat a => NDecimalDigits -> a -> ShowS+showsFloatToN nDecimalDigits	= showsFloat (Numeric.showFFloat $ Just nDecimalDigits)+
+ src-lib/BishBosh/Property/Tree.hs view
@@ -0,0 +1,53 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++-}++module BishBosh.Property.Tree(+-- * Type-classes+	Prunable(..),+-- * Types+-- ** Type-synonyms+	Depth+) where++import qualified	Data.Tree++-- | A distance down the tree.+type Depth	= Int++-- | An interface which tree-like data can support.+class Prunable tree where+	prune	:: Depth -> tree -> tree	-- ^ Remove branches after the specified depth.++instance Prunable (Data.Tree.Tree a) where+	prune depth tree@Data.Tree.Node { Data.Tree.subForest = forest }+		| depth < 0	= error "BishBosh.Property.Tree.prune:\tdepth can't be negative."+		| otherwise	= tree {+			Data.Tree.subForest	= if depth == 0+				then []+				else map (+					prune $ pred depth	-- Recurse.+				) forest+		}+
+ src-lib/BishBosh/Search/AlphaBeta.hs view
@@ -0,0 +1,326 @@+-- {-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Performs an <https://chessprogramming.wikispaces.com/Alpha-Beta> search, implemented using <https://chessprogramming.wikispaces.com/Negamax>.++	* Moves are dynamically re-ordering using the killer-heuristic.++	* <https://chessprogramming.wikispaces.com/Repetitions> & <https://chessprogramming.wikispaces.com/Transposition>s are detected.+-}++module BishBosh.Search.AlphaBeta(+-- * Types+-- ** Type-synonyms+--	Transformation,+-- ** Data-types+--	Result(),+-- * Functions+	extractSelectedTurns,+--	updateKillerMoves,+--	findTranspositionTerminalQuantifiedGame,+--	updateTranspositions,+	negaMax,+--	negateFitnessOfResult,+--	addNMovesToResult+ ) where++import			BishBosh.Model.Game((=~))+import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.QualifiedMove			as Component.QualifiedMove+import qualified	BishBosh.Component.Turn					as Component.Turn+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Search.DynamicMoveData				as Search.DynamicMoveData+import qualified	BishBosh.Search.KillerMoves				as Search.KillerMoves+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.Search.Transpositions				as Search.Transpositions+import qualified	BishBosh.Search.TranspositionValue			as Search.TranspositionValue+import qualified	BishBosh.State.InstancesByPosition			as State.InstancesByPosition+import qualified	BishBosh.State.TurnsByLogicalColour			as State.TurnsByLogicalColour+import qualified	Control.Exception+import qualified	Control.Monad.Reader+import qualified	Data.Maybe+import qualified	Data.Tree++-- | The type returned by 'negaMax'.+data Result x y positionHash criterionValue weightedMean	= MkResult {+	getDynamicMoveData	:: Search.DynamicMoveData.DynamicMoveData x y positionHash,	-- ^ Killer moves & transpositions.+	getQuantifiedGame	:: Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean,+	getNMovesEvaluated	:: Component.Move.NMoves					-- ^ The total number of moves analysed, before making the selection.+}++{- |+	* Remove any /turn/s made before starting the search.++	* N.B.: abandons the fitness of the game.+-}+extractSelectedTurns+	:: Component.Move.NPlies+	-> Result x y positionHash criterionValue weightedMean+	-> (Search.DynamicMoveData.DynamicMoveData x y positionHash, [Component.Turn.Turn x y], Component.Move.NMoves)+extractSelectedTurns nPlies MkResult {+	getDynamicMoveData	= dynamicMoveData,+	getQuantifiedGame	= quantifiedGame,+	getNMovesEvaluated	= nMovesEvaluated+} = (+	dynamicMoveData,+	Evaluation.QuantifiedGame.getLatestTurns nPlies quantifiedGame,+	nMovesEvaluated+ )++-- | Record the last move as a killer, unless it's a capture move.+updateKillerMoves+	:: (Ord x, Ord y)+	=> Model.Game.Game x y+	-> Search.DynamicMoveData.Transformation x y positionHash+updateKillerMoves game+	| Just lastTurn <- Model.Game.maybeLastTurn game	= if Component.Turn.isCapture lastTurn+		then id	-- This move was (assuming appropriate Search-options) statically sorted.+		else Search.DynamicMoveData.updateKillerMoves . Search.KillerMoves.insert (+			State.TurnsByLogicalColour.getNPlies $ Model.Game.getTurnsByLogicalColour game+		) $ Search.DynamicMoveData.mkKillerMoveKeyFromTurn lastTurn+	| otherwise						= Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Search.AlphaBeta.updateKillerMoves:\tzero turns have been made."++{- |+	* Track the specified move-sequence down the /positionHashQuantifiedGameTree/ & retrieve the fitness from the terminal quantified game.++	* CAVEAT: the return-value, is quantified from the perspective of the player who is about to move.+-}+findTranspositionTerminalQuantifiedGame :: (+	Eq	x,+	Eq	y,+	Num	weightedMean+ )+	=> Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> Search.TranspositionValue.Value (Component.Move.Move x y)+	-> Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean+findTranspositionTerminalQuantifiedGame positionHashQuantifiedGameTree transpositionValue	= Data.Maybe.maybe (+	Control.Exception.throw $ Data.Exception.mkSearchFailure "BishBosh.Search.AlphaBeta.findTranspositionTerminalQuantifiedGame:\tEvaluation.PositionHashQuantifiedGameTree.traceMatchingMoves failed."+ ) (+	(+		if even $ Search.TranspositionValue.inferSearchDepth transpositionValue+			then Evaluation.QuantifiedGame.negateFitness	-- The opponent made the last move in the list, & therefore defined the fitness.+			else id+	) . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame . last+ ) . Evaluation.PositionHashQuantifiedGameTree.traceMatchingMoves positionHashQuantifiedGameTree $ Search.TranspositionValue.getMoves transpositionValue++-- | Record a move-sequence in the transposition-table.+updateTranspositions :: (+	Eq	x,+	Eq	y,+	Num	weightedMean,+	Ord	positionHash,+	Ord	weightedMean+ )+	=> Search.TranspositionValue.IsOptimal+	-> Component.Move.NPlies+	-> positionHash+	-> [Component.Turn.Turn x y]+	-> Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> Search.DynamicMoveData.Transformation x y positionHash+updateTranspositions isOptimal nPlies positionHash turns positionHashQuantifiedGameTree	= Search.DynamicMoveData.updateTranspositions $ Search.Transpositions.insert (+	Evaluation.QuantifiedGame.getFitness . findTranspositionTerminalQuantifiedGame positionHashQuantifiedGameTree+ ) positionHash {-the hash of the game before the first move in the sequence-} . Search.TranspositionValue.mkValue isOptimal nPlies $ map (+	Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+ ) turns++-- | Implements a depth-first search (implemented as nega-max), with alpha-beta pruning.+negaMax :: {-forall x y positionHash criterionValue weightedMean.-} (+	Enum	x,+	Enum	y,+	Eq	criterionValue,+	Num	weightedMean,+	Ord	weightedMean,+	Ord	positionHash,+	Ord	x,+	Ord	y+ )+	=> Input.SearchOptions.SearchDepth	-- ^ The depth to which the tree should be searched; i.e. the number of plies to look-ahead.+	-> Search.SearchState.SearchState x y positionHash criterionValue weightedMean+	-> Input.SearchOptions.Reader (Result x y positionHash criterionValue weightedMean)+negaMax initialSearchDepth initialSearchState	= do+	maybeMinimumTranspositionSearchDepth	<- Control.Monad.Reader.asks Input.SearchOptions.maybeMinimumTranspositionSearchDepth+	recordKillerMoves			<- Control.Monad.Reader.asks Input.SearchOptions.recordKillerMoves+	trapRepeatedPositions			<- Control.Monad.Reader.asks Input.SearchOptions.getTrapRepeatedPositions++	let+{-+		descend+			:: Evaluation.QuantifiedGame.OpenInterval x y criterionValue weightedMean+			-> Input.SearchOptions.SearchDepth+			-> Search.SearchState.SearchState x y positionHash criterionValue weightedMean+			-> Result x y positionHash criterionValue weightedMean+-}+		descend (maybeAlphaQuantifiedGame, maybeBetaQuantifiedGame) searchDepth searchState+			| searchDepth == 0 || Model.Game.isTerminated game	= MkResult {+				getDynamicMoveData	= dynamicMoveData,+				getQuantifiedGame	= Evaluation.QuantifiedGame.negateFitness quantifiedGame,	-- CAVEAT: zero new moves have been applied, so the last move was the opponent's.+				getNMovesEvaluated	= 1								-- Fitness-negation requires evaluation.+			} -- Terminate the recursion.+			| useTranspositions+			, Just transpositionValue	<- Search.Transpositions.find positionHash $ Search.DynamicMoveData.getTranspositions dynamicMoveData+			, let+				selectMax''	= selectMax' $ Data.Maybe.fromMaybe (+					Control.Exception.throw $ Data.Exception.mkSearchFailure "BishBosh.Search.AlphaBeta.negaMax.descend:\tEvaluation.PositionHashQuantifiedGameTree.promoteMatchingMoves failed."	-- N.B.: perhaps because of hash-collision.+				 ) . Evaluation.PositionHashQuantifiedGameTree.promoteMatchingMoves (Search.TranspositionValue.getMoves transpositionValue)+			= if Search.TranspositionValue.inferSearchDepth transpositionValue < searchDepth+				then selectMax''	-- This transposition resulted from a search-depth which is insufficient to compose a valid response to this search.+				else let+					transposedQuantifiedGame	= findTranspositionTerminalQuantifiedGame positionHashQuantifiedGameTree transpositionValue+				in if Search.TranspositionValue.getIsOptimal transpositionValue+					then MkResult {+						getDynamicMoveData	= dynamicMoveData,+						getQuantifiedGame	= Control.Exception.assert (transposedQuantifiedGame == getQuantifiedGame selectMax'') transposedQuantifiedGame,+						getNMovesEvaluated	= 0+					}+					else Data.Maybe.maybe selectMax'' (+						\betaQuantifiedGame -> if Evaluation.QuantifiedGame.compareFitness transposedQuantifiedGame betaQuantifiedGame /= LT+							then MkResult {+								getDynamicMoveData	= dynamicMoveData,+								getQuantifiedGame	= Control.Exception.assert (betaQuantifiedGame == getQuantifiedGame selectMax'') betaQuantifiedGame,+								getNMovesEvaluated	= 0+							}+							else selectMax''+					) maybeBetaQuantifiedGame+			| otherwise	= selectMax' id+			where+				(positionHashQuantifiedGameTree, dynamicMoveData)	= Search.SearchState.getPositionHashQuantifiedGameTree &&& Search.SearchState.getDynamicMoveData $ searchState++				useTranspositions		= Data.Maybe.maybe False (searchDepth >=) maybeMinimumTranspositionSearchDepth+				(positionHash, quantifiedGame)	= Evaluation.PositionHashQuantifiedGameTree.getRootPositionHash &&& Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame $ positionHashQuantifiedGameTree+				game				= Evaluation.QuantifiedGame.getGame quantifiedGame	-- Prior to application of any move from the forest.+				(nPlies, nDistinctPositions)	= State.TurnsByLogicalColour.getNPlies . Model.Game.getTurnsByLogicalColour &&& State.InstancesByPosition.getNDistinctPositions . Model.Game.getInstancesByPosition $ game	-- Count the distinct positions since the last irreversible move.++				selectMax' forestSorter	= selectMax dynamicMoveData maybeAlphaQuantifiedGame . forestSorter . (+					if recordKillerMoves+						then Evaluation.PositionHashQuantifiedGameTree.sortNonCaptureMoves (+							Search.KillerMoves.sortByHistoryHeuristic (+								Model.Game.getNextLogicalColour game+							) (+								Search.DynamicMoveData.mkKillerMoveKeyFromTurn . Evaluation.QuantifiedGame.getLastTurn . Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame'+							) $ Search.DynamicMoveData.getKillerMoves dynamicMoveData+						) -- Dynamically advance the evaluation of killer-moves, to just after the statically sorted capture-moves.+						else id+				 ) . Data.Tree.subForest $ Evaluation.PositionHashQuantifiedGameTree.deconstruct positionHashQuantifiedGameTree+{-+				selectMax+					:: Search.DynamicMoveData.DynamicMoveData x y positionHash+					-> Maybe (Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean)+					-> [Evaluation.PositionHashQuantifiedGameTree.BarePositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean]+					-> Result x y positionHash criterionValue weightedMean+-}+				selectMax dynamicMoveData' maybeAlphaQuantifiedGame' (node : remainingNodes)+					| trapRepeatedPositions+					, nDistinctPositions >= State.InstancesByPosition.leastCyclicPlies	-- CAVEAT: accounting for the typically (except when its the initial position) unrepeatable first distinct position.+					, State.InstancesByPosition.getNDistinctPositions (+						Model.Game.getInstancesByPosition . Evaluation.QuantifiedGame.getGame $ Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame' node	-- If the size hasn't increased, then the recently added position must have already been a member; (size == 1) during successive unrepeatable moves also, but that exception is caught above.+					) == nDistinctPositions	= selectMax dynamicMoveData' maybeAlphaQuantifiedGame' remainingNodes		-- Skip this node & recurse through the remaining moves at this depth.+					| Just betaQuantifiedGame	<- maybeBetaQuantifiedGame	-- Beta-cutoff can't occur until beta has been defined.+					, let fitnessComparedWithBeta	= Evaluation.QuantifiedGame.compareFitness quantifiedGame'' betaQuantifiedGame+					, fitnessComparedWithBeta /= LT	= result'' {+						getDynamicMoveData	= let+							game''	= Evaluation.QuantifiedGame.getGame quantifiedGame''+						in (+							if recordKillerMoves && not (+								fitnessComparedWithBeta == EQ && game'' =~ Evaluation.QuantifiedGame.getGame betaQuantifiedGame	-- CAVEAT: betaQuantifiedGame was copied in selectMax's terminal case, from one of the open-interval's boundaries.+							) -- Confirm that betaQuantifiedGame is beneath the current node.+								then updateKillerMoves game''+								else id+						) dynamicMoveData'',+						getQuantifiedGame	= betaQuantifiedGame+					} -- Beta-cutoff; the solution-space is either zero or negative.+					| otherwise	= addNMovesToResult (+						getNMovesEvaluated result''+					) $ let+						isFitter	= Data.Maybe.maybe True {-alpha is undefined => anything qualifies-} (+							(== GT) . Evaluation.QuantifiedGame.compareFitness quantifiedGame''+						 ) maybeAlphaQuantifiedGame'+					in selectMax (+						(+							if useTranspositions && isFitter+								then updateTranspositions False {-isOptimal-} nPlies positionHash {-the hash of the game before the first move in the sequence-} (+									Evaluation.QuantifiedGame.getLatestTurns nPlies quantifiedGame''	-- Discard turns previously applied to the game to which the positionHash refers.+								) positionHashQuantifiedGameTree+								else id+						) dynamicMoveData''+					) (+						if isFitter+							then Just quantifiedGame''	-- Increase alpha (i.e. the lower acceptable solution-bound).+							else maybeAlphaQuantifiedGame'+					) remainingNodes	-- Recurse through the remaining moves at this depth.+					where+						result''@MkResult {+							getDynamicMoveData	= dynamicMoveData'',+							getQuantifiedGame	= quantifiedGame''+						} = negateFitnessOfResult . descend (+							curry Evaluation.QuantifiedGame.negateInterval maybeAlphaQuantifiedGame' maybeBetaQuantifiedGame+						 ) (+							pred searchDepth+						 ) $ Search.SearchState.mkSearchState (+							Evaluation.PositionHashQuantifiedGameTree.fromBarePositionHashQuantifiedGameTree node+						 ) dynamicMoveData'	-- Recurse.+				selectMax dynamicMoveData' maybeAlphaQuantifiedGame' _	= MkResult {+					getDynamicMoveData	= dynamicMoveData',+					getQuantifiedGame	= Data.Maybe.fromMaybe (+						Data.Maybe.fromMaybe (+							Control.Exception.throw $ Data.Exception.mkResultUndefined "BishBosh.Search.AlphaBeta.negaMax.selectMax:\tneither alpha nor beta is defined."+						) maybeBetaQuantifiedGame	-- Return the only viable position known.+					) maybeAlphaQuantifiedGame',	-- Return the fittest viable position found.+					getNMovesEvaluated	= 0+				} -- Zero moves remain => terminate the recursion.+	return {-to Reader-monad-} . (+		\result@MkResult {+			getDynamicMoveData	= dynamicMoveData,+			getQuantifiedGame	= quantifiedGame+		} -> let+			positionHashQuantifiedGameTree		= Search.SearchState.getPositionHashQuantifiedGameTree initialSearchState+			nPlies					= State.TurnsByLogicalColour.getNPlies . Model.Game.getTurnsByLogicalColour . Evaluation.QuantifiedGame.getGame $ Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame positionHashQuantifiedGameTree+		in result {+			getDynamicMoveData	= updateTranspositions True {-Optimal-} nPlies (+				Evaluation.PositionHashQuantifiedGameTree.getRootPositionHash positionHashQuantifiedGameTree+			) (+				Evaluation.QuantifiedGame.getLatestTurns nPlies quantifiedGame+			) positionHashQuantifiedGameTree dynamicMoveData+		}+	 ) $ descend Evaluation.QuantifiedGame.unboundedInterval initialSearchDepth initialSearchState++-- | The type of a function which transforms the result.+type Transformation x y positionHash criterionValue weightedMean	= Result x y positionHash criterionValue weightedMean -> Result x y positionHash criterionValue weightedMean++-- | Mutator.+negateFitnessOfResult :: Num weightedMean => Transformation x y positionHash criterionValue weightedMean+negateFitnessOfResult result@MkResult { getQuantifiedGame = quantifiedGame }	= result {+	getQuantifiedGame	= Evaluation.QuantifiedGame.negateFitness quantifiedGame+}++-- | Mutator.+addNMovesToResult :: Component.Move.NMoves -> Transformation x y positionHash criterionValue weightedMean+addNMovesToResult nMoves result@MkResult { getNMovesEvaluated = nMovesEvaluated }	= Control.Exception.assert (nMoves > 0) result {+	getNMovesEvaluated	= nMoves + nMovesEvaluated+}+
+ src-lib/BishBosh/Search/DynamicMoveData.hs view
@@ -0,0 +1,110 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++-}++module BishBosh.Search.DynamicMoveData(+-- * Types+-- ** Type-synonyms+	Transformation,+-- ** Data-types+	KillerMoveKey(),+	DynamicMoveData(+--		MkDynamicMoveData,+		getKillerMoves,+		getTranspositions+	),+-- * Functions+-- ** Constructors+	mkKillerMoveKeyFromTurn,+-- ** Mutators+	updateKillerMoves,+	updateTranspositions,+	euthanise+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Component.Turn			as Component.Turn+import qualified	BishBosh.Input.SearchOptions		as Input.SearchOptions+import qualified	BishBosh.Property.Empty			as Property.Empty+import qualified	BishBosh.Search.EphemeralData		as Search.EphemeralData+import qualified	BishBosh.Search.KillerMoves		as Search.KillerMoves+import qualified	BishBosh.Search.Transpositions		as Search.Transpositions+import qualified	Data.Maybe++{- |+	* Killer-moves are indexed by both the /move/ & the /rank/ of the piece which made it.++	* CAVEAT: there's still ambiguity in this /key/, since it may match either a different piece of the same /rank/ or have a different /move-type/ (though typically only quiet moves are recorded), in sibling games.+-}+data KillerMoveKey x y	= MkKillerMoveKey (Component.Move.Move x y) Attribute.Rank.Rank deriving (Eq, Ord, Show)++-- | Constructor.+mkKillerMoveKeyFromTurn :: Component.Turn.Turn x y -> KillerMoveKey x y+mkKillerMoveKeyFromTurn	= uncurry MkKillerMoveKey . (Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove &&& Component.Turn.getRank)++-- | The data on /move/s, gathered while searching.+data DynamicMoveData x y positionHash	= MkDynamicMoveData {+	getKillerMoves		:: Search.KillerMoves.KillerMoves (KillerMoveKey x y),+	getTranspositions	:: Search.Transpositions.Transpositions (Component.Move.Move x y) positionHash+}++instance Property.Empty.Empty (DynamicMoveData x y positionHash) where+	empty = MkDynamicMoveData {+		getKillerMoves		= Property.Empty.empty,+		getTranspositions	= Property.Empty.empty+	}++-- | The type of a function which transforms the dynamic move-data.+type Transformation x y positionHash	= DynamicMoveData x y positionHash -> DynamicMoveData x y positionHash++-- | Mutator.+updateKillerMoves :: Search.KillerMoves.Transformation (KillerMoveKey x y) -> Transformation x y positionHash+updateKillerMoves f dynamicMoveData@MkDynamicMoveData { getKillerMoves = killerMoves }	= dynamicMoveData { getKillerMoves = f killerMoves }++-- | Mutator.+updateTranspositions :: Search.Transpositions.Transformation (Component.Move.Move x y) positionHash -> Transformation x y positionHash+updateTranspositions f dynamicMoveData@MkDynamicMoveData { getTranspositions = transpositions }	= dynamicMoveData { getTranspositions = f transpositions }++-- | Remove archaic data.+euthanise+	:: Component.Move.NPlies			-- ^ The number of plies currently applied to the game.+	-> Input.SearchOptions.MaybeRetireAfterNMoves	-- ^ The number of full moves after which killer-moves should be retired.+	-> Input.SearchOptions.MaybeRetireAfterNMoves	-- ^ The number of full moves after which transpositions should be retired.+	-> Transformation x y positionHash+euthanise nPlies maybeRetireKillerMovesAfter maybeRetireTranspositionsAfter MkDynamicMoveData {+	getKillerMoves		= killerMoves,+	getTranspositions	= transpositions+} = MkDynamicMoveData {+	getKillerMoves	= Data.Maybe.maybe id (+		Search.EphemeralData.euthanise . reduceNPlies	-- When searching for a move at (nPlies + 1), matches with killer-moves from 'iterate (subtract 2) $ pred nPlies' are relevant up to a point. N.B. the opponent's killer-moves are useless.+	) maybeRetireKillerMovesAfter killerMoves,+	getTranspositions	= Data.Maybe.maybe id (+		Search.EphemeralData.euthanise . reduceNPlies+	) maybeRetireTranspositionsAfter transpositions+} where+	reduceNPlies	= (`subtract` nPlies) . (* 2) {-convert full moves to plies-}+
+ src-lib/BishBosh/Search/EphemeralData.hs view
@@ -0,0 +1,36 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Permits maintenance of data collected during the search for a move.+-}++module BishBosh.Search.EphemeralData(+-- * Type-classes+	EphemeralData(..)+) where++import qualified	BishBosh.Component.Move	as Component.Move++-- | An interface for short-lived data.+class EphemeralData a where+	getSize		:: a -> Int				-- ^ Get the current size of the collection.+	euthanise	:: Component.Move.NPlies -> a -> a	-- ^ Prune old data from the collection.+
+ src-lib/BishBosh/Search/KillerMoves.hs view
@@ -0,0 +1,114 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@] <https://chessprogramming.wikispaces.com/Killer+Heuristic>.+-}++module BishBosh.Search.KillerMoves (+-- * Types+-- ** Type-synonyms+	Transformation,+-- ** Data-types+	KillerMoves(),+-- * Functions+	sortByHistoryHeuristic,+-- ** Mutators+	insert+ ) where++import			Control.Arrow((&&&))+import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Property.Empty			as Property.Empty+import qualified	BishBosh.Search.EphemeralData		as Search.EphemeralData+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.IntMap+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Map.Strict+import qualified	Data.Maybe++{- |+	* Used to contain the number of instances of each killer-move (a quiet move which triggered beta-cutoff),+	indexed by the logical-colour of the player making the move & the number of plies into the game, at which it occurred.++	* These data can be used to advance the evaluation of identical sibling moves, in the hope of achieving beta-cutoff sooner.+-}+newtype KillerMoves killerMove	= MkKillerMoves {+	deconstruct	:: Attribute.LogicalColour.ByLogicalColour (+		Data.Map.Map killerMove (+			Data.IntMap.IntMap {-by NPlies-} Component.Move.NMoves+		)+	)+}++instance Property.Empty.Empty (KillerMoves killerMove) where+	empty	= MkKillerMoves . Attribute.LogicalColour.listArrayByLogicalColour $ repeat Data.Map.empty++instance Search.EphemeralData.EphemeralData (KillerMoves killerMove) where+	getSize MkKillerMoves { deconstruct = nInstancesByKeyByNPliesByLogicalColour }	= Data.Foldable.foldl' (+		Data.Map.foldl' $ Data.IntMap.foldl' (+)+	 ) 0 nInstancesByKeyByNPliesByLogicalColour++	euthanise nPlies killerMoves@MkKillerMoves { deconstruct = nInstancesByKeyByNPliesByLogicalColour }+		| nPlies <= 0	= killerMoves	-- This might occur at the start of the game, because the caller subtracts a fixed value from the current number of plies.+		| otherwise	= MkKillerMoves $ Data.Array.IArray.amap (+			Data.Map.mapMaybe $ \m -> let+				m'	= Data.IntMap.filterWithKey (\nPlies' _ -> nPlies' > nPlies) m+			in if Data.IntMap.null m'+				then Nothing+				else Just m'+		) nInstancesByKeyByNPliesByLogicalColour++-- | The type of a function which transforms a collection of killer-moves.+type Transformation killerMove	= KillerMoves killerMove -> KillerMoves killerMove++-- | Insert a killer-move.+insert+	:: Ord killerMove+	=> Component.Move.NPlies	-- ^ The total number of plies applied to the game.+	-> killerMove+	-> Transformation killerMove+insert nPlies killerMove MkKillerMoves { deconstruct = nInstancesByKeyByNPliesByLogicalColour }	= MkKillerMoves $ nInstancesByKeyByNPliesByLogicalColour // [+	id &&& Data.Map.Strict.insertWith (+		Data.IntMap.unionWith (+)+	) killerMove (+		Data.IntMap.singleton nPlies 1+	) . (nInstancesByKeyByNPliesByLogicalColour !) $ if even nPlies+		then Attribute.LogicalColour.Black+		else Attribute.LogicalColour.White	-- White makes the first move.+ ] -- Singleton.++-- | Sorts an arbitrary list using the History-heuristic; <https://chessprogramming.wikispaces.com/History+Heuristic>.+sortByHistoryHeuristic+	:: Ord killerMove+	=> Attribute.LogicalColour.LogicalColour+	-> (a -> killerMove)	-- ^ Constructor.+	-> KillerMoves killerMove+	-> [a]+	-> [a]+sortByHistoryHeuristic logicalColour killerMoveConstructor MkKillerMoves { deconstruct = nInstancesByNPliesByKeyByLogicalColour }	= Data.List.sortOn $ Data.Maybe.maybe 0 (+	negate {-largest first-} . Data.IntMap.foldl' (+) 0+ ) . (+	`Data.Map.lookup` (nInstancesByNPliesByKeyByLogicalColour ! logicalColour)+ ) . killerMoveConstructor
+ src-lib/BishBosh/Search/Search.hs view
@@ -0,0 +1,136 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Searches for the optimal /move/ from those currently available.+-}++module BishBosh.Search.Search(+-- * Types+-- ** Data-types+	Result (+--		MkResult,+		getSearchState,+		getQuantifiedGames,+		getNMovesEvaluated+	),+-- * Constants+	showsSeparator,+-- * Functions+	search,+	calculateBranchingFactor+ ) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Notation.MoveNotation				as Notation.MoveNotation+import qualified	BishBosh.Search.AlphaBeta				as Search.AlphaBeta+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.State.TurnsByLogicalColour			as State.TurnsByLogicalColour+import qualified	BishBosh.Text.ShowList					as Text.ShowList+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Control.Monad.Reader+import qualified	Data.Maybe++-- | The type returned by 'search'.+data Result x y positionHash criterionValue weightedMean	= MkResult {+	getSearchState		:: Search.SearchState.SearchState x y positionHash criterionValue weightedMean,+	getQuantifiedGames	:: [Evaluation.QuantifiedGame.QuantifiedGame x y criterionValue weightedMean],	-- ^ The optimal path down the /positionHashQuantifiedGameTree/.+	getNMovesEvaluated	:: Component.Move.NMoves							-- ^ The total number of nodes in the /positionHashQuantifiedGameTree/ which were analysed.+}++instance Control.DeepSeq.NFData weightedMean => Control.DeepSeq.NFData (Result x y positionHash criterionValue weightedMean) where+	rnf MkResult { getQuantifiedGames = quantifiedGames }	= Control.DeepSeq.rnf quantifiedGames	-- CAVEAT: don't evaluate the search-state, since this contains the PositionHashQuantifiedGameTree !++-- | Used to format output.+showsSeparator :: ShowS+showsSeparator	= showString " -> "++instance (Enum x, Enum y, Real criterionValue, Real weightedMean) => Notation.MoveNotation.ShowNotationFloat (Result x y positionHash criterionValue weightedMean) where+	showsNotationFloat moveNotation showsDouble result@MkResult {+		getQuantifiedGames	= quantifiedGames,+		getNMovesEvaluated	= nMovesEvaluated+	} = Text.ShowList.showsFormattedList showsSeparator (+		Notation.MoveNotation.showsNotationFloat moveNotation showsDouble+	 ) quantifiedGames . showString "; selected after analysing " . shows nMovesEvaluated . showString " moves (branching-factor" . Text.ShowList.showsAssociation . showsDouble (+		calculateBranchingFactor result+	 ) . showChar ')'++-- | Initiates the recursive function 'Search.AlphaBeta.negaMax', then unpacks the results.+search :: (+	Enum	x,+	Enum	y,+	Eq	criterionValue,+	Num	weightedMean,+	Ord	weightedMean,+	Ord	positionHash,+	Ord	x,+	Ord	y+ )+	=> Input.SearchOptions.SearchDepth	-- ^ How deep down the tree to search.+	-> Search.SearchState.SearchState x y positionHash criterionValue weightedMean+	-> Input.SearchOptions.Reader (Result x y positionHash criterionValue weightedMean)+search 0 _	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Search.Search.search:\t" . shows Input.SearchOptions.searchDepthTag . showString " must be at least " $ shows Input.SearchOptions.minimumSearchDepth "."+search searchDepth searchState+	| Just terminationReason <- Model.Game.getMaybeTerminationReason game	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Search.Search.search:\tthe game has already terminated; " $ shows terminationReason "."+	| otherwise								= do+		(maybeRetireKillerMovesAfter, maybeRetireTranspositionsAfter)	<- Control.Monad.Reader.asks $ Input.SearchOptions.getMaybeRetireKillerMovesAfter &&& Input.SearchOptions.maybeRetireTranspositionsAfter++		let nPlies	= State.TurnsByLogicalColour.getNPlies $ Model.Game.getTurnsByLogicalColour game++		searchResult	<- Search.AlphaBeta.negaMax searchDepth $ Search.SearchState.euthanise nPlies maybeRetireKillerMovesAfter maybeRetireTranspositionsAfter searchState++		case Search.AlphaBeta.extractSelectedTurns nPlies searchResult of+			(dynamicMoveData, turns@(turn : _), nMovesEvaluated)	-> let+				isMatch turn'	= (== turn') . Evaluation.QuantifiedGame.getLastTurn . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame+			 in return {-to Reader-monad-} MkResult {+				getSearchState		= Search.SearchState.mkSearchState (+					Data.Maybe.fromMaybe (+						Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.Search.Search.search:\tBishBosh.Data.RoseTree.reduce failed."+					) $ Evaluation.PositionHashQuantifiedGameTree.reduce (isMatch turn) positionHashQuantifiedGameTree+				) dynamicMoveData,+				getQuantifiedGames	= map Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame . Data.Maybe.fromMaybe (+					Control.Exception.throw $ Data.Exception.mkSearchFailure "BishBosh.Search.Search.search:\tBishBosh.Data.RoseTree.traceRoute failed."+				) $ Evaluation.PositionHashQuantifiedGameTree.traceRoute isMatch positionHashQuantifiedGameTree turns,+				getNMovesEvaluated	= nMovesEvaluated+			}+			_							-> Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Search.Search.search:\tzero turns selected."+	where+		positionHashQuantifiedGameTree	= Search.SearchState.getPositionHashQuantifiedGameTree searchState+		game				= Evaluation.QuantifiedGame.getGame $ Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame positionHashQuantifiedGameTree++-- | Calculate the geometric-mean of the number of moves evaluated at each node.+calculateBranchingFactor :: Floating branchingFactor => Result x y positionHash criterionValue weightedMean -> branchingFactor+calculateBranchingFactor MkResult {+	getQuantifiedGames	= quantifiedGames,+	getNMovesEvaluated	= nMovesEvaluated+}+	| null quantifiedGames	= Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Search.Search.calculateBranchingFactor:\tnull quantifiedGames."+	| nMovesEvaluated == 0	= Control.Exception.throw $ Data.Exception.mkInsufficientData "BishBosh.Search.Search.calculateBranchingFactor:\tzero moves analysed."+	| otherwise		= fromIntegral nMovesEvaluated ** recip (+		fromIntegral $ length quantifiedGames	-- The search-depth.+	)+
+ src-lib/BishBosh/Search/SearchState.hs view
@@ -0,0 +1,89 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The state which is threaded through successive calls to 'Search.Search.search'.+-}++module BishBosh.Search.SearchState(+-- * Types+-- ** Data-types+	SearchState(+--		MkSearchState,+		getPositionHashQuantifiedGameTree,+		getDynamicMoveData+	),+-- * Functions+	euthanise,+-- ** Constructors+	mkSearchState,+	initialise+ ) where++import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Property.Empty					as Property.Empty+import qualified	BishBosh.Search.DynamicMoveData				as Search.DynamicMoveData++-- | The data which is both received & returned by 'select', so that it is transported through the entire game.+data SearchState x y positionHash criterionValue weightedMean	= MkSearchState {+	getPositionHashQuantifiedGameTree	:: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean,+	getDynamicMoveData			:: Search.DynamicMoveData.DynamicMoveData x y positionHash+}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y,+	Show	criterionValue,+	Show	positionHash,+	Show	weightedMean+ ) => Show (SearchState x y positionHash criterionValue weightedMean) where+	showsPrec _ _	= showString "SearchState {...}"++-- | Constructor.+mkSearchState+	:: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean+	-> Search.DynamicMoveData.DynamicMoveData x y positionHash+	-> SearchState x y positionHash criterionValue weightedMean+mkSearchState	= MkSearchState++-- | Constructor.+initialise :: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree x y positionHash criterionValue weightedMean -> SearchState x y positionHash criterionValue weightedMean+initialise positionHashQuantifiedGameTree = MkSearchState {+	getPositionHashQuantifiedGameTree	= positionHashQuantifiedGameTree,+	getDynamicMoveData			= Property.Empty.empty+}++-- | Forwards request.+euthanise+	:: Component.Move.NPlies+	-> Input.SearchOptions.MaybeRetireAfterNMoves+	-> Input.SearchOptions.MaybeRetireAfterNMoves+	-> SearchState x y positionHash criterionValue weightedMean+	-> SearchState x y positionHash criterionValue weightedMean+euthanise nPlies maybeRetireKillerMovesAfter maybeRetireTranspositionsAfter searchState@MkSearchState { getDynamicMoveData = dynamicMoveData }	= searchState {+	getDynamicMoveData	= Search.DynamicMoveData.euthanise nPlies maybeRetireKillerMovesAfter maybeRetireTranspositionsAfter dynamicMoveData+}+
+ src-lib/BishBosh/Search/TranspositionValue.hs view
@@ -0,0 +1,101 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines an entry in the transposition-table.+-}++module BishBosh.Search.TranspositionValue (+-- * Types+-- ** Type-synonyms+	IsOptimal,+	FindFitness,+-- ** Data-types+	Value(+--		MkValue,+		getIsOptimal,+		getNPlies,+		getMoves+	),+-- * Functions+	inferSearchDepth,+-- ** Constructor+	mkValue,+-- ** Predicates+	isBetter+ ) where++import qualified	BishBosh.Component.Move	as Component.Move+import qualified	BishBosh.Data.Exception	as Data.Exception+import qualified	Control.Exception+import qualified	Data.Ord++-- | Whether the recorded move-sequence is known to be optimal.+type IsOptimal	= Bool++-- | The type of the values in the transposition-table.+data Value move	= MkValue {+	getIsOptimal	:: IsOptimal,+	getNPlies	:: Component.Move.NPlies,	-- ^ The number of plies applied to the /game/ before application of any of the specified moves.+	getMoves	:: [move]			-- ^ The sequence of moves applied to the /game/, which caused the alpha-beta event.+}++-- | Smart constructor.+mkValue+	:: IsOptimal+	-> Component.Move.NPlies+	-> [move]+	-> Value move+mkValue _ _ []	= Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Search.TranspositionValue.mkValue:\tnull list of moves."+mkValue isOptimal nPlies moves+	| nPlies < 0	= Control.Exception.throw $ Data.Exception.mkOutOfBounds "BishBosh.Search.TranspositionValue.mkValue:\tnPlies can't be negative."+	| otherwise	= MkValue {+		getIsOptimal	= isOptimal,+		getNPlies	= nPlies,+		getMoves	= moves+	}++-- | Infer the search-depth from the length of the move-sequence.+inferSearchDepth :: Value move -> Component.Move.NPlies+inferSearchDepth	= length . getMoves++{- |+	* The type of a function which can find the fitness of the game resulting from the recorded sequence of moves.++	* CAVEAT: the fitness this function returns should be from the perspective of the player to make the first move.+-}+type FindFitness move weightedMean	= Value move -> weightedMean++{- |+	* Whether a proposed value is better than the incumbent.++	* CAVEAT: this is a narrower concept than addressed by 'Ord', which implies 'Eq'.+-}+isBetter+	:: Ord weightedMean+	=> FindFitness move weightedMean+	-> Value move	-- ^ The proposed value.+	-> Value move	-- ^ The incumbent value.+	-> Bool+isBetter findFitness proposedValue incumbentValue	= case Data.Ord.comparing inferSearchDepth proposedValue incumbentValue of+	GT	-> True	-- The new search is deeper.+	EQ	-> getIsOptimal proposedValue || Data.Ord.comparing findFitness proposedValue incumbentValue == GT+	_	-> False+
+ src-lib/BishBosh/Search/Transpositions.hs view
@@ -0,0 +1,90 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://chessprogramming.wikispaces.com/Transposition+Table>.++	* <https://en.wikipedia.org/wiki/Transposition_table>.++	* <http://www.chessbin.com/post/Transposition-Table-and-Zobrist-Hashing>.++	* Valid move-sequences can be recorded against the hash of the position from which they start.+-}++module BishBosh.Search.Transpositions (+-- * Types+-- ** Type-synonyms+	Transformation,+-- ** Data-types+	Transpositions(),+-- * Functions+	find,+-- ** Mutators+	insert+ ) where++import qualified	BishBosh.Property.Empty			as Property.Empty+import qualified	BishBosh.Search.EphemeralData		as Search.EphemeralData+import qualified	BishBosh.Search.TranspositionValue	as Search.TranspositionValue+import qualified	Data.Map+import qualified	Data.Maybe++-- | Stores the result of an alpha-beta search from a /position/.+newtype Transpositions move positionHash	= MkTranspositions {+	deconstruct	:: Data.Map.Map positionHash (Search.TranspositionValue.Value move)+}++instance Property.Empty.Empty (Transpositions move positionHash) where+	empty	= MkTranspositions Data.Map.empty++instance Search.EphemeralData.EphemeralData (Transpositions move positionHash) where+	getSize	MkTranspositions { deconstruct = byPositionHash }		= Data.Map.size byPositionHash+	euthanise nPlies MkTranspositions { deconstruct = byPositionHash }	= MkTranspositions $ Data.Map.filter ((> nPlies) . Search.TranspositionValue.getNPlies) byPositionHash++-- | Returns any value previously recorded when searching from the specified /position/.+find+	:: Ord positionHash+	=> positionHash+	-> Transpositions move positionHash+	-> Maybe (Search.TranspositionValue.Value move)+find positionHash MkTranspositions { deconstruct = byPositionHash }	= Data.Map.lookup positionHash byPositionHash++-- | The type of a function which transforms 'Transpositions'.+type Transformation move positionHash	= Transpositions move positionHash -> Transpositions move positionHash++{- |+	* Optionally record a value found while searching for the optimal move from a position, against the position's hash.++	* If a matching key already exists, it's replaced if the new value is considered to be better.+-}+insert+	:: (Ord positionHash, Ord weightedMean)+	=> Search.TranspositionValue.FindFitness move weightedMean+	-> positionHash				-- ^ Represents the game from which the sequence of moves starts.+	-> Search.TranspositionValue.Value move	-- ^ The value to record.+	-> Transformation move positionHash+insert findFitness positionHash proposedValue MkTranspositions { deconstruct = byPositionHash }	= MkTranspositions $ Data.Map.alter (+	Data.Maybe.maybe (Just proposedValue) {-there's no incumbent-} $ \incumbentValue -> if Search.TranspositionValue.isBetter findFitness proposedValue incumbentValue+		then Just proposedValue	-- Upgrade.+		else Nothing	-- Leave incumbent.+ ) positionHash byPositionHash+
+ src-lib/BishBosh/State/Board.hs view
@@ -0,0 +1,664 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* This data-type maintains the state of the board, but it doesn't know its history.+	In consequence it knows neither whether Castling has already been performed nor which @Pawn@s have been promoted, nor whose turn it is.++	* It allows unvalidated access to the board, to place, move, or remove /piece/s.+	In consequence;+		it enforces neither a conventional layout for the /piece/s nor even that there is exactly one @King@ per side;+		it permits one to move into check or to take a @King@.++	* For efficiency, two models of the board are maintained; square-centric ("State.MaybePieceByCoordinates") & piece-centric ("State.CoordinatesByRankByLogicalColour").+-}++module BishBosh.State.Board(+-- * Types+-- ** Type-synonyms+--	Transformation,+--	NDefendersByCoordinatesByLogicalColour,+	NBoards,+-- ** Data-types+	Board(+--		MkBoard,+		getMaybePieceByCoordinates,+		getCoordinatesByRankByLogicalColour,+		getNDefendersByCoordinatesByLogicalColour,+		getNPiecesDifferenceByRank,+		getNPawnsByFileByLogicalColour,+		getNPieces,+		getPassedPawnCoordinatesByLogicalColour+	),+-- * Functions+	countDefendersByCoordinatesByLogicalColour,+	summariseNDefendersByLogicalColour,+	findProximateKnights,+	sumPieceSquareValueByLogicalColour,+	findAttackersOf,+	findAttacksBy,+-- ** Constructors+--	fromMaybePieceByCoordinates,+-- ** Mutators+	movePiece,+	defineCoordinates,+	placePiece,+	removePiece,+-- ** Predicates+	isKingChecked,+	exposesKing+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Vector			as Cartesian.Vector+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.PieceSquareArray		as Component.PieceSquareArray+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Censor				as State.Censor+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour	as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.MaybePieceByCoordinates		as State.MaybePieceByCoordinates+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	ToolShed.Data.List++-- | The type of a function which transforms a /board/.+type Transformation x y	= Board x y -> Board x y++-- | The number of defenders for each /piece/, belonging to each side.+type NDefendersByCoordinatesByLogicalColour x y	= Attribute.LogicalColour.ByLogicalColour (Data.Map.Map (Cartesian.Coordinates.Coordinates x y) Component.Piece.NPieces)++-- | A number of boards.+type NBoards	= Int++{- |+	* The board is modelled as two alternative structures representing the same data, but indexed by either /coordinates/ or /piece/.++	* For efficiency some ancillary structures are also maintained.+-}+data Board x y	= MkBoard {+	getMaybePieceByCoordinates			:: State.MaybePieceByCoordinates.MaybePieceByCoordinates x y,				-- ^ Defines any /piece/ currently located at each /coordinate/.+	getCoordinatesByRankByLogicalColour		:: State.CoordinatesByRankByLogicalColour.CoordinatesByRankByLogicalColour x y,		-- ^ The /coordinates/ of each /piece/.+	getNDefendersByCoordinatesByLogicalColour	:: NDefendersByCoordinatesByLogicalColour x y,						-- ^ The number of defenders of each /piece/, indexed by /logical colour/ & then by /coordinates/.+	getNPiecesDifferenceByRank			:: State.Censor.NPiecesByRank,								-- ^ The difference in the number of /piece/s of each /rank/ held by either side. @White@ /piece/s are arbitrarily considered positive & @Black@ ones negative.+	getNPawnsByFileByLogicalColour			:: State.CoordinatesByRankByLogicalColour.NPiecesByFileByLogicalColour x,		-- ^ The number of @Pawn@s of each /logical colour/, for each /file/.+	getNPieces					:: Component.Piece.NPieces,								-- ^ The total number of pieces on the board, including @Pawn@s.+	getPassedPawnCoordinatesByLogicalColour		:: State.CoordinatesByRankByLogicalColour.CoordinatesByLogicalColour x y		-- ^ The /coordinates/ of any /passed/ @Pawn@s.+}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Eq (Board x y) where+	MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates } == MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates' }	= maybePieceByCoordinates == maybePieceByCoordinates'	-- N.B.: the remaining fields are implied.++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (Board x y) where+	rnf MkBoard {+		getMaybePieceByCoordinates			= maybePieceByCoordinates,+		getCoordinatesByRankByLogicalColour		= coordinatesByRankByLogicalColour,+		getNDefendersByCoordinatesByLogicalColour	= nDefendersByCoordinatesByLogicalColour,+--		getNPiecesDifferenceByRank			= nPiecesDifferenceByRank,	-- N.B.: already strict.+		getNPawnsByFileByLogicalColour			= nPawnsByFileByLogicalColour,+		getNPieces					= nPieces,+		getPassedPawnCoordinatesByLogicalColour		= passedPawnCoordinatesByLogicalColour+	} = Control.DeepSeq.rnf (+		maybePieceByCoordinates,+		coordinatesByRankByLogicalColour,+		nDefendersByCoordinatesByLogicalColour,+--		nPiecesDifferenceByRank,+		nPawnsByFileByLogicalColour,+		nPieces,+		passedPawnCoordinatesByLogicalColour+	 )++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (Board x y) where+	{-# SPECIALISE instance Read (Board T.X T.Y) #-}+	readsPrec _	= Property.ForsythEdwards.readsFEN++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Show (Board x y) where+	showsPrec _	= Property.ForsythEdwards.showsFEN++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ReadsFEN (Board x y) where+	{-# SPECIALISE instance Property.ForsythEdwards.ReadsFEN (Board T.X T.Y) #-}+	readsFEN	= map (Control.Arrow.first fromMaybePieceByCoordinates) . Property.ForsythEdwards.readsFEN++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ShowsFEN (Board x y) where+	showsFEN MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= Property.ForsythEdwards.showsFEN maybePieceByCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Data.Default.Default (Board x y) where+	{-# SPECIALISE instance Data.Default.Default (Board T.X T.Y) #-}+	def	= fromMaybePieceByCoordinates Data.Default.def {-MaybePieceByCoordinates-}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Reflectable.ReflectableOnX (Board x y) where+	{-# SPECIALISE instance Property.Reflectable.ReflectableOnX (Board T.X T.Y) #-}+	reflectOnX MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= fromMaybePieceByCoordinates $ Property.Reflectable.reflectOnX maybePieceByCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Reflectable.ReflectableOnY (Board x y) where+	{-# SPECIALISE instance Property.Reflectable.ReflectableOnY (Board T.X T.Y) #-}+	reflectOnY MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= fromMaybePieceByCoordinates $ Property.Reflectable.reflectOnY maybePieceByCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Empty.Empty (Board x y) where+	{-# SPECIALISE empty :: Board T.X T.Y #-}+	empty	= fromMaybePieceByCoordinates Property.Empty.empty {-MaybePieceByCoordinates-}++instance (Enum x, Enum y, Ord x, Ord y) => Component.Zobrist.Hashable2D Board x y {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms2D MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }	= Component.Zobrist.listRandoms2D coordinatesByRankByLogicalColour++-- | Constructor.+fromMaybePieceByCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => State.MaybePieceByCoordinates.MaybePieceByCoordinates x y -> Board x y+{-# SPECIALISE fromMaybePieceByCoordinates :: State.MaybePieceByCoordinates.MaybePieceByCoordinates T.X T.Y -> Board T.X T.Y #-}+fromMaybePieceByCoordinates maybePieceByCoordinates	= board where+	board@MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }	= MkBoard {+		getMaybePieceByCoordinates			= maybePieceByCoordinates,+		getCoordinatesByRankByLogicalColour		= State.CoordinatesByRankByLogicalColour.fromMaybePieceByCoordinates maybePieceByCoordinates,				-- Infer.+		getNDefendersByCoordinatesByLogicalColour	= countDefendersByCoordinatesByLogicalColour board,									-- Infer.+		getNPiecesDifferenceByRank			= State.Censor.countPieceDifferenceByRank coordinatesByRankByLogicalColour,						-- Infer.+		getNPawnsByFileByLogicalColour			= State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour coordinatesByRankByLogicalColour,		-- Infer.+		getNPieces					= State.Censor.countPieces coordinatesByRankByLogicalColour,								-- Infer.+		getPassedPawnCoordinatesByLogicalColour		= State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour coordinatesByRankByLogicalColour	-- Infer.+	}++{- |+	* Moves the referenced /piece/.++	* CAVEAT: no validation is performed.++	* CAVEAT: /castling/ must be implemented by making two calls.+-}+movePiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Component.Move.Move x y		-- ^ N.B.: illegal moves are acceptable.+	-> Maybe Attribute.MoveType.MoveType	-- ^ N.B.: this may not be available to the caller, for example during the illegal moves required for rollback.+	-> Transformation x y+{-# SPECIALISE movePiece :: Component.Move.Move T.X T.Y -> Maybe Attribute.MoveType.MoveType -> Transformation T.X T.Y #-}+movePiece move maybeMoveType board@MkBoard {+	getMaybePieceByCoordinates			= maybePieceByCoordinates,+	getCoordinatesByRankByLogicalColour		= coordinatesByRankByLogicalColour,+	getNDefendersByCoordinatesByLogicalColour	= nDefendersByCoordinatesByLogicalColour,+	getNPiecesDifferenceByRank			= nPiecesDifferenceByRank,+	getNPieces					= nPieces+}+	| Just sourcePiece <- State.MaybePieceByCoordinates.dereference source	maybePieceByCoordinates	= let+		logicalColour	= Component.Piece.getLogicalColour sourcePiece++		moveType :: Attribute.MoveType.MoveType+		moveType -- CAVEAT: one can't call 'State.MaybePieceByCoordinates.inferMoveType', since that performs some validation of the move, which isn't the role of this module.+			| Just explicitMoveType	<- maybeMoveType					= explicitMoveType+			| State.MaybePieceByCoordinates.isEnPassantMove move maybePieceByCoordinates	= Attribute.MoveType.enPassant	-- N.B.: if this move is valid, then one's opponent must have just double-advanced an adjacent Pawn.+			| otherwise									= Attribute.MoveType.mkNormalMoveType (+				Component.Piece.getRank `fmap` State.MaybePieceByCoordinates.dereference destination maybePieceByCoordinates+			) $ if Component.Piece.isPawnPromotion destination sourcePiece+				then Just Attribute.Rank.defaultPromotionRank+				else Nothing++-- Derive the required values from moveType.+		eitherPassingPawnsDestinationOrMaybeTakenRank+			| Attribute.MoveType.isEnPassant moveType	= Left $ Cartesian.Coordinates.retreat logicalColour destination+			| otherwise					= Right $ Attribute.MoveType.getMaybeExplicitlyTakenRank moveType++		maybePromotionRank :: Maybe Attribute.Rank.Rank+		maybePromotionRank	= Attribute.Rank.getMaybePromotionRank moveType++		destinationPiece :: Component.Piece.Piece+		destinationPiece	= Data.Maybe.maybe id Component.Piece.promote maybePromotionRank sourcePiece++		board'@MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates' }	= MkBoard {+			getMaybePieceByCoordinates	= State.MaybePieceByCoordinates.movePiece move destinationPiece (+				either Just (const Nothing) eitherPassingPawnsDestinationOrMaybeTakenRank+			) maybePieceByCoordinates,+			getCoordinatesByRankByLogicalColour	= State.CoordinatesByRankByLogicalColour.movePiece move sourcePiece maybePromotionRank eitherPassingPawnsDestinationOrMaybeTakenRank coordinatesByRankByLogicalColour,+			getNDefendersByCoordinatesByLogicalColour	= let+				oppositePiece					= Property.Opposable.getOpposite sourcePiece+				opponentsLogicalColour				= Component.Piece.getLogicalColour oppositePiece+				eitherPassingPawnsDestinationOrMaybeTakenPiece	= fmap (Component.Piece.mkPiece opponentsLogicalColour) `fmap` eitherPassingPawnsDestinationOrMaybeTakenRank++			in (+				\(nBlackDefendersByCoordinates, nWhiteDefendersByCoordinates)	-> Attribute.LogicalColour.listArrayByLogicalColour [nBlackDefendersByCoordinates, nWhiteDefendersByCoordinates]+			) . foldr (+				\(affectedCoordinates, affectedPiece) -> if Component.Piece.isKing affectedPiece+					then id	-- N.B.: defence of the King is irrelevant, since one can't get to a position where it can be taken.+					else let+						logicalColour'	= Component.Piece.getLogicalColour affectedPiece+					in (+						if Attribute.LogicalColour.isBlack logicalColour'+							then Control.Arrow.first+							else Control.Arrow.second+					) . Data.Map.insert affectedCoordinates {-overwrite-} . length $ findAttackersOf (+						Property.Opposable.getOpposite logicalColour'	-- Investigate an attack on the affected coordinates by the affected piece's own logical colour, i.e. defence.+					) affectedCoordinates board'+			) (+				(! Attribute.LogicalColour.Black) &&& (! Attribute.LogicalColour.White) $ nDefendersByCoordinatesByLogicalColour // (+					let+						nDefendersByCoordinates	= nDefendersByCoordinatesByLogicalColour ! opponentsLogicalColour+					in either (+						\passingPawnsDestination -> (:) (+							opponentsLogicalColour,+							Data.Map.delete passingPawnsDestination nDefendersByCoordinates	-- This Pawn has been taken.+						)+					) (+						\maybeExplicitlyTakenRank -> if Data.Maybe.isJust maybeExplicitlyTakenRank+							then (:) (+								opponentsLogicalColour,+								Data.Map.delete destination nDefendersByCoordinates	-- This piece has been taken.+							)+							else id+					) eitherPassingPawnsDestinationOrMaybeTakenRank+				 ) [+					(+						logicalColour,+						Data.Map.delete source $ nDefendersByCoordinatesByLogicalColour ! logicalColour	-- This piece has been moved.+					) -- Pair.+				 ] -- Singleton.+			) . Data.List.nubBy (+				ToolShed.Data.List.equalityBy fst {-coordinates-}+			) $ [+				(affectedCoordinates, affectedPiece) |+					(knightsCoordinates, knight)	<- (source, sourcePiece) : map ((,) destination) (destinationPiece : either (const []) Data.Maybe.maybeToList eitherPassingPawnsDestinationOrMaybeTakenPiece),+					Component.Piece.isKnight knight,+					Just affectedCoordinates	<- Cartesian.Vector.maybeTranslate knightsCoordinates `map` (Cartesian.Vector.attackVectorsForKnight :: [Cartesian.Vector.VectorInt]),+					affectedPiece			<- Data.Maybe.maybeToList $ State.MaybePieceByCoordinates.dereference affectedCoordinates maybePieceByCoordinates',+					Component.Piece.isFriend knight affectedPiece+			] {-list-comprehension-} ++ [+				(blockingCoordinates, blockingPiece) |+					passingPawnsDestination			<- either return {-to List-monad-} (const []) eitherPassingPawnsDestinationOrMaybeTakenRank,+					(direction, antiParallelDirection)	<- Attribute.Direction.opposites,+					(blockingCoordinates, blockingPiece)	<- case ($ direction) &&& ($ antiParallelDirection) $ ($ maybePieceByCoordinates') . (`State.MaybePieceByCoordinates.findBlockingPiece` passingPawnsDestination) of+						(Just cp, Just cp')	-> [+							cp |+								let isDefendedBy from	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong from *** Component.Piece.isFriend $ cp),+								isDefendedBy passingPawnsDestination oppositePiece || uncurry isDefendedBy cp'+						 ] {-list-comprehension-} ++ [+							cp' |+								let isDefendedBy from	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong from *** Component.Piece.isFriend $ cp'),+								isDefendedBy passingPawnsDestination oppositePiece || uncurry isDefendedBy cp+						 ] -- List-comprehension.+						(Just cp, _)		-> [+							cp |+								uncurry (&&) $ uncurry (&&&) (Component.Piece.canAttackAlong passingPawnsDestination *** Component.Piece.isFriend $ cp) oppositePiece+						 ] -- List-comprehension.+						(_, Just cp')		-> [+							cp' |+								uncurry (&&) $ uncurry (&&&) (Component.Piece.canAttackAlong passingPawnsDestination *** Component.Piece.isFriend $ cp') oppositePiece+						 ] -- List-comprehension.+						_			-> []+			] {-list-comprehension-} ++ (destination, destinationPiece) : [+				(blockingCoordinates, blockingPiece) |+					let maybeExplicitlyTakenPiece	= either (const Nothing) id eitherPassingPawnsDestinationOrMaybeTakenPiece,+					(direction, antiParallelDirection)	<- Attribute.Direction.opposites,+					(coordinates, piece)			<- [(source, sourcePiece), (destination, destinationPiece)],+					(blockingCoordinates, blockingPiece)	<- case ($ direction) &&& ($ antiParallelDirection) $ ($ maybePieceByCoordinates') . (`State.MaybePieceByCoordinates.findBlockingPiece` coordinates) of+						(Just cp, Just cp')	-> [+							cp |+								let isDefendedBy from	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong from *** Component.Piece.isFriend $ cp),+								isDefendedBy coordinates piece || coordinates == destination && Data.Maybe.maybe False (isDefendedBy destination) maybeExplicitlyTakenPiece || uncurry isDefendedBy cp'+						 ] {-list-comprehension-} ++ [+							cp' |+								let isDefendedBy from	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong from *** Component.Piece.isFriend $ cp'),+								isDefendedBy coordinates piece || coordinates == destination && Data.Maybe.maybe False (isDefendedBy destination) maybeExplicitlyTakenPiece || uncurry isDefendedBy cp+						 ] -- List-comprehension.+						(Just cp, _)		-> [+							cp |+								let isDefendedBy	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong coordinates *** Component.Piece.isFriend $ cp),+								isDefendedBy piece || coordinates == destination && Data.Maybe.maybe False isDefendedBy maybeExplicitlyTakenPiece+						 ] -- List-comprehension.+						(_, Just cp')		-> [+							cp' |+								let isDefendedBy	= uncurry (&&) . uncurry (&&&) (Component.Piece.canAttackAlong coordinates *** Component.Piece.isFriend $ cp'),+								isDefendedBy piece || coordinates == destination && Data.Maybe.maybe False isDefendedBy maybeExplicitlyTakenPiece+						 ] -- List-comprehension.+						_			-> []+			], -- List-comprehension. Define any pieces whose defence may be affected by the move.+			getNPiecesDifferenceByRank	= Data.Array.IArray.accum (+				if Attribute.LogicalColour.isBlack logicalColour+					then (-)	-- Since White pieces are arbitrarily counted as positive, negate the adjustment if the current player is Black.+					else (+)+			) nPiecesDifferenceByRank $ if Attribute.MoveType.isEnPassant moveType+				then [(Attribute.Rank.Pawn, 1)]	-- Increment relative number of Pawns.+				else Data.Maybe.maybe id (+					(:) . flip (,) 1	-- Increment.+				) (+					Attribute.MoveType.getMaybeExplicitlyTakenRank moveType+				) $ Data.Maybe.maybe [] (+					\promotionRank -> [+						(+							promotionRank,+							1	-- Increment.+						), (+							Attribute.Rank.Pawn,+							negate 1	-- Decrement relative number of Pawns.+						)+					]+				) maybePromotionRank,+			getNPawnsByFileByLogicalColour	= if Component.Piece.isPawn sourcePiece && (+				Cartesian.Coordinates.getX source /= Cartesian.Coordinates.getX destination {-includes En-passant-} || Attribute.MoveType.isPromotion moveType+			) || Data.Maybe.maybe False (== Attribute.Rank.Pawn) (Attribute.MoveType.getMaybeExplicitlyTakenRank moveType)+				then State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour coordinatesByRankByLogicalColour'+				else getNPawnsByFileByLogicalColour board,+			getNPieces	= Attribute.MoveType.nPiecesMutator moveType nPieces,+			getPassedPawnCoordinatesByLogicalColour	= if Component.Piece.isPawn sourcePiece {-includes En-passant & promotion-} || Data.Maybe.maybe False (== Attribute.Rank.Pawn) (Attribute.MoveType.getMaybeExplicitlyTakenRank moveType)+				then State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour coordinatesByRankByLogicalColour'+				else getPassedPawnCoordinatesByLogicalColour board+		}++		coordinatesByRankByLogicalColour'	= getCoordinatesByRankByLogicalColour board'+	in board'+	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.State.Board.movePiece:\tno piece exists at " . shows source . showString "; " $ shows board "."+	where+		(source, destination)	= Component.Move.getSource &&& Component.Move.getDestination $ move	-- Deconstruct.++{- |+	* Define the specified /coordinates/, by either placing or removing a /piece/.++	* CAVEAT: this function should only be used to construct custom scenarios, since /piece/s don't normally spring into existence.++	* CAVEAT: doesn't validate the request, so @King@s can be placed /in check/ & @Pawn@s can be placed behind their starting rank or unpromoted on their last /rank/.++	* CAVEAT: simple but inefficient implementation, since this function isn't called during normal play.+-}+defineCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Maybe Component.Piece.Piece			-- ^ The optional /piece/ to place (or remove if @Nothing@ is specified).+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The /coordinates/ to define.+	-> Transformation x y+{-# SPECIALISE defineCoordinates :: Maybe Component.Piece.Piece -> Cartesian.Coordinates.Coordinates T.X T.Y -> Transformation T.X T.Y #-}+defineCoordinates maybePiece coordinates MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= fromMaybePieceByCoordinates $ State.MaybePieceByCoordinates.defineCoordinates maybePiece coordinates maybePieceByCoordinates++-- | Place a /piece/ at the specified unoccupied /coordinates/.+placePiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Component.Piece.Piece+	-> Cartesian.Coordinates.Coordinates x y+	-> Transformation x y+{-# SPECIALISE placePiece :: Component.Piece.Piece -> Cartesian.Coordinates.Coordinates T.X T.Y -> Transformation T.X T.Y #-}+placePiece piece coordinates board	= Control.Exception.assert (+	State.MaybePieceByCoordinates.isVacant coordinates $ getMaybePieceByCoordinates board+ ) $ defineCoordinates (Just piece) coordinates board++-- | Remove a /piece/ from the /board/.+removePiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Cartesian.Coordinates.Coordinates x y -> Transformation x y+{-# SPECIALISE removePiece :: Cartesian.Coordinates.Coordinates T.X T.Y -> Transformation T.X T.Y #-}+removePiece coordinates board	= Control.Exception.assert (+	State.MaybePieceByCoordinates.isOccupied coordinates $ getMaybePieceByCoordinates board+ ) $ defineCoordinates Nothing coordinates board++-- | Forward request.+findProximateKnights :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the @Knight@ for which to search.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The destination to which the @Knight@ is required to be capable of jumping.+	-> Board x y+	-> [Cartesian.Coordinates.Coordinates x y]+{-# INLINE findProximateKnights #-}+-- findProximateKnights logicalColour coordinates MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= State.MaybePieceByCoordinates.findProximateKnights logicalColour coordinates maybePieceByCoordinates+findProximateKnights logicalColour coordinates MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }	= State.CoordinatesByRankByLogicalColour.findProximateKnights logicalColour coordinates coordinatesByRankByLogicalColour++-- | Calculate the total value of the /coordinates/ occupied by the /piece/s of either side, at a stage in the game's life-span defined by the total number of pieces remaining.+sumPieceSquareValueByLogicalColour :: (+	Enum	x,+	Enum	y,+	Num	pieceSquareValue,+	Ord	x,+	Ord	y+ )+	=> Component.PieceSquareArray.PieceSquareArray x y pieceSquareValue+	-> Board x y+	-> Attribute.LogicalColour.ByLogicalColour pieceSquareValue+{-# SPECIALISE sumPieceSquareValueByLogicalColour :: Component.PieceSquareArray.PieceSquareArray T.X T.Y T.PieceSquareValue -> Board T.X T.Y -> Attribute.LogicalColour.ByLogicalColour T.PieceSquareValue #-}+sumPieceSquareValueByLogicalColour pieceSquareArray MkBoard {+--	getMaybePieceByCoordinates		= maybePieceByCoordinates,+	getCoordinatesByRankByLogicalColour	= coordinatesByRankByLogicalColour,+	getNPieces				= nPieces+-- } = State.MaybePieceByCoordinates.sumPieceSquareValueByLogicalColour nPieces pieceSquareArray maybePieceByCoordinates+} = Attribute.LogicalColour.listArrayByLogicalColour $ State.CoordinatesByRankByLogicalColour.sumPieceSquareValueByLogicalColour (+	\logicalColour rank coordinates -> Component.PieceSquareArray.findPieceSquareValue nPieces logicalColour rank coordinates pieceSquareArray+ ) coordinatesByRankByLogicalColour++{- |+	* Lists the source-/coordinates/ from which the referenced destination can be attacked.++	* N.B.: the algorithm is independent of whose turn it actually is.++	* CAVEAT: checks neither the /logical colour/ of the defender, nor that their /piece/ even exists.++	* CAVEAT: may return the /coordinates/ of a diagonally adjacent @Pawn@; which would be an illegal move if there's not actually any /piece/ at the referenced destination.++	* CAVEAT: can't detect an en-passant attack, since this depends both on whether the previous move was a double advance & that the defender is a @Pawn@.+-}+findAttackersOf :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour				-- ^ The defender's /logical colour/.+	-> Cartesian.Coordinates.Coordinates x y				-- ^ The defender's location.+	-> Board x y+	-> [(Cartesian.Coordinates.Coordinates x y, Attribute.Rank.Rank)]	-- ^ The locations from which the specified square can be attacked by the opposite /logical colour/.+{-# SPECIALISE findAttackersOf :: Attribute.LogicalColour.LogicalColour -> Cartesian.Coordinates.Coordinates T.X T.Y -> Board T.X T.Y -> [(Cartesian.Coordinates.Coordinates T.X T.Y, Attribute.Rank.Rank)] #-}+findAttackersOf destinationLogicalColour destination board@MkBoard { getMaybePieceByCoordinates	= maybePieceByCoordinates }	= [+	(coordinates, Attribute.Rank.Knight) |+		coordinates	<- findProximateKnights (Property.Opposable.getOpposite destinationLogicalColour) destination board+ ] {-list-comprehension-} ++ Data.Maybe.mapMaybe (+	\directionFromDestination -> State.MaybePieceByCoordinates.findAttackerInDirection destinationLogicalColour directionFromDestination destination maybePieceByCoordinates+ ) Attribute.Direction.range++{- |+	* Lists the source-/coordinates/ from which the referenced destination can be attacked by the specified type of /piece/.++	* N.B.: similar to 'findAttackersOf', but can be more efficient since the attacking /piece/ is known.++	* CAVEAT: can't detect an en-passant attack, since this depends both on whether the previous move was a double advance & that the defender is a @Pawn@.+-}+findAttacksBy :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Component.Piece.Piece			-- ^ The type of attacker.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The defender's location.+	-> Board x y+	-> [Cartesian.Coordinates.Coordinates x y]	-- ^ The sources from which the specified attacker could strike.+{-# SPECIALISE findAttacksBy :: Component.Piece.Piece -> Cartesian.Coordinates.Coordinates T.X T.Y -> Board T.X T.Y -> [Cartesian.Coordinates.Coordinates T.X T.Y] #-}+findAttacksBy piece destination board+	| rank == Attribute.Rank.Knight	= findProximateKnights logicalColour destination board+	| otherwise			= filter (+		\source -> source /= destination && Component.Piece.canAttackAlong source destination piece && State.MaybePieceByCoordinates.isClear source destination (getMaybePieceByCoordinates board)+	) . State.CoordinatesByRankByLogicalColour.dereference logicalColour rank $ getCoordinatesByRankByLogicalColour board+	where+		(logicalColour, rank)	= Component.Piece.getLogicalColour &&& Component.Piece.getRank $ piece++{- |+	* Whether the @King@ of the specified /logical colour/ is currently /checked/.++	* N.B.: independent of whose turn it actually is.++	* CAVEAT: assumes there's exactly one @King@ of the specified /logical colour/.+-}+isKingChecked :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the @King@ in question.+	-> Board x y+	-> Bool+{-# SPECIALISE isKingChecked :: Attribute.LogicalColour.LogicalColour -> Board T.X T.Y -> Bool #-}+isKingChecked logicalColour board@MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }	= not . null $ findAttackersOf logicalColour (State.CoordinatesByRankByLogicalColour.getKingsCoordinates logicalColour coordinatesByRankByLogicalColour) board++{- |+	* Whether one's own @King@ has become exposed in the proposed /board/.++	* CAVEAT: assumes that one's @King@ wasn't already checked.++	* CAVEAT: this function is a performance-hotspot.+-}+exposesKing :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the player proposing to move.+	-> Component.Move.Move x y			-- ^ The /move/.+	-> Board x y					-- ^ The original /board/, i.e. prior to the /move/.+	-> Bool+{-# SPECIALISE exposesKing :: Attribute.LogicalColour.LogicalColour -> Component.Move.Move T.X T.Y -> Board T.X T.Y -> Bool #-}+exposesKing logicalColour move board@MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }+	| source == kingsCoordinates	= not . null $ findAttackersOf logicalColour (Component.Move.getDestination move) board	-- CAVEAT: expensive, since all directions from the King may have to be explored.+	| Just directionFromKing	<- Cartesian.Vector.toMaybeDirection (+		Cartesian.Vector.measureDistance kingsCoordinates source	:: Cartesian.Vector.VectorInt+	) -- Confirm that one's own King is on a straight line with the start of the move.+	, let maybePieceByCoordinates	= getMaybePieceByCoordinates board+	, State.MaybePieceByCoordinates.isClear kingsCoordinates source maybePieceByCoordinates	-- Confirm that the straight line from one's own King to the start of the move, is clear.+	, Data.Maybe.maybe True {-Knight's move-} (+		not . Attribute.Direction.areAligned directionFromKing	-- The blocking piece has revealed any attacker.+	) $ Cartesian.Vector.toMaybeDirection (+		Component.Move.measureDistance move	:: Cartesian.Vector.VectorInt+	)+	, Just (_, attackersRank)	<- State.MaybePieceByCoordinates.findAttackerInDirection logicalColour directionFromKing source maybePieceByCoordinates	-- Confirm the existence of an obscured attacker.+	= attackersRank `notElem` Attribute.Rank.plodders	-- Confirm sufficient range to bridge the vacated space.+	| otherwise	= False+	where+		source			= Component.Move.getSource move+		kingsCoordinates	= State.CoordinatesByRankByLogicalColour.getKingsCoordinates logicalColour coordinatesByRankByLogicalColour++-- | Count the number of defenders of each /piece/ on the /board/.+countDefendersByCoordinatesByLogicalColour :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Board x y -> NDefendersByCoordinatesByLogicalColour x y+{-# SPECIALISE countDefendersByCoordinatesByLogicalColour :: Board T.X T.Y -> NDefendersByCoordinatesByLogicalColour T.X T.Y #-}+countDefendersByCoordinatesByLogicalColour board@MkBoard { getCoordinatesByRankByLogicalColour = coordinatesByRankByLogicalColour }	= Attribute.LogicalColour.listArrayByLogicalColour [+	Data.Map.fromList [+		(+			coordinates,+			length $ findAttackersOf (+				Property.Opposable.getOpposite logicalColour	-- Investigate an attack on these coordinates by one's own logical colour.+			) coordinates board+		) |+			rank		<- Attribute.Rank.expendable,+			coordinates	<- State.CoordinatesByRankByLogicalColour.dereference logicalColour rank coordinatesByRankByLogicalColour+	] {-list-comprehension-} | logicalColour <- Attribute.LogicalColour.range+ ] -- List-comprehension.++-- | Collapses 'NDefendersByCoordinatesByLogicalColour' into the total number of defenders on either side.+summariseNDefendersByLogicalColour :: Board x y -> Attribute.LogicalColour.ByLogicalColour Component.Piece.NPieces+summariseNDefendersByLogicalColour MkBoard { getNDefendersByCoordinatesByLogicalColour = nDefendersByCoordinatesByLogicalColour }	= Data.Array.IArray.amap (+	Data.Map.foldl' (+) 0	-- CAVEAT: 'Data.Foldable.sum' is too slow.+ ) nDefendersByCoordinatesByLogicalColour+
+ src-lib/BishBosh/State/CastleableRooksByLogicalColour.hs view
@@ -0,0 +1,427 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The abscissae of those @Rook@s, for the player of each /logicalColour/, which can still participate in castling.+-}++module BishBosh.State.CastleableRooksByLogicalColour(+-- * Types+-- ** Type-synonyms+--	AbscissaeByLogicalColour,+	TurnsByLogicalColour,+--	Transformation,+-- ** Data-types+	CastleableRooksByLogicalColour(),+-- * Functions+--	sortByLogicalColour,+--	inferRooksCoordinates,+	locateForLogicalColour,+-- ** Constructors+	fromAssocs,+	fromBoard,+	fromTurnsByLogicalColour,+	listIncrementalRandoms,+-- ** Mutators+--	castle,+--	relinquishCastlingRights,+--	removeX,+	unify,+	takeTurn,+-- ** Predicates+	hasCastled,+	canCastle,+--	canCastleWith',+	canCastleWith,+	cantConverge+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate			as Cartesian.Ordinate+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour	as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.TurnsByLogicalColour		as State.TurnsByLogicalColour+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Ord++{- |+	* For the players of each /logical colour/, identifies the abscissae of those @Rook@s which can still participate in castling (when other constraints are removed).++	* Lack of an entry for the specified /logical colour/ implies that castling has already occurred, whereas a null list of abscissae implies that castling can no longer happen.++	* N.B.: both the outer list (indexed by logical-colour) & the inner list of abscissae, are kept ordered, otherwise the derived instance of 'Eq' would be unpredictable.+-}+type AbscissaeByLogicalColour x	= [(Attribute.LogicalColour.LogicalColour, [x])]++-- | Ensure a predictable order, to facilitate '(==)'.+sortByLogicalColour :: AbscissaeByLogicalColour x -> AbscissaeByLogicalColour x+sortByLogicalColour	= Data.List.sortBy $ Data.Ord.comparing fst {-logicalColour-}++-- | Update to account for the specified player castling.+castle :: Attribute.LogicalColour.LogicalColour -> AbscissaeByLogicalColour x -> AbscissaeByLogicalColour x+castle logicalColour	= filter $ (/= logicalColour) . fst {-logicalColour-}	-- N.B.: if 'Data.List.deleteBy' took a simple predicate, it would have been ideal.++-- | Update to account for the specified player losing the right to castle.+relinquishCastlingRights :: Attribute.LogicalColour.LogicalColour -> AbscissaeByLogicalColour x -> AbscissaeByLogicalColour x+relinquishCastlingRights logicalColour	= map $ \pair@(logicalColour', _) -> (+	if logicalColour' == logicalColour+		then Control.Arrow.second $ const []+		else id+ ) pair++-- | Remove the right to castle, from the referenced @Rook@.+removeX :: Eq x => Attribute.LogicalColour.LogicalColour -> x -> AbscissaeByLogicalColour x -> AbscissaeByLogicalColour x+removeX logicalColour x	= map $ \pair@(logicalColour', _) -> (+	if logicalColour' == logicalColour+		then Control.Arrow.second $ Data.List.delete x+		else id+ ) pair++-- | Predicate.+canCastleWith'+	:: Eq x+	=> Attribute.LogicalColour.LogicalColour+	-> x	-- ^ @Rook@'s abscissa.+	-> AbscissaeByLogicalColour x+	-> Bool+canCastleWith' logicalColour x	= Data.Maybe.maybe False {-has castled-} (elem x) . lookup logicalColour++-- | For the players of each /logical colour/, identifies the abscissae of those @Rook@s which can still participate in castling (when other constraints are removed).+newtype CastleableRooksByLogicalColour x	= MkCastleableRooksByLogicalColour {+	getAssocs	:: AbscissaeByLogicalColour x+} deriving (Eq, Ord)++instance Show x => Show (CastleableRooksByLogicalColour x) where+	showsPrec _ MkCastleableRooksByLogicalColour { getAssocs = assocs }	= shows assocs++instance (+	Enum	x,+	Ord	x,+	Read	x,+	Show	x+ ) => Read (CastleableRooksByLogicalColour x) where+	readsPrec _ s	= Control.Arrow.first fromAssocs `map` reads s++instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (CastleableRooksByLogicalColour x) where+	rnf MkCastleableRooksByLogicalColour { getAssocs = assocs }	= Control.DeepSeq.rnf assocs++instance Enum x => Data.Default.Default (CastleableRooksByLogicalColour x) where+	def = MkCastleableRooksByLogicalColour $ map (+		flip (,) [Cartesian.Abscissa.xMin, Cartesian.Abscissa.xMax]+	 ) Attribute.LogicalColour.range++instance Property.Reflectable.ReflectableOnX (CastleableRooksByLogicalColour x) where+	reflectOnX MkCastleableRooksByLogicalColour { getAssocs = assocs }	= MkCastleableRooksByLogicalColour . reverse $ map (+		Control.Arrow.first Property.Opposable.getOpposite+	 ) assocs++instance (+	Enum	x,+	Ord	x,+	Show	x+ ) => Property.ForsythEdwards.ReadsFEN (CastleableRooksByLogicalColour x) where+	readsFEN s	= case Data.List.Extra.trimStart s of+		'-' : remainder	-> [+			(+				MkCastleableRooksByLogicalColour $ Attribute.LogicalColour.range `zip` repeat [],	-- CAVEAT: it could also be just '[]'.+				remainder+			) -- Pair.+		 ] -- Singleton.+		s1		-> let+			readsAssocs s'	= case reads s' of+				[(piece, s'')]	-> let+					logicalColour	= Component.Piece.getLogicalColour piece+				 in case Component.Piece.getRank piece of+					Attribute.Rank.Queen	-> Control.Arrow.first (+						(+							logicalColour,+							Cartesian.Abscissa.xMin+						) :+					 ) `map` readsAssocs s''	-- Recurse.+					Attribute.Rank.King	-> Control.Arrow.first (+						(+							logicalColour,+							Cartesian.Abscissa.xMax+						) :+					 ) `map` readsAssocs s''	-- Recurse.+					_			-> []	-- Inappropriate rank => parse-failure.+				_		-> [([], s')]+		 in case readsAssocs s1 of+			[([], _)]	-> []	-- Zero pieces were read => no parse.+			l		-> Control.Arrow.first (fromAssocs . Data.List.Extra.groupSort) `map` l++instance (Enum x, Eq x) => Property.ForsythEdwards.ShowsFEN (CastleableRooksByLogicalColour x) where+	showsFEN MkCastleableRooksByLogicalColour { getAssocs = assocs }+		| all (null . snd) assocs	= Property.ForsythEdwards.showsNullField+		| otherwise			= foldr (+			(.) . Property.ForsythEdwards.showsFEN+		) id [+			pieceConstructor logicalColour |+				logicalColour			<- [Attribute.LogicalColour.White, Attribute.LogicalColour.Black],	-- N.B.: the order is standardised.+				(rooksX, pieceConstructor)	<- [(Cartesian.Abscissa.xMax, Component.Piece.mkKing), (Cartesian.Abscissa.xMin, Component.Piece.mkQueen)],	-- N.B.: the order is defined as King-side (short) before Queen-side (long), which is also alphabetical.+				canCastleWith' logicalColour rooksX assocs+		] -- List-comprehension.++-- | Get the list of random numbers required to represent the current castling potential.+instance Eq x => Component.Zobrist.Hashable1D CastleableRooksByLogicalColour x {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms1D MkCastleableRooksByLogicalColour { getAssocs = assocs } zobrist	= Data.Maybe.catMaybes [+		Component.Zobrist.dereferenceRandomByCastleableRooksXByLogicalColour logicalColour x zobrist |+			logicalColour	<- Attribute.LogicalColour.range,+			x		<- Data.Maybe.fromMaybe [] $ lookup logicalColour assocs+	 ] -- List-comprehension.++-- | Smart constructor.+fromAssocs :: (+	Enum	x,+	Ord	x,+	Show	x+ ) => [(Attribute.LogicalColour.LogicalColour, [x])] -> CastleableRooksByLogicalColour x+fromAssocs assocs+	| Data.List.Extra.anySame $ map fst {-logicalColour-} assocs	= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.State.CastleableRooksByLogicalColour.fromAssocs:\tduplicate logical colours have been defined; " $ shows assocs "."+	| any (Data.List.Extra.anySame . snd) assocs			= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.State.CastleableRooksByLogicalColour.fromAssocs:\tduplicate abscissae have been defined; " $ shows assocs "."+	| any (+		any (+			`notElem` [Cartesian.Abscissa.xMin, Cartesian.Abscissa.xMax]+		) . snd {-[x]-}+	) assocs							= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.State.CastleableRooksByLogicalColour.fromAssocs:\tall abscissae must reference unmoved Rooks; " $ shows assocs "."+	| otherwise	= MkCastleableRooksByLogicalColour . sortByLogicalColour $ map (Control.Arrow.second Data.List.sort) assocs++{- |+	* Smart constructor.++	* CAVEAT: doesn't know the move-history, so the wrong answer is possible.+-}+fromBoard :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x+ ) => State.Board.Board x y -> CastleableRooksByLogicalColour x+fromBoard board+	| any (+		\logicalColour -> hasCastled logicalColour castleableRooksByLogicalColour && all (+			`elem` State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.Pawn coordinatesByRankByLogicalColour+		) [+			Cartesian.Coordinates.mkCoordinates x (+				Cartesian.Ordinate.pawnsFirstRank logicalColour+			) |+				bishopsAbscissa	<- [+					Cartesian.Abscissa.translate (toEnum . (+ 2) . fromEnum) Cartesian.Abscissa.xMin,+					Cartesian.Abscissa.translate (toEnum . subtract 2 . fromEnum) Cartesian.Abscissa.xMax+				 ],+				x		<- Cartesian.Abscissa.getAdjacents bishopsAbscissa+		] -- List-comprehension.+	) Attribute.LogicalColour.range	= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.State.CastleableRooksByLogicalColourFromBoard.fromBoard:\tfor castling to have occurred, a Bishop must have been moved, which can only happen when a blocking Pawn is moved; " $ shows (castleableRooksByLogicalColour, board) "."+	| otherwise	= castleableRooksByLogicalColour+	where+		coordinatesByRankByLogicalColour	= State.Board.getCoordinatesByRankByLogicalColour board+		castleableRooksByLogicalColour		= fromAssocs $ map (+			\logicalColour -> (+				logicalColour,+				[+					Cartesian.Coordinates.getX rooksCoordinates |+						State.CoordinatesByRankByLogicalColour.getKingsCoordinates logicalColour coordinatesByRankByLogicalColour == Cartesian.Coordinates.kingsStartingCoordinates logicalColour,+						rooksCoordinates	<- State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.Rook coordinatesByRankByLogicalColour,+						rooksCoordinates `elem` Cartesian.Coordinates.rooksStartingCoordinates logicalColour+				] -- List-comprehension.+			) -- Pair.+		 ) Attribute.LogicalColour.range++-- | Narrow the type, so the /turn/ can be queried.+type TurnsByLogicalColour x y	= State.TurnsByLogicalColour.TurnsByLogicalColour (Component.Turn.Turn x y)++-- | Constructor.+fromTurnsByLogicalColour :: (+	Enum	x,+	Enum	y,+	Eq	x,+	Eq	y+ ) => TurnsByLogicalColour x y -> CastleableRooksByLogicalColour x+fromTurnsByLogicalColour turnsByLogicalColour	= MkCastleableRooksByLogicalColour $ foldr (+	\logicalColour -> let+		turns	= State.TurnsByLogicalColour.dereference logicalColour turnsByLogicalColour+	in if any (Attribute.MoveType.isCastle . Component.QualifiedMove.getMoveType . Component.Turn.getQualifiedMove) turns+		then id	-- Have Castled.+		else (:) (+			logicalColour,+			[+				Cartesian.Coordinates.getX coordinates |+					not $ haveMovedFrom (Cartesian.Coordinates.kingsStartingCoordinates logicalColour) turns,+					coordinates	<- Cartesian.Coordinates.rooksStartingCoordinates logicalColour,+					not $ haveMovedFrom coordinates turns || haveMovedTo coordinates (State.TurnsByLogicalColour.dereference (Property.Opposable.getOpposite logicalColour) turnsByLogicalColour)+			] -- List-comprehension.+		) -- Pair.+ ) [] Attribute.LogicalColour.range where+	haveMovedFrom, haveMovedTo :: (Eq x, Eq y) => Cartesian.Coordinates.Coordinates x y -> [Component.Turn.Turn x y] -> Bool+	haveMovedFrom coordinates	= any $ (== coordinates) . Component.Move.getSource . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove+	haveMovedTo coordinates		= any $ (== coordinates) . Component.Move.getDestination . Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove++-- | Predicate.+hasCastled :: Attribute.LogicalColour.LogicalColour -> CastleableRooksByLogicalColour x -> Bool+hasCastled logicalColour MkCastleableRooksByLogicalColour { getAssocs = assocs }	= all ((/= logicalColour) . fst) assocs++-- | Predicate.+canCastle :: Attribute.LogicalColour.LogicalColour -> CastleableRooksByLogicalColour x -> Bool+canCastle logicalColour MkCastleableRooksByLogicalColour { getAssocs = assocs }	= Data.Maybe.maybe False {-has castled-} (not . null) $ lookup logicalColour assocs++-- | Infer the @Rook@'s ordinate from the /piece/'s /logical-colour/.+inferRooksOrdinate :: Enum y => Attribute.LogicalColour.LogicalColour -> y+inferRooksOrdinate logicalColour+	| Attribute.LogicalColour.isBlack logicalColour	= Cartesian.Ordinate.yMax+	| otherwise					= Cartesian.Ordinate.yMin++-- | Predicate.+canCastleWith :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour+	-> Cartesian.Coordinates.Coordinates x y	-- ^ @Rook@'s coordinates.+	-> CastleableRooksByLogicalColour x+	-> Bool+canCastleWith logicalColour rookSource MkCastleableRooksByLogicalColour { getAssocs = assocs }	= Data.Maybe.maybe False {-has castled-} (+	any $ (== rookSource) . (`Cartesian.Coordinates.mkCoordinates` inferRooksOrdinate logicalColour)+ ) $ lookup logicalColour assocs++-- | Find the abscissae of all @Rook@s of the specified /logical colour/, which can still participate in castling.+locateForLogicalColour :: Attribute.LogicalColour.LogicalColour -> CastleableRooksByLogicalColour x -> Maybe [x]+{-# INLINE locateForLogicalColour #-}+locateForLogicalColour logicalColour MkCastleableRooksByLogicalColour { getAssocs = assocs }	= lookup logicalColour assocs++-- | Self-documentation.+type Transformation x	= CastleableRooksByLogicalColour x -> CastleableRooksByLogicalColour x++-- | Relinquish the ability to disambiguate between "have Castled" (& therefore can't subsequently), & "Have lost the option to castle".+unify :: Transformation x+unify MkCastleableRooksByLogicalColour { getAssocs = assocs }	= MkCastleableRooksByLogicalColour $ foldr (+	\logicalColour assocs'	-> (+		if any ((== logicalColour) . fst) assocs+			then id+			else sortByLogicalColour . (+				(logicalColour, []) :+			)+	) assocs'+ ) assocs Attribute.LogicalColour.range++-- | Update with the latest /turn/.+takeTurn :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ Defines the side who took the specified turn.+	-> Component.Turn.Turn x y+	-> Transformation x+{-# SPECIALISE takeTurn :: Attribute.LogicalColour.LogicalColour -> Component.Turn.Turn T.X T.Y -> Transformation T.X #-}+takeTurn logicalColour turn MkCastleableRooksByLogicalColour { getAssocs = assocs }	= MkCastleableRooksByLogicalColour $ (+	case lookup logicalColour assocs of+		Just []	-> id	-- This is a terminal state.+		Just rooksXs+			| Attribute.MoveType.isCastle $ Component.QualifiedMove.getMoveType qualifiedMove	-> castle logicalColour+			| Component.Turn.getRank turn == Attribute.Rank.King {-but not castling-}		-> relinquishCastlingRights logicalColour+			| let source	= Component.Move.getSource move+			, any (+				(== source) . (`Cartesian.Coordinates.mkCoordinates` inferRooksOrdinate logicalColour)+			) rooksXs										-> removeX logicalColour $ Cartesian.Coordinates.getX source+			| otherwise										-> id+		_												-> id	-- This is a terminal state.+ ) $ (+	let+		opponentsLogicalColour	= Property.Opposable.getOpposite logicalColour+	in case lookup opponentsLogicalColour assocs of+		Just rooksXs+			| let destination	= Component.Move.getDestination move+			, any (+				(== destination) . (`Cartesian.Coordinates.mkCoordinates` inferRooksOrdinate opponentsLogicalColour)+			) rooksXs	-> removeX opponentsLogicalColour $ Cartesian.Coordinates.getX destination+			| otherwise	-> id+		_			-> id	-- This is a terminal state.+ ) assocs where+	qualifiedMove	= Component.Turn.getQualifiedMove turn+	move		= Component.QualifiedMove.getMove qualifiedMove++{- |+	* Determines whether two /position/s can't converge on each other.++	* N.B.: in this function, the two /positions/ are considered to be peers; nothing is assumed regarding which must do the convergence, perhaps both.++	* From the initial board, one may converge onto any other /position/, but any of a set of irreversible changes may compromise this;+		the total number of /piece/s & specifically @Pawn@s, of each /logical colour/, can't increase;+		@Pawn@s can only advance;+		the difference in the /rank/s of all /piece/s of each /logical colour/, which can only be reduced through promotion of a @Pawn@;+		castling can't be undone.+	This function only assesses this final change.++	* CAVEAT: since the potential of one /position/ to converge on another, depends on a wider set of criteria,+	this function can only be definitive regarding when convergence is impossible, rather than when is possible.++	* CAVEAT: this function depends on one side having lost the right to castle, when the other side already has; this is quite rare.+-}+cantConverge+	:: CastleableRooksByLogicalColour x+	-> CastleableRooksByLogicalColour x+	-> Bool+cantConverge castleableRooksByLogicalColour castleableRooksByLogicalColour'	= any (+	\logicalColour -> case ($ castleableRooksByLogicalColour) &&& ($ castleableRooksByLogicalColour') $ locateForLogicalColour logicalColour of+		(Just [], Nothing)	-> True+		(Nothing, Just [])	-> True+		_			-> False+ ) Attribute.LogicalColour.range++-- | Generate the additional random-numbers required to correct the hash resulting from a change to the castleable @Rook@s.+listIncrementalRandoms+	:: Data.Array.IArray.Ix x+	=> CastleableRooksByLogicalColour x	-- ^ The old value.+	-> CastleableRooksByLogicalColour x	-- ^ The new value.+	-> Component.Zobrist.Zobrist x y random+	-> [random]+listIncrementalRandoms castleableRooksByLogicalColour castleableRooksByLogicalColour' zobrist	= [+	random |+		hashable	<- [castleableRooksByLogicalColour, castleableRooksByLogicalColour'],+		random		<- Component.Zobrist.listRandoms1D hashable zobrist+ ] -- List-comprehension.+
+ src-lib/BishBosh/State/Censor.hs view
@@ -0,0 +1,51 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Maintains a census of the /piece/s on the board, without regard to their location.+-}++module BishBosh.State.Censor(+-- * Types+-- ** Type-synonyms+	NPiecesByRank,+-- * Type-classes+	Censor(..)+) where++import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Component.Piece	as Component.Piece++-- | The difference in the number of /piece/s of each /rank/ held by either side.+type NPiecesByRank	= Attribute.Rank.ByRank Component.Piece.NPieces++-- | An interface which may be implemented by data which can perform a census of the /piece/s on the /board/.+class Censor censor where+	countPiecesByLogicalColour	:: censor -> (Component.Piece.NPieces, Component.Piece.NPieces)	-- ^ The total number of /piece/s, partitioned into @Black@ & @White@.++	countPieces			:: censor -> Component.Piece.NPieces				-- ^ The total number of /piece/s on the board.+	countPieces	= uncurry (+) . countPiecesByLogicalColour	-- Default implementation.++	countPieceDifferenceByRank	:: censor -> NPiecesByRank					-- ^ Finds the difference between the number of /piece/s of each /rank/ held by each side. N.B. for this purpose, @White@ is arbitrarily considered positive & @Black@ negative.++	hasInsufficientMaterial		:: censor -> Bool						-- ^ Whether insufficient material remains on the board, to force check-mate; <https://en.wikipedia.org/wiki/Draw_(chess)>.++	hasBothKings			:: censor -> Bool						-- ^ Whether there's exactly one @King@ of each /logical colour/.+
+ src-lib/BishBosh/State/CoordinatesByRankByLogicalColour.hs view
@@ -0,0 +1,358 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* A view of the /board/ from the perspective of its /piece/s.++	* cf. the square-centric model of the board defined in "BishBosh.State.MaybePieceByCoordinates".+-}++module BishBosh.State.CoordinatesByRankByLogicalColour(+-- * Types+-- ** Type-synonyms+	NPiecesByFileByLogicalColour,+--	CoordinatesByRank,+	CoordinatesByLogicalColour,+--	Transformation,+-- ** Data-types+	CoordinatesByRankByLogicalColour(+--		MkCoordinatesByRankByLogicalColour,+		deconstruct+	),+-- * Functions+	countPawnsByFileByLogicalColour,+	findPassedPawnCoordinatesByLogicalColour,+	findPieces,+	findPiecesOfColour,+	findProximateKnights,+	sumPieceSquareValueByLogicalColour,+--	deleteCoordinates,+	assocs,+-- ** Accessors+	getKingsCoordinates,+	dereference,+	elems,+-- ** Constructors,+	fromMaybePieceByCoordinates,+-- ** Mutators+	movePiece,+	sortCoordinates+) where++import			Control.Arrow((&&&))+import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.Direction		as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Component.PieceSquareArray	as Component.PieceSquareArray+import qualified	BishBosh.Component.Zobrist		as Component.Zobrist+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.State.Censor			as State.Censor+import qualified	BishBosh.State.MaybePieceByCoordinates	as State.MaybePieceByCoordinates+import qualified	BishBosh.Types				as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Map.Strict+import qualified	Data.Maybe++-- | The /coordinate/s of all the pieces of one /rank/.+type CoordinatesByRank x y	= Attribute.Rank.ByRank [Cartesian.Coordinates.Coordinates x y]++{- |+	* This structure allows one to determine the set of /coordinates/ where a type of /piece/ is located.++	* CAVEAT: the list of /coordinates/ is unordered, so test for equality using @ deconstruct . sortCoordinates @.+-}+newtype CoordinatesByRankByLogicalColour x y	= MkCoordinatesByRankByLogicalColour {+	deconstruct	:: Attribute.LogicalColour.ByLogicalColour (CoordinatesByRank x y)+}++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (CoordinatesByRankByLogicalColour x y) where+	rnf MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Control.DeepSeq.rnf byLogicalColour++instance (Enum x, Enum y) => State.Censor.Censor (CoordinatesByRankByLogicalColour x y) where+	countPiecesByLogicalColour MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= ($ Attribute.LogicalColour.Black) &&& ($ Attribute.LogicalColour.White) $ Data.Foldable.foldl' (\acc -> (+ acc) . length) 0 . (byLogicalColour !)++	countPieces MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Data.Foldable.foldl' (+		Data.Foldable.foldl' $ \acc -> (+ acc) . length+	 ) 0 byLogicalColour++	countPieceDifferenceByRank MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Attribute.Rank.listArrayByRank . uncurry (+		zipWith (-)+	 ) . (+		($ Attribute.LogicalColour.White) &&& ($ Attribute.LogicalColour.Black)+	 ) $ map length . Data.Array.IArray.elems . (byLogicalColour !)++	hasInsufficientMaterial MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Data.Foldable.all (+		\byRank -> all (+			null . (byRank !)+		) Attribute.Rank.individuallySufficientMaterial+	 ) byLogicalColour && case blackKnights ++ whiteKnights of+		[]	-> Cartesian.Coordinates.areSquaresIsochromatic bishops+		[_]	-> null bishops+		_	-> False+		where+			[blackKnights, blackBishops, whiteKnights, whiteBishops]	= [+				byRank ! rank |+					byRank	<- Data.Array.IArray.elems byLogicalColour,+					rank	<- [Attribute.Rank.Knight, Attribute.Rank.Bishop]+			 ] -- List-comprehension.++			bishops	= blackBishops ++ whiteBishops++	hasBothKings MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= not $ Data.Foldable.any (null . (! Attribute.Rank.King)) byLogicalColour	-- CAVEAT: true for more than one King per side also.++instance (Enum x, Enum y, Ord x, Ord y) => Component.Zobrist.Hashable2D CoordinatesByRankByLogicalColour x y {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms2D MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour } zobrist	= [+		Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour logicalColour rank coordinates zobrist |+			(logicalColour, byRank)	<- Data.Array.IArray.assocs byLogicalColour,+			(rank, coordinatesList)	<- Data.Array.IArray.assocs byRank,+			coordinates		<- coordinatesList+	 ] -- List-comprehension.++-- | Constructor.+fromMaybePieceByCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => State.MaybePieceByCoordinates.MaybePieceByCoordinates x y -> CoordinatesByRankByLogicalColour x y+fromMaybePieceByCoordinates maybePieceByCoordinates	= MkCoordinatesByRankByLogicalColour . (+	\(b, w) -> Attribute.LogicalColour.listArrayByLogicalColour $ map (+		Data.Array.IArray.accumArray (++) [] (minBound, maxBound) . map (Control.Arrow.first Component.Piece.getRank)+	) [b, w]+ ) $ Data.List.partition (+	Component.Piece.isBlack . fst {-piece-}+ ) [+	(piece, [coordinates]) |+		(coordinates, piece)	<- State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates+ ] -- List-comprehension.++-- | Dereference the array.+dereference+	:: Attribute.LogicalColour.LogicalColour+	-> Attribute.Rank.Rank+	-> CoordinatesByRankByLogicalColour x y+	-> [Cartesian.Coordinates.Coordinates x y]+{-# INLINE dereference #-}+dereference logicalColour rank MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= byLogicalColour ! logicalColour ! rank++-- | Build an association-list.+assocs :: CoordinatesByRankByLogicalColour x y -> [(Component.Piece.Piece, [Cartesian.Coordinates.Coordinates x y])]+assocs MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= [+	(Component.Piece.mkPiece logicalColour rank, coordinatesList) |+		(logicalColour, byRank)	<- Data.Array.IArray.assocs byLogicalColour,+		(rank, coordinatesList)	<- Data.Array.IArray.assocs byRank+ ] -- List-comprehension.++-- | Access the coordinate-lists.+elems :: CoordinatesByRankByLogicalColour x y -> [Cartesian.Coordinates.Coordinates x y]+elems MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= [+	coordinates |+		byRank		<- Data.Array.IArray.elems byLogicalColour,+		coordinatesList	<- Data.Array.IArray.elems byRank,+		coordinates	<- coordinatesList+ ] -- List-comprehension.++-- | Get the /coordinates/ of the @King@ of the specified /logical colour/.+getKingsCoordinates+	:: Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the @King@ to find.+	-> CoordinatesByRankByLogicalColour x y+	-> Cartesian.Coordinates.Coordinates x y+{-# INLINE getKingsCoordinates #-}+getKingsCoordinates logicalColour MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Control.Exception.assert (not $ null coordinates) $ head coordinates {-there should be exactly one-} where+	coordinates	= byLogicalColour ! logicalColour ! Attribute.Rank.King++-- | The number of /piece/s in each file, for each /logical colour/.+type NPiecesByFileByLogicalColour x	= Attribute.LogicalColour.ByLogicalColour (Data.Map.Map x Component.Piece.NPieces)++{- |+	* Counts the number of @Pawn@s of each /logical colour/ with similar /x/-coordinates; their /y/-coordinate is irrelevant.++	* N.B.: files lacking any @Pawn@, don't feature in the results.+-}+countPawnsByFileByLogicalColour :: Ord x => CoordinatesByRankByLogicalColour x y -> NPiecesByFileByLogicalColour x+countPawnsByFileByLogicalColour MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Data.Array.IArray.amap (+	Data.List.foldl' (+		\m coordinates -> Data.Map.Strict.insertWith (const succ) (Cartesian.Coordinates.getX coordinates) 1 m+	) Data.Map.empty . (! Attribute.Rank.Pawn)+ ) byLogicalColour++-- | Locates those /piece/s which satisfy the specified predicate.+findPieces+	:: (Component.Piece.Piece -> Bool)	-- ^ Predicate.+	-> CoordinatesByRankByLogicalColour x y+	-> [Component.Piece.LocatedPiece x y]+findPieces predicate MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= [+	(coordinates, piece) |+		(logicalColour, byRank)	<- Data.Array.IArray.assocs byLogicalColour,+		(rank, coordinatesList)	<- Data.Array.IArray.assocs byRank,+		let piece	= Component.Piece.mkPiece logicalColour rank,+		predicate piece,+		coordinates		<- coordinatesList+ ] -- List-comprehension.++-- | Locate all /piece/s of the specified /logical colour/.+findPiecesOfColour+	:: Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the /piece/s to find.+	-> CoordinatesByRankByLogicalColour x y+	-> [Component.Piece.LocatedPiece x y]+findPiecesOfColour logicalColour MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= [+	(coordinates, Component.Piece.mkPiece logicalColour rank) |+		(rank, coordinatesList)	<- Data.Array.IArray.assocs $ byLogicalColour ! logicalColour,+		coordinates		<- coordinatesList+ ] -- List-comprehension.++{- |+	* Find any @Knight@s of the specified /logical colour/, in attack-range around the specified /coordinates/.++	* CAVEAT: nothing is said about whether any /piece/ at the specified /coordinates/ belongs to the opponent, as one might expect.+-}+findProximateKnights :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the @Knight@ for which to search.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The destination to which the @Knight@ is required to be capable of jumping.+	-> CoordinatesByRankByLogicalColour x y+	-> [Cartesian.Coordinates.Coordinates x y]+{-# INLINABLE findProximateKnights #-}+findProximateKnights logicalColour destination MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= filter (+	\source -> source /= destination {-guard against attempting to constructing a null vector-} && Cartesian.Vector.isKnightsMove (+		Cartesian.Vector.measureDistance source destination	:: Cartesian.Vector.VectorInt+	)+ ) $ byLogicalColour ! logicalColour ! Attribute.Rank.Knight++-- | A list of /coordinates/ for each /logical colour/.+type CoordinatesByLogicalColour x y	= Attribute.LogicalColour.ByLogicalColour [Cartesian.Coordinates.Coordinates x y]++-- | For each /logical colour/, find the /coordinates/ of any passed @Pawn@s (<https://en.wikipedia.org/wiki/Passed_pawn>).+findPassedPawnCoordinatesByLogicalColour :: (Enum x, Ord x, Ord y) => CoordinatesByRankByLogicalColour x y -> CoordinatesByLogicalColour x y+findPassedPawnCoordinatesByLogicalColour MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= Attribute.LogicalColour.listArrayByLogicalColour [+	filter (+		\coordinates -> all (+			Data.Maybe.maybe True {-the absence of an opposing Pawn doesn't impede advancement-} (+				(+					/= Attribute.Direction.advanceDirection logicalColour	-- Either equal or backwards is OK.+				) . (+					{-opponent-} `compare` Cartesian.Coordinates.getY coordinates+				) -- As a Pawn advances, it becomes "Passed" when the y-distance to the least advanced adjacent opposing Pawn, is either equal or backwards.+			 ) . (`Data.Map.lookup` opposingPawnYByX)+		) . uncurry (:) . (+			id &&& Cartesian.Abscissa.getAdjacents+		) $ Cartesian.Coordinates.getX coordinates+	) $ findPawns logicalColour |+		logicalColour	<- Attribute.LogicalColour.range,+		let+			opponentsLogicalColour	= Property.Opposable.getOpposite logicalColour+			opposingPawnYByX	= Data.List.foldl' (+				\m coordinates -> uncurry (+					Data.Map.Strict.insertWith $ if Attribute.LogicalColour.isBlack opponentsLogicalColour+						then max+						else min+				) {-only compare with the least advanced opposing Pawn in each file-} (+					Cartesian.Coordinates.getX &&& Cartesian.Coordinates.getY $ coordinates+				) m+			 ) Data.Map.empty $ findPawns opponentsLogicalColour+ ] {-list-comprehension-} where+	findPawns	= (! Attribute.Rank.Pawn) . (byLogicalColour !)++-- | Calculate the total value of the /coordinates/ occupied by the /piece/s of either side.+sumPieceSquareValueByLogicalColour+	:: Num pieceSquareValue+	=> Component.PieceSquareArray.FindPieceSquareValue x y pieceSquareValue+	-> CoordinatesByRankByLogicalColour x y+	-> [pieceSquareValue]+{-# SPECIALISE sumPieceSquareValueByLogicalColour :: Component.PieceSquareArray.FindPieceSquareValue T.X T.Y T.PieceSquareValue -> CoordinatesByRankByLogicalColour T.X T.Y -> [T.PieceSquareValue] #-}+sumPieceSquareValueByLogicalColour findPieceSquareValue MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= [+	Data.List.foldl' (+		\acc (rank, coordinatesList) -> Data.List.foldl' (+			\acc' coordinates -> acc' + findPieceSquareValue logicalColour rank coordinates+		) acc coordinatesList+	 ) 0 $ Data.Array.IArray.assocs byRank | (logicalColour, byRank) <- Data.Array.IArray.assocs byLogicalColour+ ] -- List-comprehension.++-- | Self-documentation.+type Transformation x y	= CoordinatesByRankByLogicalColour x y -> CoordinatesByRankByLogicalColour x y++-- | Remove the specified /coordinates/ from those recorded for the specified /rank/.+deleteCoordinates+	:: (Eq x, Eq y)+	=> Cartesian.Coordinates.Coordinates x y+	-> Attribute.Rank.Rank+	-> CoordinatesByRank x y+	-> CoordinatesByRank x y+deleteCoordinates coordinates rank byRank	= byRank // [(rank, Data.List.delete coordinates $ byRank ! rank)]++-- | Adjust the array to reflect a new /move/.+movePiece+	:: (Eq x, Eq y)+	=> Component.Move.Move x y+	-> Component.Piece.Piece							-- ^ The piece which moved.+	-> Maybe Attribute.Rank.Rank							-- ^ The (possibly promoted) rank to place at the destination.+	-> Either (Cartesian.Coordinates.Coordinates x y) (Maybe Attribute.Rank.Rank)	-- ^ Either the destination of any passed @Pawn@, or the /rank/ of any /piece/ taken.+	-> Transformation x y+movePiece move sourcePiece maybePromotionRank eitherPassingPawnsDestinationOrMaybeTakenRank MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= MkCoordinatesByRankByLogicalColour $ byLogicalColour // either (+	(:) . (`deleteOpponentsCoordinates` Attribute.Rank.Pawn)+ ) (+	Data.Maybe.maybe id {-quiet move-} $ (:) . deleteOpponentsCoordinates destination+ ) eitherPassingPawnsDestinationOrMaybeTakenRank [+	let+		byRank	= byLogicalColour ! logicalColour+	in (+		logicalColour,+		byRank // Data.Maybe.maybe (+			return {-to List-monad-} . Control.Arrow.second (destination :)	-- Add the destination to the mover.+		) (+			\promotionRank -> (:) (+				promotionRank,+				destination : byRank ! promotionRank	-- Add the destination to the mover's promoted rank.+			) . return {-to List-monad-}+		) maybePromotionRank (+			id &&& Data.List.delete (Component.Move.getSource move) . (byRank !) $ Component.Piece.getRank sourcePiece+		)+	) -- Pair.+ ] where+	destination					= Component.Move.getDestination move+	logicalColour					= Component.Piece.getLogicalColour sourcePiece+	deleteOpponentsCoordinates coordinates rank	= id &&& deleteCoordinates coordinates rank . (byLogicalColour !) $ Property.Opposable.getOpposite logicalColour++-- | Independently sort each list of /coordinates/.+sortCoordinates :: (Ord x, Ord y) => Transformation x y+sortCoordinates MkCoordinatesByRankByLogicalColour { deconstruct = byLogicalColour }	= MkCoordinatesByRankByLogicalColour $ Data.Array.IArray.amap (Data.Array.IArray.amap Data.List.sort) byLogicalColour+
+ src-lib/BishBosh/State/EnPassantAbscissa.hs view
@@ -0,0 +1,81 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the file on which an En-passant option currently exists.+-}++module BishBosh.State.EnPassantAbscissa (+-- * Types+-- ** Data-types+	EnPassantAbscissa(getAbscissa),+-- * Functions+-- ** Constructor+	mkMaybeEnPassantAbscissa+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Component.Turn			as Component.Turn+import qualified	BishBosh.Component.Zobrist		as Component.Zobrist+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.State.MaybePieceByCoordinates	as State.MaybePieceByCoordinates+import qualified	Control.DeepSeq+import qualified	Data.Array.IArray+import qualified	Data.Maybe++-- | Defines the file on which an En-passant option currently exists.+newtype EnPassantAbscissa x	= MkEnPassantAbscissa {+	getAbscissa	:: x	-- ^ The file on which an En-passant option currently exists.+} deriving (Eq, Ord)++instance Data.Array.IArray.Ix x => Component.Zobrist.Hashable1D EnPassantAbscissa x {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms1D MkEnPassantAbscissa { getAbscissa = x }	= return {-to List-monad-} . Component.Zobrist.dereferenceRandomByEnPassantAbscissa x++instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (EnPassantAbscissa x) where+	rnf MkEnPassantAbscissa { getAbscissa = x }	= Control.DeepSeq.rnf x++-- | Constructor.+mkMaybeEnPassantAbscissa :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The player who moves next, & who may have an En-passant option.+	-> State.MaybePieceByCoordinates.MaybePieceByCoordinates x y+	-> Component.Turn.Turn x y			-- ^ The last /turn/ taken.+	-> Maybe (EnPassantAbscissa x)+mkMaybeEnPassantAbscissa nextLogicalColour maybePieceByCoordinates lastTurn+	| Component.Turn.isPawnDoubleAdvance (Property.Opposable.getOpposite nextLogicalColour) lastTurn+	, let destination	= Component.Move.getDestination . Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove lastTurn+	, any (+		Data.Maybe.maybe False {-unoccupied-} (+			== Component.Piece.mkPawn nextLogicalColour+		) . (+			`State.MaybePieceByCoordinates.dereference` maybePieceByCoordinates+		)+	) $ Cartesian.Coordinates.getAdjacents destination	= Just . MkEnPassantAbscissa $ Cartesian.Coordinates.getX destination+	| otherwise						= Nothing+
+ src-lib/BishBosh/State/InstancesByPosition.hs view
@@ -0,0 +1,139 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Records the number of times each /position/ has been encountered.+-}++module BishBosh.State.InstancesByPosition(+-- * Types+-- ** Type-synonyms+--	NBoardsByPosition,+--	Transformation.+-- * Constants+	leastCyclicPlies,+-- ** Data-types+	InstancesByPosition(),+-- * Functions+	countConsecutiveRepeatablePlies,+	countPositionRepetitions,+	getNDistinctPositions,+-- ** Constructors+	mkInstancesByPosition,+	mkSingleton,+-- ** Mutators+	insertPosition,+	deletePosition,+-- ** Predicates+	anyInstancesByPosition+) where++import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Property.Reflectable	as Property.Reflectable+import qualified	BishBosh.State.Board		as State.Board+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Map.Strict++-- | The smallast number of repeatable plies required to form a cycle.+leastCyclicPlies :: Component.Move.NMoves+leastCyclicPlies	= 4++{- |+	* The number of times each /position/ has been encountered.++	* The /position/ can either be represented by a physical 'State.Position.Position', or by proxy using a hash.+-}+type NBoardsByPosition position	= Data.Map.Map position State.Board.NBoards++{- |+	* A count of the number of instances of /position/s which have occurred.++	* Greater than '1' represents a repetition.+-}+newtype InstancesByPosition position	= MkInstancesByPosition {+	getNBoardsByPosition	:: NBoardsByPosition position+} deriving Eq++instance Control.DeepSeq.NFData position => Control.DeepSeq.NFData (InstancesByPosition position) where+	rnf MkInstancesByPosition { getNBoardsByPosition = m }	= Control.DeepSeq.rnf m++instance (+	Ord					position,+	Property.Reflectable.ReflectableOnX	position+ ) => Property.Reflectable.ReflectableOnX (InstancesByPosition position) where+	reflectOnX MkInstancesByPosition { getNBoardsByPosition = m }	= MkInstancesByPosition $ Data.Map.mapKeys Property.Reflectable.reflectOnX m++-- | Smart constructor.+mkInstancesByPosition :: NBoardsByPosition position -> InstancesByPosition position+mkInstancesByPosition nBoardsByPosition+	| Data.Foldable.any (< 1) nBoardsByPosition	= Control.Exception.throw $ Data.Exception.mkOutOfBounds "BishBosh.State.InstancesByPosition.mkInstancesByPosition:\teach specified position must have been visited at least once."+	| otherwise					= MkInstancesByPosition nBoardsByPosition++-- | Constructor.+mkSingleton :: position -> InstancesByPosition position+mkSingleton position	= MkInstancesByPosition $ Data.Map.singleton position 1++-- | Count the total number of consecutive repeatable plies amongst recent moves.+countConsecutiveRepeatablePlies :: InstancesByPosition position -> Component.Move.NMoves+countConsecutiveRepeatablePlies MkInstancesByPosition { getNBoardsByPosition = m }	= Data.Map.foldl' (+) (+	negate 1	-- The map is never empty, since before the first move a singleton is constructed with the initial position.+ ) m++-- | Count the total number of repetitions of /position/s.+countPositionRepetitions :: InstancesByPosition position -> State.Board.NBoards+countPositionRepetitions MkInstancesByPosition { getNBoardsByPosition = m }	= Data.Map.foldl' (+	(+) . pred	-- The initial instance isn't a repetition.+ ) 0 m++-- | The number of distinct /position/s.+getNDistinctPositions :: InstancesByPosition position -> State.Board.NBoards+getNDistinctPositions MkInstancesByPosition { getNBoardsByPosition = m }	= Data.Map.size m++-- | Predicate: apply the specified predicate to the map.+anyInstancesByPosition+	:: (State.Board.NBoards -> Bool)+	-> InstancesByPosition position+	-> Bool+anyInstancesByPosition predicate MkInstancesByPosition { getNBoardsByPosition = m }	= Data.Foldable.any predicate m++-- | The type of a function which transforms the collection.+type Transformation position	= InstancesByPosition position -> InstancesByPosition position++-- | Insert a /position/ into the collection.+insertPosition+	:: Ord position+	=> Bool	-- ^ Whether the /turn/ which led to the specified /position/, was repeatable.+	-> position+	-> Transformation position+insertPosition isRepeatable position MkInstancesByPosition { getNBoardsByPosition = m }	= MkInstancesByPosition $ if isRepeatable+	then Data.Map.Strict.insertWith (const succ) position 1 m	-- Include this position.+	else Data.Map.singleton position 1				-- The previous position can't be revisited without rolling-back.++-- | Remove a /position/ from the collection, as required to implement rollback.+deletePosition :: Ord position => position -> Transformation position+deletePosition position MkInstancesByPosition { getNBoardsByPosition = m }	= Control.Exception.assert (Data.Map.member position m) . MkInstancesByPosition $ Data.Map.update (+		\n -> if n == 1+			then Nothing		-- Delete the entry.+			else Just $ pred n	-- Decrement the number of instances.+	) position m
+ src-lib/BishBosh/State/MaybePieceByCoordinates.hs view
@@ -0,0 +1,734 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Models the /board/ as a sparse array, each element of which might contain a /piece/.++	* N.B.: while this could be represented as @Data.Map.Map Coordinates Piece@, replacing 'Data.Array.IArray.!' with 'Data.Map.lookup',+	it actually required more space (despite having at most half the elements) & runs slower (because of 'compare').++	* cf. the piece-centric model of the board defined in "BishBosh.State.CoordinatesByRankByLogicalColour".+-}++module BishBosh.State.MaybePieceByCoordinates(+-- * Types+-- ** Type-synonyms+--	Transformation,+-- ** Data-types+	MaybePieceByCoordinates(),+-- * Constants+--	rankSeparator,+-- * Functions+	inferMoveType,+	findPieces,+	findBlockingPiece,+	findProximateKnights,+	findAttackerInDirection,+	sumPieceSquareValueByLogicalColour,+	listDestinationsFor,+--	listToRaster,+--	shows2D,+	show2D,+-- ** Accessors+	dereference,+--	getPieces,+-- ** Mutators+	defineCoordinates,+	movePiece,+-- ** Predicates+	isVacant,+	isOccupied,+	isClear,+	isObstructed,+	isEnPassantMove+) where++import			Control.Applicative((<|>))+import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.ColourScheme			as Attribute.ColourScheme+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.LogicalColourOfSquare	as Attribute.LogicalColourOfSquare+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.PhysicalColour		as Attribute.PhysicalColour+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate			as Cartesian.Ordinate+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.PieceSquareArray		as Component.PieceSquareArray+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Censor				as State.Censor+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Char+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	ToolShed.Data.List.Runlength++{- |+	* This structure allows one to determine what /piece/ (if any) is located at specific /coordinates/.++	* N.B.: this could be implemented using 'Data.Vector.Vector', which being indexed by 'Int' is no longer polymorphic & permits many unsafe operations; but the result is no faster.+-}+newtype MaybePieceByCoordinates x y	= MkMaybePieceByCoordinates {+	deconstruct	:: Data.Array.IArray.Array {-Boxed-} (+		Cartesian.Coordinates.Coordinates x y	-- The array-index has two dimensions.+	) (+		Maybe Component.Piece.Piece	-- Each square optionally contains a piece.+	)+} deriving (Eq, Ord)++-- | Used to separate the /ranks/ of the /board/ as represented by the IO-format <https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation Forsyth-Edwards notation>.+rankSeparator :: Char+rankSeparator	= '/'++-- | Chops a list into a 2-D list.+listToRaster :: [a] -> [[a]]+listToRaster	= Data.List.Extra.chunksOf $ fromIntegral Cartesian.Abscissa.xLength {-CAVEAT: this also depends on the raster-order-}++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (MaybePieceByCoordinates x y) where+	readsPrec _	= Property.ForsythEdwards.readsFEN++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Show (MaybePieceByCoordinates x y) where+	showsPrec _	= Property.ForsythEdwards.showsFEN++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ReadsFEN (MaybePieceByCoordinates x y) where+	readsFEN s+		| length rows /= fromIntegral Cartesian.Ordinate.yLength || any (+			(/= fromIntegral Cartesian.Abscissa.xLength) . length+		) rows		= []	-- No parse.+		| otherwise	= [(MkMaybePieceByCoordinates . Cartesian.Coordinates.listArrayByCoordinates . concat $ reverse rows, remainder)]+		where+			(rows, remainder)	= Control.Arrow.first (+				map (+					concatMap (+						\c -> case reads [c] of+							[(i, "")]	-> replicate i Nothing	-- Expand the runlength-code so that each row has the same length.+							_		-> [Just piece | (piece, []) <- Property.ForsythEdwards.readsFEN [c]] -- List-comprehension.+					)+				) . Text.ShowList.splitOn (== rankSeparator)+			 ) . span (+				`elem` rankSeparator : concatMap Property.ForsythEdwards.showFEN Component.Piece.range ++ concatMap show [1 .. Cartesian.Abscissa.xLength]+			 ) $ Data.List.Extra.trimStart s++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ShowsFEN (MaybePieceByCoordinates x y) where+	showsFEN MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= foldr1 (+		flip (.)	-- Render the line with the highest y-coordinate first.+	 ) . Data.List.intersperse (+		showChar rankSeparator	-- Separate the lines.+	 ) . map (+		foldr1 (.) . concatMap (+			\(runLength, maybePiece) -> Data.Maybe.maybe [+				shows runLength	-- Represent empty squares.+			] (+				replicate runLength . Property.ForsythEdwards.showsFEN	-- Render each piece.+			) maybePiece+		) . ToolShed.Data.List.Runlength.encode+	 ) . listToRaster $ Data.Array.IArray.elems byCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Data.Default.Default (MaybePieceByCoordinates x y) where+	def = Property.ForsythEdwards.readFEN . Data.List.intercalate [rankSeparator] $ map ($ Attribute.LogicalColour.Black) [+		showNobility,+		showPawnRow+	 ] ++ replicate 4 "8" ++ map ($ Attribute.LogicalColour.White) [+		showPawnRow,+		showNobility+	 ] where+		showPieces :: [Component.Piece.Piece] -> String+		showPieces	= concatMap Property.ForsythEdwards.showFEN++		showPawnRow, showNobility :: Attribute.LogicalColour.LogicalColour -> String+		showPawnRow logicalColour	= showPieces . replicate (fromIntegral Cartesian.Abscissa.xLength) $ Component.Piece.mkPawn logicalColour+		showNobility logicalColour	= showPieces $ map (Component.Piece.mkPiece logicalColour) Attribute.Rank.nobility++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Reflectable.ReflectableOnX (MaybePieceByCoordinates x y) where+	reflectOnX MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= MkMaybePieceByCoordinates . Data.Array.IArray.array (minBound, maxBound) . map (+		Property.Reflectable.reflectOnX *** fmap Property.Opposable.getOpposite+	 ) $ Data.Array.IArray.assocs byCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Reflectable.ReflectableOnY (MaybePieceByCoordinates x y) where+	reflectOnY MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= MkMaybePieceByCoordinates . Data.Array.IArray.array (minBound, maxBound) . map (+		Control.Arrow.first Property.Reflectable.reflectOnY+	 ) $ Data.Array.IArray.assocs byCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Empty.Empty (MaybePieceByCoordinates x y) where+	empty	= MkMaybePieceByCoordinates . Cartesian.Coordinates.listArrayByCoordinates $ repeat Nothing++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (MaybePieceByCoordinates x y) where+	rnf MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Control.DeepSeq.rnf byCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => State.Censor.Censor (MaybePieceByCoordinates x y) where+	countPiecesByLogicalColour	= Data.List.foldl' (+		\acc piece -> let+			acc'@(nBlack, nWhite)	= (+				if Component.Piece.isBlack piece+					then Control.Arrow.first+					else Control.Arrow.second+			 ) succ acc+		in nBlack `seq` nWhite `seq` acc'+	 ) (0, 0) . getPieces++	countPieces	= length . getPieces++	countPieceDifferenceByRank	= Data.Array.IArray.accumArray (+) 0 (minBound, maxBound) . map (+		Component.Piece.getRank &&& (+			\piece -> (+				if Component.Piece.isBlack piece+					then negate+					else id+			) 1+		)+	 ) . getPieces++	hasInsufficientMaterial maybePieceByCoordinates	= all (+		(`notElem` Attribute.Rank.individuallySufficientMaterial) . Component.Piece.getRank . snd {-piece-}+	 ) locatedPieces && case blackKnights ++ whiteKnights of+		[]	-> Cartesian.Coordinates.areSquaresIsochromatic bishops+		[_]	-> null bishops+		_	-> False+		where+			locatedPieces	= findPieces maybePieceByCoordinates++			[blackKnights, blackBishops, whiteKnights, whiteBishops]	= [+				[+					coordinates |+						(coordinates, piece)	<- locatedPieces,+						piece == Component.Piece.mkPiece logicalColour rank+				] |+					logicalColour	<- Attribute.LogicalColour.range,+					rank		<- [Attribute.Rank.Knight, Attribute.Rank.Bishop]+			 ] -- List-comprehension.++			bishops	= blackBishops ++ whiteBishops++	hasBothKings maybePieceByCoordinates	= case Data.List.partition Component.Piece.isBlack . filter Component.Piece.isKing $ getPieces maybePieceByCoordinates of+		([_], [_])	-> True+		_		-> False++instance (Enum x, Enum y, Ord x, Ord y) => Component.Zobrist.Hashable2D MaybePieceByCoordinates x y {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms2D MkMaybePieceByCoordinates { deconstruct = byCoordinates } zobrist	= [+		uncurry Component.Zobrist.dereferenceRandomByCoordinatesByRankByLogicalColour (Component.Piece.getLogicalColour &&& Component.Piece.getRank $ piece) coordinates zobrist |+			(coordinates, Just piece)	<- Data.Array.IArray.assocs byCoordinates+	 ] -- List-comprehension.++-- | Dereference the array.+dereference :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> MaybePieceByCoordinates x y+	-> Maybe Component.Piece.Piece+{-# INLINE dereference #-}+dereference coordinates MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= byCoordinates ! coordinates++-- | Infer the type of the specified /move/.+inferMoveType :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ )+	=> Component.Move.Move x y+	-> Maybe Attribute.Rank.Rank	-- ^ The /rank/ to which a @Pawn@ should be promoted; defaulting to @Queen@.+	-> MaybePieceByCoordinates x y+	-> Attribute.MoveType.MoveType+{-# SPECIALISE inferMoveType :: Component.Move.Move T.X T.Y -> Maybe Attribute.Rank.Rank -> MaybePieceByCoordinates T.X T.Y -> Attribute.MoveType.MoveType #-}+inferMoveType move maybePromotionRank maybePieceByCoordinates@MkMaybePieceByCoordinates { deconstruct = byCoordinates }+	| Just sourcePiece <- byCoordinates ! Component.Move.getSource move	= case [+		moveType |+			Component.Piece.isKing sourcePiece,+			(moveType, kingsMove, _)	<- Component.Move.castlingMovesByLogicalColour ! Component.Piece.getLogicalColour sourcePiece,+			move == kingsMove+	] {-list-comprehension-} of+		moveType : _	-> moveType+		_+			| isEnPassantMove move maybePieceByCoordinates	-> Attribute.MoveType.enPassant	-- N.B.: if this move is valid, then one's opponent must have just double advanced an adjacent Pawn.+			| otherwise					-> Attribute.MoveType.mkNormalMoveType (+				fmap Component.Piece.getRank $ byCoordinates ! destination	-- Record the rank of any piece which was taken; the logical colour is inferred to be the opposite of 'sourcePiece'.+			) $ if Component.Piece.isPawnPromotion destination sourcePiece+				then maybePromotionRank <|> Just Attribute.Rank.defaultPromotionRank+				else Nothing+	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.State.MaybePieceByCoordinates.inferMoveType:\tno piece exists at " . shows (Component.Move.getSource move) . showString "; " $ shows maybePieceByCoordinates "."+	where+		destination	= Component.Move.getDestination move++{- |+	* Lists the destination-/coordinates/ to which the referenced /piece/ can move, & the /rank/ of any /piece/ taken.++	* N.B.: one can reference either player's /piece/, regardless of whose turn it is to move.++	* CAVEAT: doesn't include either /Castling/ or /En-passant/, because this function doesn't know the history of the game.++	* CAVEAT: doesn't check whether any proposed /move/ exposes one's @King@, because this function doesn't assume the existence of a @King@.++	* CAVEAT: the opponent's @King@ may be one of the destinations returned, but only if it was actually their move next.++	* CAVEAT: doesn't typically check whether anything (let alone the specified /piece/) exists at the specified source-/coordinates/.+-}+listDestinationsFor :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y				-- ^ The source for which destinations are required.+	-> Component.Piece.Piece						-- ^ The /piece/ at the specified source.+	-> MaybePieceByCoordinates x y+	-> [(Cartesian.Coordinates.Coordinates x y, Maybe Attribute.Rank.Rank)]	-- ^ The destination & the rank of any piece taken.+{-# SPECIALISE listDestinationsFor :: Cartesian.Coordinates.Coordinates T.X T.Y -> Component.Piece.Piece -> MaybePieceByCoordinates T.X T.Y -> [(Cartesian.Coordinates.Coordinates T.X T.Y, Maybe Attribute.Rank.Rank)] #-}+listDestinationsFor source piece maybePieceByCoordinates@MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Control.Exception.assert (+	Data.Maybe.maybe False (== piece) $ byCoordinates ! source+ ) $ if Component.Piece.getRank piece `elem` Attribute.Rank.fixedAttackRange+	then {-P,N,K-} let+		findDestinations predicate	= [+			(destination, fmap Component.Piece.getRank maybeDestinationPiece) |+				destination	<- Component.Piece.findAttackDestinations source piece,+				let maybeDestinationPiece	= byCoordinates ! destination,+				predicate maybeDestinationPiece+		 ] -- List-comprehension.+	in if Component.Piece.isPawn piece+		then findDestinations (+			Data.Maybe.maybe False {-unoccupied-} $ (/= logicalColour) . Component.Piece.getLogicalColour+		) ++ let+			advance	:: (Enum y, Ord y) => Cartesian.Coordinates.Coordinates x y -> Cartesian.Coordinates.Coordinates x y+			advance	= Cartesian.Coordinates.advance logicalColour++			advancedLocation	= advance source+		in if isVacant advancedLocation maybePieceByCoordinates+			then (advancedLocation, Nothing) : [+				(doubleAdvancedLocation, Nothing) |+					Cartesian.Coordinates.isPawnsFirstRank logicalColour source,+					let doubleAdvancedLocation	= advance advancedLocation,+					isVacant doubleAdvancedLocation maybePieceByCoordinates+			] -- List-comprehension.+			else []	-- The path immediately ahead is blocked.+		else {-N,K-} findDestinations . Data.Maybe.maybe True {-unoccupied-} $ (/= logicalColour) . Component.Piece.getLogicalColour+	else {-R,B,Q-} let+		takeUntil (destination : remainder)+			| Just blockingPiece <- byCoordinates ! destination	= [+				(+					destination,+					Just $ Component.Piece.getRank blockingPiece+				) | Component.Piece.getLogicalColour blockingPiece /= logicalColour+			] -- List-comprehension.+			| otherwise	= (destination, Nothing) : takeUntil remainder	-- Recurse.+		takeUntil _	= []+	in [+		pairs |+			direction	<- Component.Piece.attackDirectionsByPiece Data.Map.! piece,+			pairs		<- takeUntil $ Cartesian.Coordinates.extrapolate direction source+	] -- List-comprehension.+	where+		logicalColour	= Component.Piece.getLogicalColour piece++-- | Show the /board/ in two dimensions, with /x/ & /y/ indexes.+shows2D :: (+	Enum		x,+	Enum		y,+	Integral	column,+	Ord		x,+	Ord		y+ )+	=> column	-- ^ The column-magnification.+	-> Attribute.ColourScheme.ColourScheme+	-> (Int, Int)	-- ^ The origin from which axes are labelled.+	-> MaybePieceByCoordinates x y+	-> ShowS	-- ^ The output suitable for display on a terminal.+shows2D boardColumnMagnification colourScheme (xOrigin, yOrigin) MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= (+	foldr (+		\(y, pairs) showsRow -> showsRow . showString (+			Attribute.PhysicalColour.selectGraphicsRendition True $ Attribute.PhysicalColour.mkFgColourCode Attribute.PhysicalColour.green+		) . showChar y . foldr (+			\(coordinates, c) acc' -> showString (+				Attribute.PhysicalColour.selectGraphicsRendition False . Attribute.PhysicalColour.mkBgColourCode $ (+					if Attribute.LogicalColourOfSquare.isBlack $ Cartesian.Coordinates.getLogicalColourOfSquare coordinates+						then Attribute.ColourScheme.getDarkSquareColour+						else Attribute.ColourScheme.getLightSquareColour+				 ) colourScheme+			) . showString (+				Attribute.PhysicalColour.selectGraphicsRendition True . Attribute.PhysicalColour.mkFgColourCode $ (+					if Data.Char.isLower c {-Black-}+						then Attribute.ColourScheme.getDarkPieceColour+						else Attribute.ColourScheme.getLightPieceColour+				 ) colourScheme+			) . let+				showPadding	= showString (fromIntegral (pred boardColumnMagnification) `replicate` ' ')+			in showPadding . showChar c . showPadding . acc'+		) showsReset pairs . showChar '\n'+	) id . zip (+		take (fromIntegral Cartesian.Ordinate.yLength) . enumFrom $ Data.Char.chr yOrigin+	) . listToRaster . map (+		Control.Arrow.second . Data.Maybe.maybe ' ' $ head . show	-- Represent each piece as a single character.+	) $ Data.Array.IArray.assocs byCoordinates+ ) . showString (+	replicate (fromIntegral boardColumnMagnification) ' '	-- Shift the line of x-axis labels right.+ ) . showString (+	Attribute.PhysicalColour.selectGraphicsRendition True $ Attribute.PhysicalColour.mkFgColourCode Attribute.PhysicalColour.green+ ) . foldr (.) showsReset (+	Data.List.intersperse (+		showString $ replicate (2 * fromIntegral (pred boardColumnMagnification)) ' '	-- Separate each of the x-axis labels.+	) . map showChar . take (+		fromIntegral Cartesian.Abscissa.xLength+	) . enumFrom $ Data.Char.chr xOrigin+ ) where+	showsReset :: ShowS+	showsReset	= showString $ Attribute.PhysicalColour.selectGraphicsRendition False 0++-- | Show the board using a two-dimensional representation.+show2D :: (+	Enum		x,+	Enum		y,+	Integral	column,+	Ord		x,+	Ord		y+ )+	=> column	-- ^ The column-magnification.+	-> Attribute.ColourScheme.ColourScheme+	-> (Int, Int)	-- ^ The origin from which axes are labelled.+	-> MaybePieceByCoordinates x y+	-> String	-- ^ The output suitable for display on a terminal.+show2D boardColumnMagnification colourScheme (xOrigin, yOrigin) maybePieceByCoordinates	= shows2D boardColumnMagnification colourScheme (xOrigin, yOrigin) maybePieceByCoordinates ""++-- | Extract the pieces from the board, discarding their coordinates.+getPieces :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => MaybePieceByCoordinates x y -> [Component.Piece.Piece]+getPieces MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Data.Maybe.catMaybes $ Data.Array.IArray.elems byCoordinates++-- | Find all pieces.+findPieces :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => MaybePieceByCoordinates x y -> [Component.Piece.LocatedPiece x y]+findPieces MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= [+	(coordinates, piece) |+		(coordinates, Just piece)	<- Data.Array.IArray.assocs byCoordinates+ ] -- List-comprehension.++{- |+	* Find the first /piece/ of either /logical colour/, encountered along a straight line in the specified /direction/, from just after the specified /coordinates/.++	* CAVEAT: this is a performance-hotspot.+-}+findBlockingPiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.Direction.Direction		-- ^ The direction in which to search.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The starting point.+	-> MaybePieceByCoordinates x y+	-> Maybe (Component.Piece.LocatedPiece x y)+{-# SPECIALISE findBlockingPiece :: Attribute.Direction.Direction -> Cartesian.Coordinates.Coordinates T.X T.Y -> MaybePieceByCoordinates T.X T.Y -> Maybe (Component.Piece.LocatedPiece T.X T.Y) #-}+{- CAVEAT: too slow.+findBlockingPiece direction source MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Data.Maybe.listToMaybe . Data.Maybe.mapMaybe (+	uncurry fmap . ((,) &&& (byCoordinates !))+ ) $ Cartesian.Coordinates.extrapolate direction source+findBlockingPiece direction source maybePieceByCoordinates	= fmap (+	id &&& Data.Maybe.fromJust . (deconstruct maybePieceByCoordinates !)+ ) . Data.List.find (`isOccupied` maybePieceByCoordinates) $ Cartesian.Coordinates.extrapolate direction source+findBlockingPiece direction source MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= slave $ Cartesian.Coordinates.extrapolate direction source where+	slave (coordinates : remainder)	= case byCoordinates ! coordinates of+		Nothing		-> slave remainder	-- Recurse.+		Just piece	-> Just (coordinates, piece)+	slave _				= Nothing+findBlockingPiece direction source MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Data.Maybe.listToMaybe [+	(coordinates, piece) |+		coordinates	<- Cartesian.Coordinates.extrapolate direction source,+		piece		<- Data.Maybe.maybeToList $ byCoordinates ! coordinates+ ] -- List-comprehension.+-}+findBlockingPiece direction source MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Data.Maybe.listToMaybe [+	(coordinates, piece) |+		(coordinates, Just piece)	<- map (id &&& (byCoordinates !)) $ Cartesian.Coordinates.extrapolate direction source+ ] -- List-comprehension.++{- |+	* Find any @Knight@s of the specified /logical colour/, in attack-range around the specified /coordinates/.++	* CAVEAT: nothing is said about whether any /piece/ at the specified /coordinates/ belongs to the opponent, as one might expect.++	* CAVEAT: less efficient than 'State.CoordinatesByRankByLogicalColour.findProximateKnights'.+-}+findProximateKnights :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The /logical colour/ of the @Knight@ for which to search.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The destination to which the @Knight@ is required to be capable of jumping.+	-> MaybePieceByCoordinates x y+	-> [Cartesian.Coordinates.Coordinates x y]+findProximateKnights logicalColour destination MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= filter (+	Data.Maybe.maybe False (== knight) . (byCoordinates !)+ ) $ Component.Piece.findAttackDestinations destination knight where+	knight	= Component.Piece.mkKnight logicalColour++{- |+	* Find the /coordinates/ of any attacker who can strike the specified /coordinates/, in a straight line along the specified /direction/ (as seen by the target).++	* N.B.: there no requirement for there to actually be a /piece/ to attack at the specified target.+-}+findAttackerInDirection :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour				-- ^ The defender's /logical colour/.+	-> Attribute.Direction.Direction					-- ^ The /direction/ from the /coordinates/ of concern; the opposite /direction/ from which an attacker might strike.+	-> Cartesian.Coordinates.Coordinates x y				-- ^ The defender's square.+	-> MaybePieceByCoordinates x y+	-> Maybe (Cartesian.Coordinates.Coordinates x y, Attribute.Rank.Rank)	-- ^ Any opposing /piece/ which can attack the specified square from the specified /direction/.+{-# SPECIALISE findAttackerInDirection :: Attribute.LogicalColour.LogicalColour -> Attribute.Direction.Direction -> Cartesian.Coordinates.Coordinates T.X T.Y -> MaybePieceByCoordinates T.X T.Y -> Maybe (Cartesian.Coordinates.Coordinates T.X T.Y, Attribute.Rank.Rank) #-}+findAttackerInDirection destinationLogicalColour direction destination	= (=<<) (+	\(source, sourcePiece) -> if Component.Piece.getLogicalColour sourcePiece /= destinationLogicalColour && Component.Piece.canAttackAlong source destination sourcePiece+		then Just (source, Component.Piece.getRank sourcePiece)+		else Nothing+ ) . findBlockingPiece direction destination++-- | Whether the specified /coordinates/ are unoccupied.+isVacant :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> MaybePieceByCoordinates x y+	-> Bool+{-# INLINE isVacant #-}+isVacant coordinates MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Data.Maybe.isNothing $ byCoordinates ! coordinates++-- | Whether the specified /coordinates/ are occupied.+isOccupied :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> MaybePieceByCoordinates x y+	-> Bool+{-# INLINE isOccupied #-}+isOccupied coordinates	= not . isVacant coordinates++{- |+	* Whether the open interval (source, destination) is unobstructed.++	* N.B.: the specified end-points are uninspected.+-}+isClear :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Source.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> MaybePieceByCoordinates x y+	-> Bool+{-# SPECIALISE isClear :: Cartesian.Coordinates.Coordinates T.X T.Y -> Cartesian.Coordinates.Coordinates T.X T.Y -> MaybePieceByCoordinates T.X T.Y -> Bool #-}+isClear source destination maybePieceByCoordinates	= Control.Exception.assert (source /= destination) . all (`isVacant` maybePieceByCoordinates) . init {-discard the destination-} $ Cartesian.Coordinates.interpolate source destination++-- | Whether there's a blockage between a /piece/ presumed to exist at the specified source, & a /piece/ presumed to exist @ the specified destination.+isObstructed :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Cartesian.Coordinates.Coordinates x y	-- ^ Source.+	-> Cartesian.Coordinates.Coordinates x y	-- ^ Destination.+	-> MaybePieceByCoordinates x y+	-> Bool+{-# SPECIALISE isObstructed :: Cartesian.Coordinates.Coordinates T.X T.Y -> Cartesian.Coordinates.Coordinates T.X T.Y -> MaybePieceByCoordinates T.X T.Y -> Bool #-}+isObstructed source destination	= not . isClear source destination++{- |+	* Whether the specified /move/ matches the rules for /en-passant/.++	* CAVEAT: assumes that the /move/ is valid;+	otherwise one would also need to confirm that the opponent's @Pawn@ had just double-advanced into the appropriate position.+-}+isEnPassantMove :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Component.Move.Move x y+	-> MaybePieceByCoordinates x y+	-> Bool+{-# SPECIALISE isEnPassantMove :: Component.Move.Move T.X T.Y -> MaybePieceByCoordinates T.X T.Y -> Bool #-}+isEnPassantMove move maybePieceByCoordinates@MkMaybePieceByCoordinates { deconstruct = byCoordinates }+	| Just piece	<- byCoordinates ! source+	, let logicalColour	= Component.Piece.getLogicalColour piece+	= Cartesian.Coordinates.isEnPassantRank logicalColour source && Component.Piece.isPawn piece && destination `elem` Component.Piece.findAttackDestinations source piece && isVacant destination maybePieceByCoordinates	-- The move is either En-passant or invalid.+	| otherwise	= False	-- No piece.+	where+		(source, destination)	= Component.Move.getSource &&& Component.Move.getDestination $ move++-- | Self-documentation.+type Transformation x y	= MaybePieceByCoordinates x y -> MaybePieceByCoordinates x y++-- | Define the specified /coordinates/, by either placing or removing a /piece/.+defineCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Maybe Component.Piece.Piece			-- ^ The optional /piece/ to place (or remove if @Nothing@ is specified).+	-> Cartesian.Coordinates.Coordinates x y	-- ^ The /coordinates/ to define.+	-> Transformation x y+defineCoordinates maybePiece coordinates MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= Control.Exception.assert (+	Data.Maybe.isJust maybePiece || Data.Maybe.isJust (byCoordinates ! coordinates)+ ) . MkMaybePieceByCoordinates $ byCoordinates // [(coordinates, maybePiece)]++{- |+	* Adjust the array to reflect a move.++	* CAVEAT: regrettably this allocates an entire array.+-}+movePiece :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Component.Move.Move x y+	-> Component.Piece.Piece				-- ^ The (possibly promoted) piece to place at the destination.+	-> Maybe (Cartesian.Coordinates.Coordinates x y)	-- ^ Destination of any En-passant @Pawn@.+	-> Transformation x y+{-# SPECIALISE movePiece :: Component.Move.Move T.X T.Y -> Component.Piece.Piece -> Maybe (Cartesian.Coordinates.Coordinates T.X T.Y) -> Transformation T.X T.Y #-}+movePiece move destinationPiece maybeEnPassantDestination MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= MkMaybePieceByCoordinates $ byCoordinates // Data.Maybe.maybe id (+	(:) . flip (,) Nothing	-- Take the Pawn en-passant.+ ) maybeEnPassantDestination [+	(+		Component.Move.getSource move,+		Nothing	-- Remove the piece from the source.+	), (+		Component.Move.getDestination move,+		Just destinationPiece	-- Place the piece at the destination, removing any opposing incumbent as a side-effect.+	)+ ]++-- | Calculate the total value of the /coordinates/ occupied by the /piece/s of either side.+sumPieceSquareValueByLogicalColour :: (+	Enum	x,+	Enum	y,+	Num	pieceSquareValue,+	Ord	x,+	Ord	y+ )+	=> Component.PieceSquareArray.FindPieceSquareValue x y pieceSquareValue+	-> MaybePieceByCoordinates x y+	-> [pieceSquareValue]+{-# SPECIALISE sumPieceSquareValueByLogicalColour :: Component.PieceSquareArray.FindPieceSquareValue T.X T.Y T.PieceSquareValue -> MaybePieceByCoordinates T.X T.Y -> [T.PieceSquareValue] #-}+sumPieceSquareValueByLogicalColour findPieceSquareValue	= (+	\(b, w) -> [b, w]+ ) . Data.List.foldl' (+	\(b, w) (coordinates, piece) -> let+		logicalColour		= Component.Piece.getLogicalColour piece+		pieceSquareValue	= findPieceSquareValue logicalColour (Component.Piece.getRank piece) coordinates+	in if Attribute.LogicalColour.isBlack logicalColour+		then let b' = b + pieceSquareValue in b' `seq` (b', w)+		else let w' = w + pieceSquareValue in w' `seq` (b, w')+ ) (0, 0) . findPieces+
+ src-lib/BishBosh/State/Position.hs view
@@ -0,0 +1,156 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the state of the game, without regard to how it arrived there; <https://chessprogramming.wikispaces.com/Chess+Position>.++	* Games with the same /position/ have the same opportunities.++	* N.B.: /piece/s are fungible, i.e. they lack identity, so the location of identical /piece/s may be exchanged, without altering the /position/.+-}++module BishBosh.State.Position(+-- * Types+-- ** Data-types+	Position(+--		MkPosition,+--		getNextLogicalColour,+--		getMaybePieceByCoordinates,+--		getCastleableRooksByLogicalColour,+		getMaybeEnPassantAbscissa+	),+-- * Functions+-- ** Constructors+	mkPosition+) where++import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Component.Zobrist			as Component.Zobrist+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.CastleableRooksByLogicalColour	as State.CastleableRooksByLogicalColour+import qualified	BishBosh.State.EnPassantAbscissa		as State.EnPassantAbscissa+import qualified	BishBosh.State.MaybePieceByCoordinates		as State.MaybePieceByCoordinates+import qualified	BishBosh.Types					as T+import qualified	Control.DeepSeq+import qualified	Data.Array.IArray+import qualified	Data.Maybe++{- |+	* The state of the game, without regard to how it arrived there; <https://chessprogramming.wikispaces.com/Chess+Position>.++	* Games with the same /position/ may be considered to have converged, since they now have equal opportunity.+-}+data Position x y	= MkPosition {+	getNextLogicalColour			:: Attribute.LogicalColour.LogicalColour,	-- ^ The next player to move.+	getMaybePieceByCoordinates		:: State.MaybePieceByCoordinates.MaybePieceByCoordinates x y,+	getCastleableRooksByLogicalColour	:: State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x,+	getMaybeEnPassantAbscissa		:: Maybe (State.EnPassantAbscissa.EnPassantAbscissa x)+} deriving Eq++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Ord (Position x y) where+	{-# SPECIALISE instance Ord (Position T.X T.Y) #-}+	position@MkPosition {+		getNextLogicalColour		= nextLogicalColour,+		getMaybePieceByCoordinates	= maybePieceByCoordinates+	} `compare` position'@MkPosition {+		getNextLogicalColour		= nextLogicalColour',+		getMaybePieceByCoordinates	= maybePieceByCoordinates'+	} = (+		nextLogicalColour,+		maybePieceByCoordinates,+		getCastleableRooksByLogicalColour position,+		getMaybeEnPassantAbscissa position+	 ) `compare` (+		nextLogicalColour',+		maybePieceByCoordinates',+		getCastleableRooksByLogicalColour position',+		getMaybeEnPassantAbscissa position'+	 )++instance (+	Control.DeepSeq.NFData	x,+	Control.DeepSeq.NFData	y+ ) => Control.DeepSeq.NFData (Position x y) where+	rnf MkPosition {+		getNextLogicalColour			= nextLogicalColour,+		getMaybePieceByCoordinates		= maybePieceByCoordinates,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+		getMaybeEnPassantAbscissa		= maybeEnPassantAbscissa+	} = Control.DeepSeq.rnf (nextLogicalColour, maybePieceByCoordinates, castleableRooksByLogicalColour, maybeEnPassantAbscissa)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.Reflectable.ReflectableOnX (Position x y) where+	reflectOnX position@MkPosition {+		getNextLogicalColour			= nextLogicalColour,+		getMaybePieceByCoordinates		= maybePieceByCoordinates,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour+	} = position {+		getNextLogicalColour			= Property.Opposable.getOpposite nextLogicalColour,+		getMaybePieceByCoordinates		= Property.Reflectable.reflectOnX maybePieceByCoordinates,+		getCastleableRooksByLogicalColour	= Property.Reflectable.reflectOnX castleableRooksByLogicalColour+	}++instance (Data.Array.IArray.Ix x, Enum x, Enum y, Ord y) => Component.Zobrist.Hashable2D Position x y {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where+	listRandoms2D MkPosition {+		getNextLogicalColour			= nextLogicalColour,+		getMaybePieceByCoordinates		= maybePieceByCoordinates,+		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+		getMaybeEnPassantAbscissa		= maybeEnPassantAbscissa+	} zobrist	= (+		if Attribute.LogicalColour.isBlack nextLogicalColour+			then (Component.Zobrist.getRandomForBlacksMove zobrist :)+			else id+	 ) . Data.Maybe.maybe id (+		(++) . (`Component.Zobrist.listRandoms1D` zobrist)+	 ) maybeEnPassantAbscissa $ Component.Zobrist.listRandoms1D castleableRooksByLogicalColour zobrist ++ Component.Zobrist.listRandoms2D maybePieceByCoordinates zobrist++-- | Constructor.+mkPosition :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ )+	=> Attribute.LogicalColour.LogicalColour	-- ^ The logical colour of the next player to move.+	-> State.MaybePieceByCoordinates.MaybePieceByCoordinates x y+	-> State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x+	-> Maybe (Component.Turn.Turn x y)		-- ^ The last /turn/ made.+	-> Position x y+mkPosition nextLogicalColour maybePieceByCoordinates castleableRooksByLogicalColour maybeLastTurn	= MkPosition {+	getNextLogicalColour			= nextLogicalColour,+	getMaybePieceByCoordinates		= maybePieceByCoordinates,	-- N.B.: one could have used 'State.CoordinatesByRankByLogicalColour.CoordinatesByRankByLogicalColour', except that the coordinates have an undefined order.+	getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,+	getMaybeEnPassantAbscissa		= maybeLastTurn >>= State.EnPassantAbscissa.mkMaybeEnPassantAbscissa nextLogicalColour maybePieceByCoordinates+}+
+ src-lib/BishBosh/State/TurnsByLogicalColour.hs view
@@ -0,0 +1,164 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The ordered sequence of /turn/s made by the players of each /logical colour/.+-}++module BishBosh.State.TurnsByLogicalColour(+-- * Types+-- ** Type-synonyms+--	Transformation+-- ** Data-types+	TurnsByLogicalColour(+--		MkTurnsByLogicalColour,+--		getTurnsByLogicalColour,+		getNPlies+	),+-- * Functions+	inferNextLogicalColour,+	countPlies,+	dereference,+-- ** Constructors+	fromAssocs,+-- ** Mutators+	update,+	prepend+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!), (//))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	BishBosh.Property.Empty			as Property.Empty+import qualified	BishBosh.Property.Null			as Property.Null+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List.Extra++-- | The type used to hold a record of each player's /turn/s.+data TurnsByLogicalColour turn	= MkTurnsByLogicalColour {+	getTurnsByLogicalColour	:: Attribute.LogicalColour.ByLogicalColour [turn],+	getNPlies		:: Component.Move.NPlies	-- ^ The number of plies applied to the game; this could alternatively be derived using 'countPlies'.+}++instance Eq turn => Eq (TurnsByLogicalColour turn) where+	MkTurnsByLogicalColour { getTurnsByLogicalColour = aL } == MkTurnsByLogicalColour { getTurnsByLogicalColour = aR }	= aL == aR++instance (Read turn, Show turn) => Read (TurnsByLogicalColour turn) where+	readsPrec _ s	= Control.Arrow.first fromAssocs `map` reads s++instance Show turn => Show (TurnsByLogicalColour turn) where+	showsPrec _ MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour }	= shows $ Data.Array.IArray.assocs byLogicalColour++instance Control.DeepSeq.NFData turn => Control.DeepSeq.NFData (TurnsByLogicalColour turn) where+	rnf MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour }	= Control.DeepSeq.rnf byLogicalColour++instance Data.Default.Default (TurnsByLogicalColour turn) where+	def = MkTurnsByLogicalColour {+		getTurnsByLogicalColour	= Attribute.LogicalColour.listArrayByLogicalColour $ repeat [],+		getNPlies		= 0+	}++instance Property.Empty.Empty (TurnsByLogicalColour turn) where+	empty	= Data.Default.def++instance Property.Null.Null (TurnsByLogicalColour turn) where+	isNull MkTurnsByLogicalColour { getNPlies = 0 }	= True+	isNull _					= False++instance Property.Reflectable.ReflectableOnX turn => Property.Reflectable.ReflectableOnX (TurnsByLogicalColour turn) where+	reflectOnX turnsByLogicalColour@MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour }	= turnsByLogicalColour {+		getTurnsByLogicalColour	= Data.Array.IArray.array (minBound, maxBound) . map (+			Property.Opposable.getOpposite {-logical colour-} *** map Property.Reflectable.reflectOnX {-turn-}+		) $ Data.Array.IArray.assocs byLogicalColour+	 }++-- | Smart constructor.+fromAssocs :: Show turn => [(Attribute.LogicalColour.LogicalColour, [turn])] -> TurnsByLogicalColour turn+fromAssocs assocs+	| length assocs /= Attribute.LogicalColour.nDistinctLogicalColours	= Control.Exception.throw . Data.Exception.mkInsufficientData . showString "BishBosh.State.TurnsByLogicalColour.fromAssocs:\tboth logical colours must be defined; " $ shows assocs "."+	| Data.List.Extra.anySame $ map fst {-logicalColour-} assocs		= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.State.TurnsByLogicalColour.fromAssocs:\tduplicates specified; " $ shows assocs "."+	| (> 1) . abs {-allow for Property.Reflectable.reflectOnX-} . uncurry (-) $ (+		length . (! Attribute.LogicalColour.White) &&& length . (! Attribute.LogicalColour.Black)+	) byLogicalColour							= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.State.TurnsByLogicalColour.fromAssocs:\tany difference in the number of turns taken by each player, can't exceed one " $ shows assocs "."+	| otherwise	= turnsByLogicalColour+	where+		byLogicalColour		= Data.Array.IArray.array (minBound, maxBound) assocs+		turnsByLogicalColour	= MkTurnsByLogicalColour {+			getTurnsByLogicalColour	= byLogicalColour,+			getNPlies		= countPlies turnsByLogicalColour	-- Infer.+		}++{- |+	* Derive the /logical colour/ of the next player to move.++	* CAVEAT: the result can't be guaranteed if 'Property.Reflectable.reflectOnX' has been called.+-}+inferNextLogicalColour :: TurnsByLogicalColour turn -> Attribute.LogicalColour.LogicalColour+inferNextLogicalColour MkTurnsByLogicalColour { getNPlies = nPlies }+	| even nPlies	= Attribute.LogicalColour.White+	| otherwise	= Attribute.LogicalColour.Black++{- |+	* Count the number of plies.++	* N.B.: 'getNPlies' is more efficient.+-}+countPlies :: TurnsByLogicalColour turn -> Component.Move.NPlies+countPlies MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour }	= Data.Foldable.foldl' (\acc -> (+ acc) . length) 0 byLogicalColour++-- | Dereference.+dereference :: Attribute.LogicalColour.LogicalColour -> TurnsByLogicalColour turn -> [turn]+dereference logicalColour MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour }	= byLogicalColour ! logicalColour++-- | Update.+update :: TurnsByLogicalColour turn -> [(Attribute.LogicalColour.LogicalColour, [turn])] -> TurnsByLogicalColour turn+update MkTurnsByLogicalColour { getTurnsByLogicalColour = byLogicalColour } assocs	= turnsByLogicalColour where+	turnsByLogicalColour	= MkTurnsByLogicalColour {+		getTurnsByLogicalColour	= byLogicalColour // assocs,+		getNPlies		= countPlies turnsByLogicalColour	-- Infer.+	}++-- | Self-documentation.+type Transformation turn	= TurnsByLogicalColour turn -> TurnsByLogicalColour turn++-- | Prepend the specified /turn/.+prepend :: Attribute.LogicalColour.LogicalColour -> turn -> Transformation turn+prepend logicalColour turn MkTurnsByLogicalColour {+	getTurnsByLogicalColour	= byLogicalColour,+	getNPlies		= nPlies+} = MkTurnsByLogicalColour {+	getTurnsByLogicalColour	= byLogicalColour // [+		(+			logicalColour,+			turn : byLogicalColour ! logicalColour+		) -- Pair.+	], -- Singleton.+	getNPlies	= succ nPlies+}+
+ src-lib/BishBosh/Text/Poly.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Exports functions to enhance the package 'polyparse'.+-}++module BishBosh.Text.Poly(+-- * Types+-- ** Type-synonyms+	TextParser,+-- * Functions+	char,+	string,+	spaces,+	unsignedDecimal,+) where++import qualified	BishBosh.Data.Integral			as Data.Integral+import qualified	Data.Char++#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif++-- | Self-documentation.+type TextParser	= Poly.Parser Char++-- | Matches the specified char.+char :: Char -> TextParser ()+char c	= do+	_	<- Poly.satisfyMsg (== c) [c]++	return {-to Parser-monad-} ()++{- |+	* Matches the specified string.++	* N.B. this differs from /Text.Parse.word/ in that there's no requirement for the string to be a single Haskell lexical token.+-}+string :: String -> TextParser ()+string	= mapM_ char++{- |+	* Matches any number (including zero) of consecutive spaces.++	* CAVEAT: performance-hotspot.+-}+spaces :: TextParser ()+-- spaces	= Control.Monad.void . Poly.many $ Poly.satisfy Data.Char.isSpace	-- CAVEAT: poor performance ?!+spaces	= do+	_	<- Poly.many $ Poly.satisfy Data.Char.isSpace++	return {-to Parser-monad-} ()++-- | Parses an unsigned decimal integer.+unsignedDecimal :: Num i => TextParser i+unsignedDecimal	= spaces >> Data.Integral.stringToUnsignedDecimal `fmap` Poly.many1 (Poly.satisfyMsg Data.Char.isDigit "<digit>")+
+ src-lib/BishBosh/Text/ShowList.hs view
@@ -0,0 +1,122 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Exports functions to facilitate unification of the style of output text.+-}++module BishBosh.Text.ShowList(+-- * Constants+	showsInfoPrefix,+	showsWarningPrefix,+	showsErrorPrefix,+	showsAssociation,+-- * Functions+	capitaliseInitial,+	showsSeparator,+	showsDelimitedList,+	showsUnterminatedList,+	showsFormattedList,+	showsFormattedList',+	showsAssociationList,+	showsAssociationList',+	splitOn+) where++import qualified	Data.Char+import qualified	Data.List++-- | Used to qualify output.+showsInfoPrefix :: ShowS+showsInfoPrefix		= showString "INFO:\t"++-- | Used to qualify output.+showsWarningPrefix :: ShowS+showsWarningPrefix	= showString "WARNING:\t"++-- | Used to qualify output.+showsErrorPrefix :: ShowS+showsErrorPrefix	= showString "ERROR:\t"++-- | Used to separate an identifier & the it's value.+showsAssociation :: ShowS+showsAssociation	= showString " = "++-- | Capitalise the initial letter of the specified string.+capitaliseInitial :: ShowS+capitaliseInitial (c : cs)	= Data.Char.toUpper c : cs+capitaliseInitial _		= []++-- | Used to separate the items of a list.+showsSeparator :: ShowS+showsSeparator	= showString ", "++-- | Shows a list with the specified delimiters.+showsDelimitedList+	:: ShowS	-- ^ The list-separator.+	-> ShowS	-- ^ Left delimiter.+	-> ShowS	-- ^ Right delimiter.+	-> [ShowS]+	-> ShowS+showsDelimitedList separator lDelimiter rDelimiter	= foldr (.) rDelimiter . (lDelimiter :) . Data.List.intersperse separator++-- | Shows a list without terminal delimiters.+showsUnterminatedList :: [ShowS] -> ShowS+showsUnterminatedList	= showsDelimitedList showsSeparator id id++-- | Formats & shows a list with standard terminal delimiters.+showsFormattedList+	:: ShowS	-- ^ The list-separator.+	-> (a -> ShowS)	-- ^ Format the list-elements.+	-> [a]		-- ^ An arbitrary list of items.+	-> ShowS+showsFormattedList separator f	= showsDelimitedList separator (showChar '[') (showChar ']') . map f++-- | Formats & shows a list with standard delimiters.+showsFormattedList'+	:: (a -> ShowS)	-- ^ Format the list-elements.+	-> [a]		-- ^ An arbitrary list of items.+	-> ShowS+showsFormattedList'	= showsFormattedList showsSeparator++-- | Shows an association-list with standard terminal delimiters.+showsAssociationList+	:: ShowS	-- ^ The list-separator.+	-> [(String, ShowS)]+	-> ShowS+showsAssociationList separator	= showsDelimitedList separator (showChar '{') (showChar '}') . map (+	\(k, v) -> showString k . showsAssociation . v+ )++-- | Shows an association-list with standard delimiters.+showsAssociationList' :: [(String, ShowS)] -> ShowS+showsAssociationList'	= showsAssociationList showsSeparator++{- |+	Split the specified list, using the predicate to identify the separator.++	CAVEAT: the separator isn't included in the results.+-}+splitOn :: (a -> Bool) -> [a] -> [[a]]+splitOn _ []		= []+splitOn predicate l	= case break predicate l of+	(chunk, _ : l')	-> chunk : splitOn predicate l'	-- Recurse.+	(chunk, [])	-> [chunk]+
+ src-lib/BishBosh/Types.hs view
@@ -0,0 +1,112 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines suitable concrete types with which to specialise type-parameters.++	* CAVEAT: use of the narrow set of numeric types, results in marginally slower performance without any reduction in space-requirements.+-}++module BishBosh.Types(+-- * Types+-- ** Type-synonyms+	CriterionWeight,+	CriterionValue,+	WeightedMean,+	X,+	Y,+	Distance,+	RankValue,+	PieceSquareValue,+	PositionHash,+	RadiusSquared+) where++import qualified	Data.Word++#ifdef USE_NARROW_NUMBERS+import qualified	Data.Int+#endif++-- | The preferred type by which to weight criteria.+type CriterionWeight	=+#ifdef USE_NARROW_NUMBERS+	Float+#else+	Double	-- N.B.: 'Rational' is more accurate, but slower alternative.+#endif++-- | The preferred type by which to value criteria.+type CriterionValue	= CriterionWeight++-- | The preferred type by which to represent fitness.+type WeightedMean	= CriterionValue++-- | The preferred type by which to represent the abscissa. CAVEAT: while conceptually unsigned, various unguarded calls to 'pred' prevent this.+type X	=+#ifdef USE_NARROW_NUMBERS+	Data.Int.Int8+#else+	Int+#endif++-- | The preferred type by which to represent the ordinate.+type Y	= X	-- N.B.: it can be independent of 'X'.++{- |+	* The preferred type by which to represent the signed distance of a move.++	* N.B.: since /distance/ is used to represent only the horizontal or vertical component of a move, rather than a diagonal length, it can be represented by an integral value.+-}+type Distance	= X	-- N.B.: conceptually independent of both 'X' & 'Y' which could be unsigned.++-- | The preferred type by which to represent the value of a /rank/.+type RankValue	= CriterionValue++{- |+	* The preferred type by which to represent a /piece-square/ value.++	* CAVEAT: performance of 'BishBosh.Evaluation.Fitness.interpolatePieceSquareValues' suffers from use of 'Rational'.+-}+type PieceSquareValue	= CriterionValue++-- | The type of the hash used to uniquely represent a /position/.+type PositionHash	=+#ifdef USE_NARROW_NUMBERS+	Data.Word.Word32	-- CAVEAT: hash-collisions become almost inevitable after (sqrt bits) trials.+#else+	Data.Word.Word+#endif++{- |+	* The preferred type by which to represent the square of the radius of a coordinate, from the centre of the board.++	* N.B. for efficiency, @ radius ^ 2 @ is measured, to avoid the need to call 'sqrt'.+-}+type RadiusSquared	=+#ifdef USE_NARROW_NUMBERS+	Float+#else+	Double+#endif+
+ src-lib/BishBosh/UI/Command.hs view
@@ -0,0 +1,245 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the commands a user can issue.+-}++module BishBosh.UI.Command (+-- * Types+-- ** Data-types+	Command(..),+-- * Constants+	commandPrefix,+--	hintTag,+	printTag,+--	quitTag,+--	resignTag,+--	restartTag,+--	rollBackTag,+--	saveTag,+	setTag,+--	swapTag,+--	alternationTag,+--	printArgs,+--	setArgs,+--	commands,+	usageMessage,+-- * Functions+	readsCommand,+	showsCommand,+	autoComplete+ ) where++import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Input.Options		as Input.Options+import qualified	BishBosh.Input.SearchOptions	as Input.SearchOptions+import qualified	BishBosh.UI.PrintObject		as UI.PrintObject+import qualified	BishBosh.UI.SetObject		as UI.SetObject+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Char+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Text.Printf++-- | Used to distinguish a command from a move.+commandPrefix :: Char+commandPrefix	= ':'++-- | Input-format.+hintTag :: String+hintTag		= "hint"++-- | Input-format.+printTag :: String+printTag	= "print"++-- | Input-format.+quitTag :: String+quitTag		= "quit"++-- | Input-format.+resignTag :: String+resignTag	= "resign"++-- | Input-format.+restartTag :: String+restartTag	= "restart"++-- | Input-format.+rollBackTag :: String+rollBackTag	= "rollBack"++-- | Input-format.+saveTag :: String+saveTag		= "save"++-- | Input-format.+setTag :: String+setTag		= "set"++-- | Input-format.+swapTag :: String+swapTag		= "swap"++-- | The symbol used to denote alternation.+alternationTag :: String+alternationTag	= "|"++-- | Show the arguments of a command.+printArgs :: String+printArgs	= Data.List.intercalate alternationTag $ map show UI.PrintObject.range++-- | The format of the argument to the command 'set'.+setArgs :: String+setArgs	= Data.List.intercalate alternationTag [+	showString Input.SearchOptions.searchDepthTag " <Int>"+ ]++-- | The commands that a user may issue.+data Command x y+	= Hint						-- ^ Request a move-suggestion.+	| Print UI.PrintObject.PrintObject		-- ^ Show the value of the specified object.+	| Quit						-- ^ Terminate ths application.+	| Resign					-- ^ Admit defeat.+	| Restart					-- ^ Abandon the current game, & start afresh.+	| RollBack (Maybe Component.Move.NMoves)	-- ^ Roll-back the specified number of plies.+	| Save						-- ^ Persist the current game-state.+	| Set UI.SetObject.SetObject			-- ^ I.E. mutate a configuration-value.+	| Swap						-- ^ Swap evaluation-options between the two sides.+	deriving (Eq, Show)++instance Control.DeepSeq.NFData (Command x y) where+	rnf (Print printObject)	= Control.DeepSeq.rnf printObject+	rnf (Set setObject)	= Control.DeepSeq.rnf setObject+	rnf _			= ()++-- | The data required to compose the usage-message for the available /command/s.+commands :: [(String, Maybe String, String)]+commands	= [+	(+		hintTag,+		Nothing,+		"Request a move-suggestion"+	), (+		printTag,+		Just printArgs,+		"Print the specified data"+	), (+		quitTag,+		Nothing,+		"Quit"+	), (+		resignTag,+		Nothing,+		"Resign"+	), (+		restartTag,+		Nothing,+		"Restart the game, preserving the current configuration"+	), (+		rollBackTag,+		Just "[<Int>]",+		"The number of plies to roll-back"+	), (+		saveTag,+		Nothing,+		"Save"+	), (+		setTag,+		Just setArgs,+		showString "Mutate " Input.Options.tag+	), (+		swapTag,+		Nothing,+		showString "Swap " $ shows Input.Options.tag " between the two sides"+	)+ ]++-- | A message defining the syntax of the available /command/s.+usageMessage :: String+usageMessage	= showString (+	Text.Printf.printf (showString indent $ showChar ' ' format) commandFieldWidth "Command" objectFieldWidth "Object" "Definition"+ ) $ concatMap (+	\(command, maybeArg, definition)	-> Text.Printf.printf (+		showChar '\n' . showString indent . showChar commandPrefix $ showString format "."+	) commandFieldWidth command objectFieldWidth (+		Data.Maybe.fromMaybe "" maybeArg+	) definition+ ) commands where+	indent, format :: String+	indent	= replicate 2 ' '+	format	= "%-*s%-*s%s"++	commandFieldWidth, objectFieldWidth :: Int+	commandFieldWidth	= succ . maximum $ map (\(tag, _, _) -> length tag) commands+	objectFieldWidth	= succ $ maximum [length arg | (_, Just arg, _) <- commands]++-- | Reads a /command/.+readsCommand :: String -> Either String (Command x y, String)+readsCommand s	= case Control.Arrow.first Data.List.Extra.lower `map` lex s of+	[("hint", s')]		-> Right (Hint, s')+	[("help", s')]		-> Right (Print UI.PrintObject.Help, s')	-- Include a specific abbreviation.+	[("print", s')]		-> case reads $ UI.PrintObject.autoComplete s' of+		[pair]	-> Right $ Control.Arrow.first Print pair+		_	-> Left . showString "failed to read the object to " . showString printTag . showString " from " . shows s' . showString ". Usage: \"" . showChar commandPrefix . showString printTag . showChar ' ' $ showString printArgs "\""+	[("quit", s')]		-> Right (Quit, s')+	[("resign", s')]	-> Right (Resign, s')+	[("restart", s')]	-> Right (Restart, s')+	[("save", s')]		-> Right (Save, s')+	[("set", s')]		-> case reads $ UI.SetObject.autoComplete s' of+		[pair]	-> Right $ Control.Arrow.first Set pair+		_	-> Left . showString "failed to read the object to " . showString setTag . showString " from " . shows s' . showString ". Usage: \"" . showChar commandPrefix . showString setTag . showString " (" $ showString setArgs ")\""+	[("rollback", s')]	-> case Data.List.Extra.trimStart s' of+		[]	-> Right (RollBack Nothing, s')+		s''	-> case reads s'' of+			[(nMoves, s''')]	-> Right (RollBack (Just nMoves), s''')+			_			-> Left . showString "failed to read the integral number of moves to " . showString rollBackTag . showString " from " $ show s''+	[("swap", s')]		-> Right (Swap, s')+	[]			-> Left "no command received"+	_			-> Left . showString "failed to read a command from " $ show s++-- | Shows a /command/.+showsCommand :: Command x y -> ShowS+showsCommand command	= case command of+	Hint			-> showString hintTag+	Print printObject	-> showString printTag . showChar ' ' . shows printObject+	Quit			-> showString quitTag+	Resign			-> showString resignTag+	Restart			-> showString restartTag+	RollBack maybeNMoves	-> showString rollBackTag . Data.Maybe.maybe id (\nMoves -> showChar ' ' . shows nMoves) maybeNMoves+	Save			-> showString saveTag+	Set setObject		-> showString setTag . showChar ' ' . shows setObject+	Swap			-> showString swapTag++-- | Replace the first word of the specified string with the name of a command of which it is an unambiguous case-insensitive prefix.+autoComplete :: ShowS+autoComplete	= uncurry (++) . Control.Arrow.first (+	\word -> case [+		tag |+			(tag, _, _)	<- ("help", Nothing, "") : commands,+			Data.List.Extra.lower word `Data.List.isPrefixOf` Data.List.Extra.lower tag+	] of+		[tag]	-> tag+		_	-> word+ ) . break Data.Char.isSpace . Data.List.Extra.trimStart+
+ src-lib/BishBosh/UI/PrintObject.hs view
@@ -0,0 +1,133 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the things a user can print.+-}++module BishBosh.UI.PrintObject (+-- * Types+-- ** Data-types+	PrintObject(..),+-- * Constants+	boardTag,+	configurationTag,+	fenTag,+	gameTag,+	helpTag,+	movesTag,+	pgnTag,+	range,+-- * Functions+	autoComplete+ ) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Char+import qualified	Data.List+import qualified	Data.List.Extra++-- | Input-format.+boardTag :: String+boardTag		= "board"++-- | Input-format.+configurationTag :: String+configurationTag	= "configuration"++-- | Input-format.+fenTag :: String+fenTag			= "fen"++-- | Input-format.+gameTag :: String+gameTag			= "game"++-- | Input-format.+helpTag :: String+helpTag			= "help"++-- | Input-format.+movesTag :: String+movesTag		= "moves"++-- | Input-format.+pgnTag :: String+pgnTag			= "pgn"++-- | The type of an object that the user may want to be printed.+data PrintObject+	= Board+	| Configuration+	| FEN+	| Game+	| Help+	| Moves+	| PGN+	deriving Eq++instance Control.DeepSeq.NFData PrintObject where+	rnf _	= ()++instance Show PrintObject where+	showsPrec _ printObject	= showString $ case printObject of+		Board		-> boardTag+		Configuration	-> configurationTag+		FEN		-> fenTag+		Game		-> gameTag+		Help		-> helpTag+		Moves		-> movesTag+		PGN		-> pgnTag++instance Read PrintObject where+	readsPrec _ s	= case Control.Arrow.first Data.List.Extra.lower `map` lex s of+		[("board", remainder)]		-> [(Board, remainder)]+		[("configuration", remainder)]	-> [(Configuration, remainder)]+		[("fen", remainder)]		-> [(FEN, remainder)]+		[("game", remainder)]		-> [(Game, remainder)]+		[("help", remainder)]		-> [(Help, remainder)]+		[("moves", remainder)]		-> [(Moves, remainder)]+		[("pgn", remainder)]		-> [(PGN, remainder)]+		_				-> []	-- No parse.++-- | The constant unordered list of possible values.+range :: [PrintObject]+range	= [Board, Configuration, FEN, Game, Help, Moves, PGN]++-- | Replace the first word of the specified string with the name of a command of which it is an unambiguous case-insensitive prefix.+autoComplete :: ShowS+autoComplete	= uncurry (++) . Control.Arrow.first (+	\word -> case [+		tag |+			tag	<- [+				boardTag,+				configurationTag,+				fenTag,+				gameTag,+				helpTag,+				movesTag+			],+			Data.List.Extra.lower word `Data.List.isPrefixOf` Data.List.Extra.lower tag+	] of+		[tag]	-> tag+		_	-> word+ ) . break Data.Char.isSpace . Data.List.Extra.trimStart+
+ src-lib/BishBosh/UI/SetObject.hs view
@@ -0,0 +1,75 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the fields a user can mutate.+-}++module BishBosh.UI.SetObject (+-- * Types+-- ** Data-types+	SetObject(..),+-- * Functions+	autoComplete,+-- ** Constructors+	mkSearchDepth+ ) where++import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Input.SearchOptions	as Input.SearchOptions+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.List+import qualified	Data.List.Extra++-- | The fields a user can mutate; currently there's only one.+newtype SetObject	= SearchDepth Input.SearchOptions.SearchDepth	deriving Eq++instance Control.DeepSeq.NFData SetObject where+	rnf (SearchDepth searchDepth)		= Control.DeepSeq.rnf searchDepth++instance Show SetObject where+	showsPrec _ (SearchDepth searchDepth)	= showString Input.SearchOptions.searchDepthTag . showChar ' ' . shows searchDepth++instance Read SetObject where+	readsPrec _ s	= case Control.Arrow.first Data.List.Extra.lower `map` lex s of+		[("searchdepth", s')]		-> Control.Arrow.first mkSearchDepth `map` reads s'+		_				-> []	-- No parse.++-- | Smart constructor.+mkSearchDepth :: Input.SearchOptions.SearchDepth -> SetObject+mkSearchDepth searchDepth+	| searchDepth < Input.SearchOptions.minimumSearchDepth	= Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.UI.SetObject.mkSearchDepth:\t" $ shows Input.SearchOptions.searchDepthTag " must be positive."+	| otherwise						= SearchDepth searchDepth++-- | Replace the first word of the specified string with the name of a command of which it is an unambiguous case-insensitive prefix.+autoComplete :: ShowS+autoComplete	= uncurry (++) . Control.Arrow.first (+	\word -> case [+		tag |+			tag	<- [Input.SearchOptions.searchDepthTag],+			Data.List.Extra.lower word `Data.List.isPrefixOf` Data.List.Extra.lower tag+	] of+		[tag]	-> tag+		_	-> word+ ) . break Data.Char.isSpace . Data.List.Extra.trimStart+
+ src-test/BishBosh/Test/HUnit/Attribute/Direction.hs view
@@ -0,0 +1,46 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Attribute.Direction(+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.Direction		as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	null (+		Attribute.Direction.diagonals `Data.List.intersect` Attribute.Direction.parallels+	) ~? "BishBosh.Attribute.Direction.[diagonal, parallels] intersect.",+	all (+		(== 2) . length . Attribute.Direction.attackDirectionsForPawn+	) Attribute.LogicalColour.range ~? "'BishBosh.Attribute.Direction.attackDirectionsForPawn' failed."+ ]+
+ src-test/BishBosh/Test/HUnit/Attribute/LogicalColour.hs view
@@ -0,0 +1,40 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Attribute.LogicalColour(+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	Attribute.LogicalColour.range == Data.List.sort Attribute.LogicalColour.range ~? "BishBosh.Attribute.LogicalColour.range is misordered."+ ]+
+ src-test/BishBosh/Test/HUnit/Attribute/Rank.hs view
@@ -0,0 +1,40 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Attribute.Rank(+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.Rank	as Attribute.Rank+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	Attribute.Rank.range == Data.List.sort Attribute.Rank.range ~? "BishBosh.Attribute.Rank.range is misordered."+ ]+
+ src-test/BishBosh/Test/HUnit/Cartesian/Coordinates.hs view
@@ -0,0 +1,62 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Cartesian.Coordinates(+-- * Types+-- ** Type-synonyms+	Coordinates,+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.LogicalColourOfSquare	as Attribute.LogicalColourOfSquare+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Types					as T+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?), (~?=), (~:))++-- | Defines a concrete type for testing.+type Coordinates	= Cartesian.Coordinates.Coordinates T.X T.Y++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	all (Attribute.LogicalColourOfSquare.isBlack . Cartesian.Coordinates.getLogicalColourOfSquare) (+		Cartesian.Coordinates.extrapolate maxBound {-direction-} (minBound :: Coordinates)+	) ~? "'BishBosh.Cartesian.Coordinates.getLogicalColourOfSquare' failed to find black squares on the main diagonal.",+	"'BishBosh.Cartesian.Coordinates.getLogicalColourOfSquare' failed to count equal numbers of black & white squares." ~: (+		\(black, white) -> length black ~?= length white+	) . Data.List.partition Attribute.LogicalColourOfSquare.isBlack $ map Cartesian.Coordinates.getLogicalColourOfSquare (+		Cartesian.Coordinates.range	:: [Coordinates]+	),+	"'BishBosh.Cartesian.Coordinates.range' failed to visit all squares." ~: length (+		Cartesian.Coordinates.range	:: [Coordinates]+	) ~?= Cartesian.Coordinates.nSquares,+	"instance 'Data.Array.IArray.Ix Coordinates' is incompatible with instance 'Ord Coordinates'." ~: Data.Array.IArray.indices (+		Cartesian.Coordinates.listArrayByCoordinates [0 .. ]	:: Cartesian.Coordinates.ByCoordinates T.X T.Y Int+	) ~?= Cartesian.Coordinates.range+ ]+
+ src-test/BishBosh/Test/HUnit/Cartesian/Vector.hs view
@@ -0,0 +1,71 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Cartesian.Vector(+-- * Constants+	testCases+-- * Functions+--	measureLength+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector+import qualified	BishBosh.Types				as T+import qualified	Data.Maybe+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Sum the absolute value of /x/ & /y/ distances.+measureLength :: Cartesian.Vector.VectorInt -> T.Distance+measureLength	= uncurry (+) . (abs . Cartesian.Vector.getXDistance &&& abs . Cartesian.Vector.getYDistance)++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	all (+		Data.Maybe.isJust . Cartesian.Vector.toMaybeDirection+	) (+		Cartesian.Vector.attackVectorsForKing	:: [Cartesian.Vector.VectorInt]+	) ~? "'BishBosh.Cartesian.Vector.attackVectorsForKing' failed.",+	all (+		Data.Maybe.isNothing . Cartesian.Vector.toMaybeDirection+	) (+		Cartesian.Vector.attackVectorsForKnight	:: [Cartesian.Vector.VectorInt]+	) ~? "'BishBosh.Cartesian.Vector.attackVectorsForKnight' failed.",+	all (+		uncurry (&&) . (+			all ((== 2) . measureLength) &&& (== 2) . length+		) . Cartesian.Vector.attackVectorsForPawn+	) Attribute.LogicalColour.range ~? "'BishBosh.Cartesian.Vector.attackVectorsForPawn' failed.",+	uncurry (&&) (+		(+			all ((== 3) . measureLength) &&& (== 8) . length+		) Cartesian.Vector.attackVectorsForKnight+	) ~? "'BishBosh.Cartesian.Vector.attackVectorsForKnight'.",+	all (+		(`elem` [1, 2]) . measureLength+	) Cartesian.Vector.attackVectorsForKing ~? "'BishBosh.Cartesian.Vector.attackVectorsForKing' should all be of length 1 or 2."+ ]+
+ src-test/BishBosh/Test/HUnit/Component/Move.hs view
@@ -0,0 +1,81 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Component.Move(+-- * Types+-- ** Type-synonyms+	Move,+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.Direction		as Attribute.Direction+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Notation.Smith			as Notation.Smith+import qualified	BishBosh.Types				as T+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Defines a concrete type for testing.+type Move	= Component.Move.Move T.X T.Y++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	all (+		\(direction, s) -> let+			move :: Move+			move	= Component.QualifiedMove.getMove . Notation.Smith.getQualifiedMove $ read s+		in Cartesian.Coordinates.extrapolate direction (Component.Move.getSource move) == Component.Move.interpolate move+	) [+		(+			Attribute.Direction.ne,	"a1h8"+		), (+			Attribute.Direction.n,	"a1a8"+		), (+			Attribute.Direction.e,	"a1h1"+		), (+			Attribute.Direction.se,	"a8h1"+		), (+			Attribute.Direction.s,	"a8a1"+		), (+			Attribute.Direction.e,	"a8h8"+		), (+			Attribute.Direction.sw,	"h8a1"+		), (+			Attribute.Direction.s,	"h8h1"+		), (+			Attribute.Direction.w,	"h8a8"+		), (+			Attribute.Direction.nw,	"h1a8"+		), (+			Attribute.Direction.n,	"h1h8"+		), (+			Attribute.Direction.w,	"h1a1"+		)+	] ~? "'BishBosh.Cartesian.Coordinates.extrapolate' is incompatible with 'BishBosh.Component.Move.interpolate'."+ ]+
+ src-test/BishBosh/Test/HUnit/Component/Piece.hs view
@@ -0,0 +1,169 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Component.Piece(+-- * Constants+	testCases+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Vector			as Cartesian.Vector+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Notation.Smith				as Notation.Smith+import qualified	BishBosh.Test.HUnit.Cartesian.Coordinates	as Test.HUnit.Cartesian.Coordinates+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?), (~?=), (~:))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	Component.Piece.range == Data.List.sort Component.Piece.range ~? "BishBosh.Component.Piece.range is misordered.",+	all (+		== Data.List.sort (Component.Piece.attackDirectionsByPiece ! Component.Piece.mkKing Attribute.LogicalColour.Black)+	) [+		Data.List.sort $ Component.Piece.attackDirectionsByPiece ! Component.Piece.mkQueen Attribute.LogicalColour.Black,+		Data.List.sort $ (+			Component.Piece.attackDirectionsByPiece ! Component.Piece.mkBishop Attribute.LogicalColour.Black+		) ++ (+			Component.Piece.attackDirectionsByPiece ! Component.Piece.mkRook Attribute.LogicalColour.Black+		)+	] ~? "'BishBosh.Component.Piece.attackDirectionsByPiece' failed to show Queen's moves to be union of Bishop & Rook.",+	"'BishBosh.Cartesian.Vector.attackVectorsForKing'." ~: (+		(+			length	:: [Cartesian.Vector.VectorInt] -> Int+		) Cartesian.Vector.attackVectorsForKing ~?= length (Component.Piece.attackDirectionsByPiece ! Component.Piece.mkKing Attribute.LogicalColour.Black)+	),+	"'BishBosh.Component.Piece.attackDirectionsByPiece' failed for King." ~: Data.List.sort (+		Component.Piece.attackDirectionsByPiece ! Component.Piece.mkKing Attribute.LogicalColour.Black {-arbitrarily-}+	) ~?= Data.List.sort Attribute.Direction.range,+	all (+		\((s, logicalColour), rank) -> let+			source, destination :: Test.HUnit.Cartesian.Coordinates.Coordinates+			(source, destination)	= (Component.Move.getSource &&& Component.Move.getDestination) . Component.QualifiedMove.getMove . Notation.Smith.getQualifiedMove $ read s+		in Component.Piece.canAttackAlong source destination $ Component.Piece.mkPiece logicalColour rank+	) (+		concat [+			[+				(+					"a2b3",	Attribute.LogicalColour.White+				), (+					"b3a4",	Attribute.LogicalColour.White+				), (+					"a7b6",	Attribute.LogicalColour.Black+				), (+					"b6a5",	Attribute.LogicalColour.Black+				)+			] `zip` repeat Attribute.Rank.Pawn,+			(+				[+					"a1c1",+					"h1f1"+				] `zip` repeat undefined+			) `zip` repeat Attribute.Rank.Rook,+			(+				[+					"a1h8",+					"h1a8",+					"h8a1",+					"a8h1"+				] `zip` repeat undefined+			) `zip` repeat Attribute.Rank.Bishop,+			[+				((source ++ destination, undefined), Attribute.Rank.Queen) |+					abscissaSource		<- "ah",+					ordinateSource		<- "18",+					let source	= [abscissaSource, ordinateSource],+					abscissaDestination	<- "ah",+					ordinateDestination	<- "18",+					let destination	= [abscissaDestination, ordinateDestination],+					source /= destination+			] {-list-comprehension-},+			[+				((source ++ destination, undefined), Attribute.Rank.King) |+					abscissaSource		<- "ab",+					ordinateSource		<- "12",+					let source	= [abscissaSource, ordinateSource],+					abscissaDestination	<- "ab",+					ordinateDestination	<- "12",+					let destination	= [abscissaDestination, ordinateDestination],+					source /= destination+			] -- List-comprehension.+		]+	) ~? "'BishBosh.Component.Piece.canAttackAlong' failed.",+	not (+		any (+			\((s, logicalColour), rank) -> let+				source, destination :: Test.HUnit.Cartesian.Coordinates.Coordinates+				(source, destination)	= (Component.Move.getSource &&& Component.Move.getDestination) . Component.QualifiedMove.getMove . Notation.Smith.getQualifiedMove $ read s+			in Component.Piece.canAttackAlong source destination $ Component.Piece.mkPiece logicalColour rank+		) $ concat [+			[+				(+					"a2a3",	Attribute.LogicalColour.White+				), (+					"a2a4",	Attribute.LogicalColour.White+				), (+					"a7a6",	Attribute.LogicalColour.Black+				), (+					"a7a5",	Attribute.LogicalColour.Black+				)+			] `zip` repeat Attribute.Rank.Pawn,+			(+				[+					"b1b2",+					"b1c2",+					"b1c1"+				] `zip` repeat undefined+			) `zip` repeat Attribute.Rank.Knight,+			(+				[+					"a1b2",+					"b2a1",+					"b2a1",+					"a1b2"+				] `zip` repeat undefined+			) `zip` repeat Attribute.Rank.Rook,+			(+				[+					"a1b1",+					"a1a2"+				] `zip` repeat undefined+			) `zip` repeat Attribute.Rank.Bishop,+			[+				((source ++ destination, undefined), Attribute.Rank.King) |+					source		<- ["a1", "a3", "c1", "c3"],+					destination	<- ["a1", "a3", "c1", "c3"],+					source /= destination+			] -- List-comprehension.+		]+	) ~? "'BishBosh.Component.Piece.canAttackAlong' validated an invalid attack."+ ]+
+ src-test/BishBosh/Test/HUnit/Component/Zobrist.hs view
@@ -0,0 +1,50 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Component.Zobrist(+-- * Types+-- ** Type-synonyms+	Zobrist,+-- * Constants+	testCases+) where++import qualified	BishBosh.Component.Zobrist	as Component.Zobrist+import qualified	BishBosh.Types			as T+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Test.HUnit+import			Test.HUnit((~:), (~?=))++-- | Defines a concrete type for testing.+type Zobrist	= Component.Zobrist.Zobrist T.X T.Y T.PositionHash++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	"'BishBosh.Component.Zobrist.Zobrist' contains the wrong number of random numbers." ~: length (+		Data.Foldable.toList (Data.Default.def :: Zobrist)+	) ~?= 781 -- <https://chessprogramming.wikispaces.com/Zobrist+Hashing>+ ]+
+ src-test/BishBosh/Test/HUnit/ContextualNotation/PGN.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.ContextualNotation.PGN(+-- * Types+-- ** Type-synonyms+--	PGN,+-- * Constants+	testCases+) where++import qualified	BishBosh.ContextualNotation.PGN		as ContextualNotation.PGN+import qualified	BishBosh.Types				as T+import qualified	Test.HUnit+import			Test.HUnit((~?))++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly			as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Data.Char+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif+#else /* Parsec */+import qualified	Text.ParserCombinators.Parsec		as Parsec+#endif++#if !defined(USE_POLYPARSE) || USE_POLYPARSE != 1+import qualified	BishBosh.Data.Exception			as Data.Exception+import qualified	Control.Exception+#endif++-- | Test-subject.+type PGN	= ContextualNotation.PGN.PGN T.X T.Y++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test $ map (+	\(isStrictlySequential, validateMoves, s) ->+#ifdef USE_POLYPARSE+#if USE_POLYPARSE == 1+	(+		\s' -> all Data.Char.isSpace s' ~? showString "Unparsed input: " (show s')+	) . snd+#else /* Plain */+	either (+		Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.ContextualNotation.PGN.testCases:\tfailed: " . show+	) (+		const $ True ~? ""+	) . fst+#endif+	$ Poly.runParser (+		ContextualNotation.PGN.parser isStrictlySequential validateMoves []	:: Text.Poly.TextParser PGN+	)+#else /* Parsec */+	either (+		Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.ContextualNotation.PGN.testCases:\tfailed: " . show+	) (+		const $ True ~? ""+	) $ Parsec.parse (+		ContextualNotation.PGN.parser isStrictlySequential validateMoves []	:: Parsec.Parser PGN+	) "PGN-parser"+#endif+	s+ ) [+	(+		True,	True,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]1.e4 c5 2.d3*"	-- Reduced white space.+	), (+		True,	True,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]\n1. e4 $0 {nag} c5 $255 {nag} *\n"	-- Numeric Annotation Glyphs.+	), (+		True,	True,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]\n1. Nf3 ( 1. d4 ) c5 ( 1... Nf6 ) 2. c4 *\n"	-- Recursive Annotation Variation.+	), (+		True,	True,	showString "[ {Tag-name} " $ showString ContextualNotation.PGN.dateTag " {Tag-value} \"2018.01.01\" {Move-sequence} ] {Game unfinished} * {Block comment} ; Line comment.\n"	-- Null move-sequence.+	), (+		True,	True,	showString "[ {Tag-name} " . showString ContextualNotation.PGN.dateTag . showString " {Tag-value} " $ ContextualNotation.PGN.showsDate (toEnum 1) " {Move-sequence} ] 1. {White move} e4 {Black won} 0-1 {Block comment} ; Line comment.\n"+	), (+		True,	True,	showString "[ {Tag-name} " $ showString ContextualNotation.PGN.dateTag " {Tag-value} \"0000.00.00\" {Move-sequence} ] 1. {White move} Nf3 {Black move} c5 {White won} 1-0 { Block comment } ; Line comment {{}}.\n"+	), (+		True,	True,	showString "{Initial comment} [ {Tag-name} " . showString ContextualNotation.PGN.dateTag . showString " {Tag-value} " $ ContextualNotation.PGN.showsDate (toEnum 2) " {Move-sequence} ] 1. {White move} Nc3 {Black move} e6 {Draw} 1/2-1/2 {Block ; comment} ; Line comment.\n\n"+	), (+		True,	True,	showString "{} [ {} " . showString ContextualNotation.PGN.dateTag . showString " {} " $ ContextualNotation.PGN.showsDate (toEnum 3) " {Move-sequence} ] 1. { } Nc3 {\t} e6 {} 1/2-1/2 {} ;"	-- Null comments.+	), (+		True,	True,	showString ";Line comment 1.\n;Line comment 2.\n[" . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 4) "];Line comment 3.\n;Line comment 4.\n1. Nc3 e6 *;Line comment 5.\n;Line comment 6.\n"	-- Multiple line-comments.+	), (+		True,	True,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]\n1. e4 1... c5 *\n"	-- Black move-number.+	), (+		True,	True,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]\n1. Nf3 c5 2. c4 b6 3. Nc3 Bb7 4. e4 Nf6 $6 5. e5 Ng8 6. d4 Bxf3 7. Qxf3 ( 7. gxf3 cxd4 8. Qxd4 Nc6 9. Qe4 e6 10. f4 $14 { Pelletier-Adler, Schweiz 2000 ( ? )} ) 7... Nc6 8. d5 $5 ( 8. dxc5 bxc5 9. Qe4 Qb8 $5 ) 8... Nxe5 9. Qe2 d6 10. f4 Nd7 11. g3 g6 12. Bh3 Ngf6 ( 12... Bg7 13. Bd2 Nh6 14. O-O ) 13. Bd2 Bg7 14. O-O O-O 15. g4 ( 15. Rae1 Re8 16. g4 e6 17. dxe6 Rxe6 18. Qd3 $44 ) 15... h6 16. Rae1 a6 ( 16... Re8 17. g5 $6 ( 17. Kh1 ) 17... hxg5 18. fxg5 Nh7 19. Rxf7 $2 Bd4+ ) 17. a4 ( 17. Qxe7 Qxe7 18. Rxe7 Rfe8 19. Rfe1 Rxe7 20. Rxe7 Kf8 21. Re1 Ra7 $14 ) 17... b5 ( 17... Re8 18. Kh1 $44 ) 18. axb5 axb5 19. cxb5 Nb6 20. Bg2 Ra7 21. g5 hxg5 22. f5 $1 Nbd7 23. fxg6 fxg6 24. Bxg5 ( 24. Qxe7 Qxe7 25. Rxe7 $16 ) ( 24. Qe6+ Kh7 25. Ne4 $6 Nxe4 26. Bxe4 Bd4+ 27. Kg2 Nf6 28. Bxg5 $14 ) 24... Ne5 25. Bh3 Kh7 26. Be6 Bh6 27. Bxh6 Kxh6 28. Rf4 $2 ( 28. b4 $1 $18 ) 28... Ra8 29. Ref1 Kg7 30. Ne4 Qb6 31. Ng3 Nh7 32. Qg2 Qxb5 33. h4 Kh8 $138 34. h5 Rxf4 35. Rxf4 Ra1+ 36. Kh2 g5 $19 37. Rf2 Nf6 38. Ne4 Qc4 39. Bf5 ( 39. Nxf6 Qh4+ 40. Bh3 exf6 $19 ) ( 39. Qxg5 Qxe4 40. Qh6+ Qh7 41. Rxf6 Qxh6 42. Rxh6+ Kg7 $19 ) ( 39. h6 Qxe4 40. Qxe4 Nxe4 41. Rf8+ Kh7 42. Bf5+ Kxh6 43. Bxe4 Ra4 $19 ) 39... Neg4+ $2 ( 39... Qd4 $19 ) 40. Bxg4 Qxe4 41. Qxe4 Nxe4 42. Rf7 Nf6 43. Be6 ( 43. Bf5 Rf1 ) 43... Nxh5 44. Rxe7 Rd1 $2 ( 44... Nf6 45. Rf7 Rf1 46. Kg2 Rf4 $17 ) 45. Rd7 Nf4 ( 45... Rd2+ 46. Kh3 Nf4+ 47. Kg4 Nxd5 48. Kxg5 $11 ) 46. Rxd6 Nxe6 47. Rxe6 Rxd5 48. Re4 Rd2+ ( 48... Kg7 49. b4 Rd4 50. Rxd4 cxd4 51. b5 $11 ) 49. Kg3 Rxb2 50. Re5 1/2-1/2"+	), (+		True,	False,	showChar '[' . showString ContextualNotation.PGN.dateTag $ ContextualNotation.PGN.showsDate (toEnum 0) "]\n1. d4 Nf6 2. c4 e6 3. Nf3 b6 4. g3 Ba6 5. Qa4 Bb7 6. Bg2 c5 7. dxc5 Bxc5 8. O-O O-O 9. Nc3 Be7 10. Bf4 Na6 11. Rfd1 Nc5 12. Qc2 Qc8 13. Rac1 Nce4 14. Nd4 Nxc3 15. Qxc3 a6 16. Qb3 Bxg2 17. Kxg2 Qb7+ 18. Qf3 Ra7 19. Qxb7 Rxb7 20. f3 Rc8 21. e4 d6 22. Ne2 Rc6 23. b3 h6 24. h4 Nd7 25. Rd2 Ne5 26. Be3 h5 27. f4 Ng4 28. Bg1 g6 29. Kf3 Bf8 30. Rdc2 Rc8 31. b4 Nf6 32. Nd4 e5 33. Nb3 Nd7 34. a3 Rbc7 35. Be3 Be7 36. Bf2 f5 37. exf5 gxf5 38. Ke2 Kf7 39. Nd2 b5 40. fxe5 Nxe5 41. c5 dxc5 42. Bxc5 Bxc5 43. Rxc5 Rxc5 44. Rxc5 Rxc5 45. bxc5 Ke6 46. Ke3 a5 47. Nb3 Nc6 48. Kf4 Kf6 49. Nc1 b4 50. axb4 Nxb4 51. Ke3 a4 52. Kd4 a3 53. Kc3 a2 54. Nb3 Na6 55. Kb2 Ke5 56. Kxa2 f4 57. gxf4+ Kxf4 58. Ka3 Nxc5 59. Nxc5 Kg4 60. Ne4 Kxh4 61. Nf6 Kg5 62. Nxh5 {insufficient material} Kxh5 1/2-1/2"+	)+ ]+
+ src-test/BishBosh/Test/HUnit/ContextualNotation/PositionHashQualifiedMoveTree.hs view
@@ -0,0 +1,102 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.ContextualNotation.PositionHashQualifiedMoveTree(+-- * Constants+	testCases+) where++import qualified	BishBosh.Component.EitherQualifiedMove				as Component.EitherQualifiedMove+import qualified	BishBosh.Component.Move						as Component.Move+import qualified	BishBosh.Component.QualifiedMove				as Component.QualifiedMove+import qualified	BishBosh.Component.Turn						as Component.Turn+import qualified	BishBosh.Component.Zobrist					as Component.Zobrist+import qualified	BishBosh.ContextualNotation.PGN					as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PositionHashQualifiedMoveTree	as ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest			as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Data.Exception						as Data.Exception+import qualified	BishBosh.Input.StandardOpeningOptions				as Input.StandardOpeningOptions+import qualified	BishBosh.Model.Game						as Model.Game+import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.Reflectable					as Property.Reflectable+import qualified	BishBosh.Test.HUnit.Component.Move				as Test.HUnit.Component.Move+import qualified	BishBosh.Test.HUnit.Model.Game					as Test.HUnit.Model.Game+import qualified	BishBosh.Text.ShowList						as Text.ShowList+import qualified	BishBosh.Types							as T+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Test.HUnit+import			Test.HUnit((~:), (~?=))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves" ~: checkMatch (True, False, False) sicilianDragon "e2e4 c7c5 g1f3 d7d6 d2d4 c5d4p f3d4p g8f6 b1c3" finalMove,		-- Exact match for standard-opening.+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves/transposition" ~: checkMatch (False, False, False) sicilianDragon "e2e4 c7c5 d2d4 c5d4p g1f3 d7d6 f3d4p g8f6 b1c3" finalMove,	-- White's 2nd & 3rd moves have been transposed & Black's 2nd & 3rd move also have been transposed.+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves/join" ~: checkMatch (False, True {-TryToMatchViaJoiningMove-}, False) sicilianDragon "e2e4 c7c5 g1f3 d7d6 d2d4 c5d4p b1c3 g8f6" (+		standardOpeningMoves !! 6+	), -- White still has to make the 2nd last move.+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves/colourFlip" ~: checkMatch (False, False, True {-TryToMatchColourFlippedPosition-}) sicilianDragon "c2c3 e7e5 c3c4 g8f6 d2d3 d7d5 c4d5p f6d5p g1f3 b8c6" (+		Property.Reflectable.reflectOnX finalMove+	), -- White's first two moves are achievable in only one.+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves/colourFlip/transposition" ~: checkMatch (False, False, True {-TryToMatchColourFlippedPosition-}) sicilianDragon "c2c3 g8f6 c3c4 e7e5 d2d3 d7d5 c4d5p f6d5p g1f3 b8c6" (+		Property.Reflectable.reflectOnX finalMove+	), -- White's first two moves are achievable in only one & Black's first two moves have been transposed.+	"ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves/colourFlip/join" ~: checkMatch (False, True, True) (+		mkGame $ showString sicilianDragonString " f2f3"	-- Append a move after the match.+	) "c2c3 g8f6 c3c4 e7e5 d2d3 d7d5 c4d5p f6d5p g2g3 b8c6" . Component.EitherQualifiedMove.getMove . fst . head $ Notation.MoveNotation.readsQualifiedMove Data.Default.def "g1f3"+ ] where+	mkGame :: String -> Test.HUnit.Model.Game.Game+	mkGame	= either (+		\(moveString, errorMessage)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.ContextualNotation.QualifiedMoveForest.testCases:\tfailed for " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows moveString . showString "; " $ showString errorMessage "."+	 ) id . Test.HUnit.Model.Game.applyMoves . words++	sicilianDragonString	= "e2e4 c7c5 g1f3 d7d6 d2d4 c5d4p f3d4p g8f6 b1c3 g7g6"++	sicilianDragon :: Test.HUnit.Model.Game.Game+	sicilianDragon	= mkGame sicilianDragonString++	standardOpeningMoves	= map (Component.QualifiedMove.getMove . Component.Turn.getQualifiedMove) $ Model.Game.listTurnsChronologically sicilianDragon+	finalMove		= last standardOpeningMoves++	checkMatch+		:: Input.StandardOpeningOptions.MatchSwitches+		-> Test.HUnit.Model.Game.Game+		-> String+		-> Test.HUnit.Component.Move.Move+		-> Test.HUnit.Test+	checkMatch tryToMatchSwitches game s expectedMove	= map (+		Component.QualifiedMove.getMove . fst {-qualifiedMove-}+	 ) (+		ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves tryToMatchSwitches (+			mkGame s+		) . ContextualNotation.PositionHashQualifiedMoveTree.fromQualifiedMoveForest False {-incrementalEvaluation-} (+			Data.Default.def	:: Component.Zobrist.Zobrist T.X T.Y T.PositionHash+		) $ ContextualNotation.QualifiedMoveForest.fromPGNDatabase [+			ContextualNotation.PGN.mkPGN' [] [+				(ContextualNotation.PGN.dateTag, "2018.01.01")+			] game+		]+	 ) ~?= [expectedMove]+
+ src-test/BishBosh/Test/HUnit/ContextualNotation/StandardAlgebraic.hs view
@@ -0,0 +1,166 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic(+-- * Constants+	testCases+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Component.EitherQualifiedMove		as Component.EitherQualifiedMove+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Test.HUnit.Model.Game			as Test.HUnit.Model.Game+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Test.HUnit++#ifdef USE_POLYPARSE+import			Test.HUnit((~?=))+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy		as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain		as Poly+#endif+#else /* Parsec */+import			Test.HUnit((~?=), (~?))+import qualified	Text.ParserCombinators.Parsec+#endif++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test $ map (+	\(game, san, standardAlgebraic) -> let+		parser	= ContextualNotation.StandardAlgebraic.parser explicitEnPassant True {-validateMoves-} game+	in+#ifdef USE_POLYPARSE+		fst (Poly.runParser parser san) ~?=+#if USE_POLYPARSE == 1+			standardAlgebraic+#else /* Plain */+			Right standardAlgebraic+#endif+#else /* Parsec */+		either (\parseError -> False ~? show parseError) (~?= standardAlgebraic) $ Text.ParserCombinators.Parsec.parse parser "SAN-parser" san+#endif+ ) $ map (+	\s -> let+		game :: Test.HUnit.Model.Game.Game+		game	= Data.Default.def+	 in case Notation.MoveNotation.readsQualifiedMove Data.Default.def s of+		[(eitherQualifiedMove, "")]	-> let+			(move, Right moveType)	= Component.EitherQualifiedMove.getMove &&& Component.EitherQualifiedMove.getPromotionRankOrMoveType $ eitherQualifiedMove+		 in Data.Maybe.maybe (+			game,+			showsSAN eitherQualifiedMove game "",+			ContextualNotation.StandardAlgebraic.fromQualifiedMove $ Component.QualifiedMove.mkQualifiedMove move moveType+		 ) (+			Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic.testCases:\tinvalid " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows move . showString "; " . show+		 ) $ Model.Game.validateEitherQualifiedMove eitherQualifiedMove game+		_		-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic.testCases:\tfailed to read " $ shows s "."+ ) ["g1h3", "e2e3", "e2e4"] ++ map (+	\(fen, nextLogicalColour, s, maybeMoveSuffixAnnotation) -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def s of+		[(eitherQualifiedMove, "")]	-> let+			(move, Right moveType)	= Component.EitherQualifiedMove.getMove &&& Component.EitherQualifiedMove.getPromotionRankOrMoveType $ eitherQualifiedMove+		 in case reads fen of+			[(board, "")]	-> let+				game	= Model.Game.mkGame nextLogicalColour Data.Default.def {-CastleableRooksByLogicalColour-} board Property.Empty.empty {-TurnsByLogicalColour-}+			 in Data.Maybe.maybe (+				game,+				showsSAN eitherQualifiedMove game $ Data.Maybe.fromMaybe "" maybeMoveSuffixAnnotation,+				ContextualNotation.StandardAlgebraic.fromQualifiedMove $ Component.QualifiedMove.mkQualifiedMove move moveType+			 ) (+				Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic.testCases:\tinvalid " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows move . showString "; " . show+			 ) $ Model.Game.validateEitherQualifiedMove eitherQualifiedMove game+			_		-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic.testCases:\tfailed to read FEN" . Text.ShowList.showsAssociation $ show fen+		_		-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic.testCases:\tfailed to read " $ shows s "."+ ) [+	(+		"r3k2r/8/8/8/8/8/PPPPPPPP/RNBQK2R",+		Attribute.LogicalColour.White,+		"e1g1c",	-- O-O.+		Just "!"+	), (+		"rnbqk2r/pppppppp/8/8/8/8/8/R3K2R",+		Attribute.LogicalColour.Black,+		"e8g8c",	-- O-O.+		Just " ?"+	), (+		"r3k2r/8/8/8/8/8/PPPPPPPP/R3KBNR",+		Attribute.LogicalColour.White,+		"e1c1C",	-- O-O-O.+		Just "!!"+	), (+		"r3kbnr/pppppppp/8/8/8/8/8/R3K2R",+		Attribute.LogicalColour.Black,+		"e8c8C",	-- O-O-O.+		Just " !?"+	), (+		"r3kbnr/8/2R5/1RnR4/2R5/8/8/R3K2R",+		Attribute.LogicalColour.White,+		"b5c5n",	-- Rbxc5.+		Just "?!"+	), (+		"r3kbnr/8/2R5/1RnR4/2R5/8/8/R3K2R",+		Attribute.LogicalColour.White,+		"c4c5n",	-- R4xc5.+		Just "\t??"+	), (+		"r3kbnr/3N1N2/2N3N1/4b3/2N3N1/3N1N2/8/R3K2R",+		Attribute.LogicalColour.White,+		"d3e5b",	-- Nd3xe5.+		Nothing+	), (+		"r3kbnr/8/8/8/3r4/2P1P3/8/R3K2R",+		Attribute.LogicalColour.White,+		"c3d4r",	-- cxd4.+		Nothing+	), (+		"r3kbnr/1P6/8/8/8/8/8/R3K2R",+		Attribute.LogicalColour.White,+		"b7b8N",	-- b8=N.+		Nothing+	), (+		"r3kbnr/1P6/8/8/8/8/8/R3K2R",+		Attribute.LogicalColour.White,+		"b7a8rQ",	-- bxa8=Q+.+		Nothing+	)+ ] where+	explicitEnPassant :: ContextualNotation.StandardAlgebraic.ExplicitEnPassant+	explicitEnPassant	= False++	showsSAN eitherQualifiedMove game	= ContextualNotation.StandardAlgebraic.showsTurn explicitEnPassant (+		Data.Maybe.fromJust . Model.Game.maybeLastTurn $ Model.Game.applyEitherQualifiedMove eitherQualifiedMove game	-- Turn.+	 ) game+
+ src-test/BishBosh/Test/HUnit/Evaluation/Fitness.hs view
@@ -0,0 +1,173 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Evaluation.Fitness(+-- * Types+-- ** Type-synonyms+--	CriterionValue,+-- * Constants+	testCases+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.CriterionValue		as Attribute.CriterionValue+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Evaluation.Fitness			as Evaluation.Fitness+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour	as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.Test.HUnit.Model.Game			as Test.HUnit.Model.Game+import qualified	BishBosh.Test.HUnit.State.Board			as Test.HUnit.State.Board+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Test.HUnit+import			Test.HUnit((~:), (~?=))++-- | A suitable concrete type.+type CriterionValue	= Attribute.CriterionValue.CriterionValue T.CriterionValue++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	"'BishBosh.Evaluation.Fitness.measureValueOfCastlingPotential' failed after moving King." ~: case Notation.MoveNotation.readsQualifiedMove Data.Default.def "e1e3" {-move King (illegally)-} of+		[(eitherQualifiedMove, "")]	-> Evaluation.Fitness.measureValueOfCastlingPotential (+			Model.Game.applyEitherQualifiedMove eitherQualifiedMove (+				Data.Default.def	:: Test.HUnit.Model.Game.Game+			)+		 ) ~?= (+			minBound	:: CriterionValue+		 )+		_				-> Control.Exception.throw $ Data.Exception.mkParseFailure "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed to parse move.",+	"'BishBosh.Evaluation.Fitness.measureValueOfCastlingPotential' failed after moving Rooks." ~: Evaluation.Fitness.measureValueOfCastlingPotential (+		Model.Game.fromBoard . foldr (+			\sourceCoordinates -> State.Board.movePiece (+				Component.Move.mkMove sourceCoordinates $ Cartesian.Coordinates.translateY (+					+ 2	-- N.B. an illegal move.+				) sourceCoordinates	-- Construct two White moves.+			) Data.Default.def {-moveType-}+		) (+			Data.Default.def	:: Test.HUnit.State.Board.Board+		) $ Cartesian.Coordinates.rooksStartingCoordinates Attribute.LogicalColour.White+	) ~?= (+		maxBound	:: CriterionValue+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfCastlingPotential' failed after moving White Queen's Rook." ~: case Notation.MoveNotation.readsQualifiedMove Data.Default.def "a1a3" {-move Queen's Rook (illegally)-} of+		[(eitherQualifiedMove, "")]	-> Evaluation.Fitness.measureValueOfCastlingPotential (+			Model.Game.applyEitherQualifiedMove eitherQualifiedMove (+				Data.Default.def	:: Test.HUnit.Model.Game.Game+			)+		 ) ~?= (+			Attribute.CriterionValue.mkCriterionValue . negate $ recip 2	:: CriterionValue	-- Moving Queen's Rook still permits castling on the King's side.+		 )+		_				-> Control.Exception.throw $ Data.Exception.mkParseFailure "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed to parse move.",+	"'BishBosh.Evaluation.Fitness.measureValueOfCastlingPotential' failed after taking Black Queen's Rook." ~: case Notation.MoveNotation.readsQualifiedMove Data.Default.def "a2a8" {-take Queen's Rook (illegally)-} of+		[(eitherQualifiedMove, "")]	-> Evaluation.Fitness.measureValueOfCastlingPotential (+			Model.Game.applyEitherQualifiedMove eitherQualifiedMove (+				Data.Default.def	:: Test.HUnit.Model.Game.Game+			)+		 ) ~?= (+			Attribute.CriterionValue.mkCriterionValue $ recip 2	:: CriterionValue	-- Taking Queen's Rook still permits castling on the King's side.+		 )+		_				-> Control.Exception.throw $ Data.Exception.mkParseFailure "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed to parse move.",+	"'BishBosh.Evaluation.Fitness.measureValueOfCastlingPotential' failed after moving one Rook from either side." ~: either (+		\(moveString, errorMessage)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed for " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows moveString . showString "; " $ showString errorMessage "."+	) (+		\game -> Evaluation.Fitness.measureValueOfCastlingPotential game ~?= (Attribute.CriterionValue.zero :: CriterionValue)+	) $ Test.HUnit.Model.Game.applyMoves [+		"a2a3",+		"g8f6",+		"a1a2",+		"h8g8"+	],+	"'BishBosh.Evaluation.Fitness.measureValueOfDoubledPawns' failed." ~: Evaluation.Fitness.measureValueOfDoubledPawns (+		Model.Game.fromBoard (+			read "4k3/p6p/8/3PP3/3PP3/3PP3/3PP3/4K3"	:: Test.HUnit.State.Board.Board+		)+	) ~?= (+		maxBound	:: CriterionValue	-- White is the next player, so Black is assumed to have just moved to an optimal position.+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfIsolatedPawns' failed for four columns of two rows of Pawns." ~: Evaluation.Fitness.measureValueOfIsolatedPawns (+		Model.Game.fromBoard (+			read "4k3/pppppppp/8/8/P1P1P1P1/8/P1P1P1P1/4K3"	:: Test.HUnit.State.Board.Board+		)+	) ~?= (+		maxBound	:: CriterionValue	-- White is the next player, so Black is assumed to have just moved to an optimal position.+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfIsolatedPawns' failed for two columns of two four of Pawns." ~: Evaluation.Fitness.measureValueOfIsolatedPawns (+		Model.Game.fromBoard (+			read "4k3/pppppppp/8/2P2P2/2P2P2/2P2P2/2P2P2/4K3"	:: Test.HUnit.State.Board.Board+		)+	) ~?= (+		maxBound	:: CriterionValue	-- White is the next player, so Black is assumed to have just moved to an optimal position.+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfPassedPawns' failed." ~: Evaluation.Fitness.measureValueOfPassedPawns (+		Model.Game.fromBoard (+			read "4k3/8/8/8/8/8/pppppppp/4K3"	:: Test.HUnit.State.Board.Board+		)+	) ~?= (+		maxBound	:: CriterionValue	-- White is the next player, so Black is assumed to have just moved to an optimal position.+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfPassedPawns' failed." ~: Evaluation.Fitness.measureValueOfPassedPawns (+		Model.Game.fromBoard (+			read "8/PPPPPPPP/8/8/8/8/8/k3K3"	:: Test.HUnit.State.Board.Board+		)+	) ~?= (+		minBound	:: CriterionValue	-- White is the next player, so Black is assumed to have just moved to the worst possible position.+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfDefence' failed for default board." ~: Evaluation.Fitness.measureValueOfDefence (+		Model.Game.fromBoard . uncurry (+			foldr $ \(coordinates, _) -> State.Board.removePiece coordinates+		) $ (+			id &&& State.CoordinatesByRankByLogicalColour.findPieces (+				not . uncurry (||) . (Component.Piece.isBlack &&& Component.Piece.isKing)+			) . State.Board.getCoordinatesByRankByLogicalColour+		) (+			Data.Default.def	:: Test.HUnit.State.Board.Board+		)+	) ~?= Attribute.CriterionValue.mkCriterionValue (+		19 / fromIntegral Evaluation.Fitness.maximumDefended	:: T.CriterionValue+	),+	"'BishBosh.Evaluation.Fitness.measureValueOfDefence' failed after Pawn-advance." ~: case Notation.MoveNotation.readsQualifiedMove Data.Default.def "g2g3" {-advance King's Knight's Pawn-} of+		[(eitherQualifiedMove, "")]	-> Evaluation.Fitness.measureValueOfDefence (+			Model.Game.applyEitherQualifiedMove eitherQualifiedMove (+				Data.Default.def	:: Test.HUnit.Model.Game.Game+			)+		 ) ~?= Attribute.CriterionValue.mkCriterionValue (recip $ fromIntegral Evaluation.Fitness.maximumDefended :: T.CriterionValue)+		_				-> Control.Exception.throw $ Data.Exception.mkParseFailure "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed to parse move.",+	"'BishBosh.Evaluation.Fitness.measureValueOfDefence' failed after Pawn advance & Knight move." ~: either (+		\(moveString, errorMessage)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Evaluation.Fitness.testCases:\tfailed for " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows moveString . showString "; " $ showString errorMessage "."+	) (+		\game -> Evaluation.Fitness.measureValueOfDefence game ~?= Attribute.CriterionValue.mkCriterionValue (3 / fromIntegral Evaluation.Fitness.maximumDefended :: T.CriterionValue)+	) $ Test.HUnit.Model.Game.applyMoves [+		"g2g3",	-- Advance King's Knight's Pawn.+		"b8c6"	-- Advance Queen's Knight.+	]+ ]
+ src-test/BishBosh/Test/HUnit/Input/Options.hs view
@@ -0,0 +1,93 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Input.Options(+-- * Constants+	testCases+) where++import			BishBosh.Data.Float()	-- HXT.XmlPickler.+import			Control.Category((>>>))+import qualified	BishBosh.Data.Exception	as Data.Exception+import qualified	BishBosh.Input.Options	as Input.Options+import qualified	BishBosh.Types		as T+import qualified	Control.Exception+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Paths_bishbosh		as Paths	-- Either local stub, or package-instance auto-generated by 'Setup build'.+import qualified	System.Environment+import qualified	System.FilePath+import qualified	Test.HUnit+import qualified	Text.XML.HXT.Core	as HXT+import qualified	ToolShed.System.File+import			System.FilePath((</>), (<.>))+import			Test.HUnit((@?))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	Test.HUnit.TestCase $ let+		inputSysConfig :: HXT.SysConfigList+		inputSysConfig	= [+			HXT.withRemoveWS	HXT.yes,	-- Remove white-space, e.g. any indentation which might have been introduced by 'HXT.withIndent'.+			HXT.withStrictInput	HXT.yes,	-- Read the input file strictly (cf. lazily), this ensures closing the files correctly even if not read completely.+			HXT.withValidate	HXT.yes		-- Validate against any DTD referenced from the XML-file.+		 ]++		maximumTraceLevel :: Int+		maximumTraceLevel	= 0++		fileName :: System.FilePath.FilePath+		fileName	= "bishbosh_both" <.> "xml"+	in do+		dataDir		<- fmap System.FilePath.normalise Paths.getDataDir+		executablePath	<- fmap System.FilePath.normalise System.Environment.getExecutablePath++		let+			searchPath	= Data.List.nub . map (</> "config" </> "Raw") $ [+				".",+				dataDir	-- The installation-directory.+			 ] ++ Data.List.unfoldr (+				\filePath -> let+					directory	= System.FilePath.takeDirectory filePath+				in if directory `elem` map return {-to List-monad-} ['.', System.FilePath.pathSeparator]+					then Nothing+					else Just (directory, directory)+			 ) executablePath+		 in ToolShed.System.File.locate fileName searchPath >>= Data.Maybe.maybe (+			Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.Test.HUnit.Input.Options.testCases:\tfailed to locate " . shows fileName . showString " in " $ shows searchPath "."+		 ) (+			\path -> do+				optionsList	<- HXT.runX {-which returns a list-} $ HXT.setTraceLevel maximumTraceLevel >>> HXT.xunpickleDocument HXT.xpickle inputSysConfig path++				Data.Maybe.maybe False (== head optionsList) (+					(HXT.unpickleDoc HXT.xpickle . HXT.pickleDoc HXT.xpickle) =<< Data.Maybe.listToMaybe (+						optionsList :: [+							Input.Options.Options T.Y {-column-} T.CriterionWeight T.PieceSquareValue T.RankValue T.X {-row-} T.X T.Y+						]+					)+				 ) @? "Input.Options.pickler failed."+		 ) . Data.Maybe.listToMaybe+ ]+
+ src-test/BishBosh/Test/HUnit/Model/Game.hs view
@@ -0,0 +1,272 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.Model.Game(+-- * Types+-- ** Type-synonyms+	Game,+-- * Constants+	testCases,+-- * Functions+	applyMoves+) where++import			BishBosh.Model.Game((/~))+import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Test.HUnit.Cartesian.Coordinates	as Test.HUnit.Cartesian.Coordinates+import qualified	BishBosh.Text.ShowList				as Text.ShowList+import qualified	BishBosh.Types					as T+import qualified	Control.Exception+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Test.HUnit+import			Test.HUnit((~?), (~:), (~?=))++-- | Defines a concrete type for testing.+type Game	= Model.Game.Game T.X T.Y++-- | Apply moves specified in Smith-notation, to the default opening board.+applyMoves :: [String] -> Either (String, String) Game+applyMoves	= Model.Game.applyEitherQualifiedMoves (+	\s -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def {-Smith-} s of+		[(eitherQualifiedMove, "")]	-> Right eitherQualifiedMove+		_				-> Left . shows s . showString " /~ " $ Notation.MoveNotation.showsMoveSyntax Data.Default.def ""+ ) (+	Data.Default.def	:: Game+ )++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	"'BishBosh.Model.Game.showFEN' failed" ~: Property.ForsythEdwards.showFEN (Data.Default.def :: Game) ~?= "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",+	"'BishBosh.Model.Game.showFEN' failed" ~: either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) Property.ForsythEdwards.showFEN (+		applyMoves ["e2e4"]+	) ~?= "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",+	"'BishBosh.Model.Game.showFEN' failed" ~: either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) Property.ForsythEdwards.showFEN (+		applyMoves ["e2e4", "c7c5"]+	) ~?= "rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2",+	"'BishBosh.Model.Game.showFEN' failed" ~: either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) Property.ForsythEdwards.showFEN (+		applyMoves $ words "e2e4 c7c5 g1f3"+	) ~?= "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2",+	all (+		(+			$ (Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "r3k2r/8/8/8/8/8/8/R3K2R" :: Game)+		) . (+			\s -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def s of+				[(eitherQualifiedMove, "")]	-> Model.Game.isValidEitherQualifiedMove eitherQualifiedMove+				_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . shows s . showString " /~ " $ Notation.MoveNotation.showsMoveSyntax Data.Default.def ""+		)+	) [+		"e1g1c",+		"e1c1C"+	] ~? "'BishBosh.Model.Game.isValidEitherQualifiedMove' failed when castling.",+	"'BishBosh.Model.Game.findQualifiedMovesAvailableToNextPlayer' failed" ~: Model.Game.findQualifiedMovesAvailableToNextPlayer (+		Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "8/3K4/4q3/3bb3/8/8/8/4k3"	:: Game+	) ~?= [+		Component.QualifiedMove.mkQualifiedMove (+			Cartesian.Coordinates.mkRelativeCoordinates ((+ 3) *** (+ 6)) `Component.Move.mkMove` Cartesian.Coordinates.mkRelativeCoordinates ((+ 3) *** (+ 7))+		) Data.Default.def {-moveType-}+	],+	not (+		Model.Game.isValidQualifiedMove (+			Component.QualifiedMove.mkQualifiedMove (+				Cartesian.Coordinates.mkRelativeCoordinates ((+ 3) *** succ) `Component.Move.mkMove` Cartesian.Coordinates.mkRelativeCoordinates ((+ 3) *** (+ 2))+			) $ Attribute.MoveType.mkNormalMoveType (Just Attribute.Rank.Pawn) Nothing+		) (+			Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "4k3/8/8/8/1b6/3p4/3R4/4K3"	:: Game+		)+	) ~? "'BishBosh.Model.Game.isValidQualifiedMove' failed",+	let+		pawnsCoordinates :: Test.HUnit.Cartesian.Coordinates.Coordinates+		pawnsCoordinates	= Cartesian.Coordinates.translateY pred maxBound++		game :: Game+		game	= Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "4k3/7P/8/8/8/8/8/4K3"+	in Model.Game.getBoard (+		fst {-game-} . head . Model.Game.rollBack $ Model.Game.applyQualifiedMove (+			Component.QualifiedMove.mkQualifiedMove (+				Component.Move.mkMove pawnsCoordinates maxBound+			) . Attribute.MoveType.mkNormalMoveType Nothing $ Just Attribute.Rank.defaultPromotionRank+		) game+	) == Model.Game.getBoard game ~? "'BishBosh.Model.Game.rollback' failed to undo a Pawn-promotion",+	let+		game :: Game+		game	= Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "4k3/8/8/8/8/8/8/R3K2R"+	in all (+		== Model.Game.getBoard game+	) (+		map (+			\s -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def s of+				[(eitherQualifiedMove, "")]	-> Model.Game.getBoard . fst {-game-} . head . Model.Game.rollBack $ Model.Game.applyEitherQualifiedMove eitherQualifiedMove game+				_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . shows s . showString " /~ " $ Notation.MoveNotation.showsMoveSyntax Data.Default.def ""+		) [+			"e1g1c",+			"e1c1C"+		]+	) ~? "'BishBosh.Model.Game.rollback' failed to undo castling",+	either (+		\(moveString, errorMessage)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed for " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows moveString . showString "; " $ showString errorMessage "."+	) (+		\game -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def "a5b6E" of+			[(eitherQualifiedMove, "")]	-> Model.Game.isValidEitherQualifiedMove eitherQualifiedMove game ~? "'BishBosh.Model.Game.isValidEitherQualifiedMove' failed for En-passant by White."+			_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t /~ " $ Notation.MoveNotation.showsMoveSyntax Data.Default.def ""+	) $ applyMoves [+		"a2a4",	-- White: Queen's Rook's Pawn.+		"b8c6",	-- Black: Queen's Knight.+		"a4a5",	-- White: Queen's Rook's Pawn.+		"b7b5"	-- Black: Queen's Knight's Pawn.+	],+	either (+		\(moveString, errorMessage)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed for " . showString Component.Move.tag . Text.ShowList.showsAssociation . shows moveString . showString "; " $ showString errorMessage "."+	) (+		\game -> case Notation.MoveNotation.readsQualifiedMove Data.Default.def "a4b3E" of+			[(eitherQualifiedMove, "")]	-> Model.Game.isValidEitherQualifiedMove eitherQualifiedMove game ~? "'BishBosh.Model.Game.isValidEitherQualifiedMove' failed for En-passant by Black."+			_				-> Control.Exception.throw $ Data.Exception.mkParseFailure "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to parse move."+	) $ applyMoves [+		"b1c3",	-- White: Queen's Knight.+		"a7a5",	-- Black: Queen's Rook's Pawn.+		"c3b1",	-- White: Queen's Knight.+		"a5a4",	-- Black: Queen's Rook's Pawn.+		"b2b4"	-- White: Queen's Knight's Pawn.+	],+	Data.Maybe.maybe False Model.GameTerminationReason.isStaleMate (+		Model.Game.getMaybeTerminationReason (+			Model.Game.fromBoard $ Property.ForsythEdwards.readFEN "rnbqk2r/pppppp2/8/8/8/7p/6np/6bK"	:: Game+		)+	) ~? "'BishBosh.Model.Game.getMaybeTerminationReason' failed to detect \"Stale-mate\".",+	all (+		\s -> Data.Maybe.maybe False Model.GameTerminationReason.isDrawByInsufficientMaterial $ Model.Game.getMaybeTerminationReason (+			Model.Game.fromBoard $ Property.ForsythEdwards.readFEN s	:: Game+		)+	) [+		"2k5/8/1KB5/3B4/8/8/8/8",+		"6k1/8/5KN1/8/8/8/8/8",+		"8/8/2KB4/8/7k/2B5/5b2/8"+	] ~? "'BishBosh.Model.Game.getMaybeTerminationReason' failed to detect \"Draw by Insufficient Material\".",+	all (+		\s -> Data.Maybe.maybe True (not . Model.GameTerminationReason.isDrawByInsufficientMaterial) $ Model.Game.getMaybeTerminationReason (+			Model.Game.fromBoard $ Property.ForsythEdwards.readFEN s	:: Game+		)+	) [+		"k7/8/K7/8/8/8/8/1Q6",+		"k7/8/K7/8/8/8/8/1R6",+		"k7/8/K7/8/8/8/P7/8",+		"k7/8/K7/8/8/8/8/B6n",+		"k7/8/K7/8/8/8/8/n6n",+		"k7/8/K7/8/8/8/8/N6n",+		"k7/8/K7/8/8/8/8/bB6",+		"k7/8/K7/8/8/8/8/BB6"+	] ~? "'BishBosh.Model.Game.getMaybeTerminationReason' false positive \"Draw by Insufficient Material\".",+	(+		either (+			\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+		) (+			uncurry (==) . (+				Model.Game.sortAvailableQualifiedMoves . (! Attribute.LogicalColour.White) . Model.Game.getAvailableQualifiedMovesByLogicalColour &&& Model.Game.sortAvailableQualifiedMoves . Model.Game.mkAvailableQualifiedMovesFor Attribute.LogicalColour.White+			)+		) . applyMoves $ words "g2g4 f7f6 g1h3 g7g5 h1g1 c7c6 d2d3 h7h5 c1d2 h5g4p d3d4 b8a6 f2f4 g4f3E"+	 ) ~? "'BishBosh.Model.Game.getAvailableQualifiedMovesByLogicalColour' failed after En-passant.",+	either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) (+		Data.Maybe.maybe False Model.GameTerminationReason.isDraw . Model.Game.getMaybeTerminationReason+	) (+		applyMoves . concat . replicate 4 $ words "g1f3 g8f6 f3g1 f6g8"+	) ~? "'BishBosh.Model.Game./~' failed to account for Draw by Five-fold Repetition.",+	let+		initialMoves	= [+			"e2e4",+			"g8f6",+			"e4e5",+			"d7d5"	-- Construct an en-passant opportunity.+		 ]+	in either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) id (+		applyMoves initialMoves+	) /~ either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) id (+		applyMoves $ initialMoves ++ [+			"d1e2",+			"d8d7",+			"e2d1",+			"d7d8"	-- Dither to waste the en-passant opportunity, while retaining an identical board.+		]+	) ~? "'BishBosh.Model.Game./~' failed to account for En-passant.",+	either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) id (+		applyMoves [+			"e2e4",+			"g8f6",+			"e4e5",+			"d7d5"	-- Construct an en-passant opportunity.+		]+	) /~ either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) id (+		applyMoves [+			"e2e3",+			"g8f6",+			"e3e4",+			"d7d6",+			"e4e5",+			"d6d5"	-- Create an identical board without the en-passant opportunity.+		]+	) ~? "'BishBosh.Model.Game./~' failed to account for En-passant.",+	either (+		\(moveString, s)	-> Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Test.HUnit.Model.Game.testCases:\t" . showString moveString . showString "; " $ showString s "."+	) (+		/~ Data.Default.def+	) (+		applyMoves $ words "g1f3 g8f6 h1g1 f6g4 g1h1 g4h6 f3g1 h6g8"+	) ~? "'BishBosh.Model.Game./~' failed to account for lost Castling-potential.",+	let+		longCastle	= "e1c1C"+	in case Notation.MoveNotation.readsQualifiedMove Data.Default.def longCastle of+		[(eitherQualifiedMove, "")]	-> Model.Game.isValidEitherQualifiedMove eitherQualifiedMove (+			Property.ForsythEdwards.readFEN "r2qkbnr/ppp1pppp/2np4/5b2/3P4/NQP5/PP1BPPPP/R3KBNR w KQkq - 5 6"	:: Game+		 ) ~? "long Castle through legal check failed."+		_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to parse " $ shows longCastle "."+ ]+
+ src-test/BishBosh/Test/HUnit/Model/GameTree.hs view
@@ -0,0 +1,94 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Static tests.+-}++module BishBosh.Test.HUnit.Model.GameTree(+-- * Constants+	testCases+) where++import qualified	BishBosh.Attribute.CaptureMoveSortAlgorithm	as Attribute.CaptureMoveSortAlgorithm+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Attribute.RankValues			as Attribute.RankValues+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.GameTree				as Model.GameTree+import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Types					as T+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Data.Tree+import qualified	Test.HUnit+import			Test.HUnit((~:), (~?=))++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	let+		maxDepth	= 4+	in "'BishBosh.Model.GameTree.countGames' failed" ~: map Model.GameTree.countGames [0 .. maxDepth] ~?= take (succ maxDepth) [1, 20, 400, 8902, 197281, 4865609, 119060324, 3195901860, 84998978956],	-- <http://oeis.org/A019319>.+	"'BishBosh.Model.GameTree.countMoves' failed" ~: map (+		\searchDepth -> Model.GameTree.countMoves searchDepth ~?= foldr (+			(+) . Model.GameTree.countGames+		) 0 [1 .. searchDepth]+	) [1 .. 4],+	"'BishBosh.Model.GameTree.sortGameTree/MVVLVA' failed" ~: map (+		\turn -> Notation.MoveNotation.showNotation Data.Default.def (turn :: Component.Turn.Turn T.X T.Y)+	) (+		sortAvailableMoves (Just Attribute.CaptureMoveSortAlgorithm.MVVLVA) testString+	) ~?= words "c4d5p e4d5p c3d5p d1d5p c1e3 c1f4 d1d4 g1e2 d1d3 c1d2 c1g5 a1b1 d1d2 d1e2 e1d2 e1e2 a2a4 g2g4 h2h4 g1h3 a2a3 g2g3 h2h3 c1b2 b3b4 c1a3 c1h6 c4c5 e4e5 e1f1 c3b5 c3e2 f3e2 f3g4 c3a4 f3h5 c3b1",+	"'BishBosh.Model.GameTree.sortGameTree/SEE' failed" ~: map (+		\turn -> Notation.MoveNotation.showNotation Data.Default.def (turn :: Component.Turn.Turn T.X T.Y)+	) (+		sortAvailableMoves (Just Attribute.CaptureMoveSortAlgorithm.SEE) testString+	) ~?= words "c4d5p e4d5p c1e3 c1f4 d1d4 d1d5p g1e2 d1d3 c1d2 c1g5 a1b1 d1d2 d1e2 e1d2 e1e2 a2a4 g2g4 h2h4 g1h3 a2a3 g2g3 h2h3 c3d5p c1b2 b3b4 c1a3 c1h6 c4c5 e4e5 e1f1 c3b5 c3e2 f3e2 f3g4 c3a4 f3h5 c3b1"+ ] where+	sortAvailableMoves :: (+		Integral	x,+		Integral	y,+		Read		x,+		Read		y,+		Show		x,+		Show		y+	 ) => Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm -> String -> [Component.Turn.Turn x y]+	sortAvailableMoves maybeSortAlgorithm	= Data.Maybe.mapMaybe (+		Model.Game.maybeLastTurn . Data.Tree.rootLabel+	 ) . Data.Tree.subForest . Model.GameTree.deconstruct . Model.GameTree.sortGameTree True {-PreferMovesTowardsCentre-} maybeSortAlgorithm (+		`Attribute.RankValues.findRankValue` Attribute.RankValues.fromAssocs (+			zip Attribute.Rank.range $ map (/ 10) [+				1	:: T.RankValue,+				5,	-- R+				3,	-- N+				7 / 2,	-- B+				9,	-- Q+				0	-- K+			]+		)+	 ) Property.Empty.empty {-MoveFrequency-} . Model.GameTree.fromGame . Property.ForsythEdwards.readFEN++	testString	= "rn1qkb1r/pp2pppp/2p1bn2/3p4/2P1P3/1PN2B2/P1P2PPP/R1BQK1NR w KQkq - 0 5"+
+ src-test/BishBosh/Test/HUnit/Model/PositionHashTree.hs view
@@ -0,0 +1,46 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Static tests.+-}++module BishBosh.Test.HUnit.Model.PositionHashTree(+-- * Constants+	testCases+) where++import qualified	BishBosh.Model.PositionHashTree	as Model.PositionHashTree+import qualified	BishBosh.Types			as T+import qualified	Data.Default+import qualified	Test.HUnit+import			Test.HUnit((~:), (~?=))++-- | Check the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	let+		maxDepth	= 4+	in "'BishBosh.Model.PositionhashTree.countDistinctPositions' failed" ~: map (+		\i -> Model.PositionHashTree.countDistinctPositions i (Data.Default.def :: Model.PositionHashTree.PositionHashTree T.PositionHash)+	) [0 .. maxDepth] ~?= take (succ maxDepth) [1, 20, 400, 5362, 72078, 822518, 9417681, 96400068, 988187354, 9183421888, 85375278064, 726155461002]	-- <http://oeis.org/A083276>. CAVEAT: the point at which this test fails, depends on the square-root of the bits in 'T.PositionHash'.+ ]
+ src-test/BishBosh/Test/HUnit/Search/Search.hs view
@@ -0,0 +1,125 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests based on <https://chessprogramming.wikispaces.com/Bratko-Kopec+Test>.+-}++module BishBosh.Test.HUnit.Search.Search (+-- * Constants+--	evaluationOptions,+--	searchOptions,+	testCases+) where++import qualified	BishBosh.Attribute.CaptureMoveSortAlgorithm		as Attribute.CaptureMoveSortAlgorithm+import qualified	BishBosh.Attribute.CriterionWeight			as Attribute.CriterionWeight+import qualified	BishBosh.Data.Exception					as Data.Exception+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.CriteriaWeights				as Input.CriteriaWeights+import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Notation.MoveNotation				as Notation.MoveNotation+import qualified	BishBosh.Property.Empty					as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards			as Property.ForsythEdwards+import qualified	BishBosh.Search.Search					as Search.Search+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.Types						as T+import qualified	Control.Exception+import qualified	Control.Monad.Reader+import qualified	Data.Default+import qualified	Data.List+import qualified	Test.HUnit+import			Test.HUnit((~?))++-- | Constant.+evaluationOptions :: (+	Eq		pieceSquareValue,+	Fractional	pieceSquareValue,+	Fractional	criterionWeight,+	Fractional	rankValue,+	Integral	x,+	Integral	y,+	Ord		criterionWeight,+	Ord		rankValue,+	Show		criterionWeight,+	Show		rankValue+ ) => Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y+evaluationOptions	= Input.EvaluationOptions.mkEvaluationOptions Data.Default.def {-rankValues-} Data.Default.def {+	Input.CriteriaWeights.getWeightOfMobility	= Attribute.CriterionWeight.mkCriterionWeight $ recip 100+} False Nothing++-- | Constant.+searchOptions :: Input.SearchOptions.SearchOptions+searchOptions	= Data.Default.def {+	Input.SearchOptions.getMaybeCaptureMoveSortAlgorithm	= Just Attribute.CaptureMoveSortAlgorithm.MVVLVA,+	Input.SearchOptions.getMaybeRetireKillerMovesAfter	= Just 3,+	Input.SearchOptions.getMaybeUseTranspositions		= Just (1, 2)+}++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test $ map (+	\(searchDepth, fen, moveOptions) -> let+		turnString	= Notation.MoveNotation.showNotation Data.Default.def {-Smith-} $ case Search.Search.getQuantifiedGames $ Control.Monad.Reader.runReader (+			Search.Search.search searchDepth $ Search.SearchState.initialise (+				Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree (+					evaluationOptions	:: Input.EvaluationOptions.EvaluationOptions T.CriterionWeight T.PieceSquareValue T.RankValue T.X T.Y+				) searchOptions Data.Default.def {-Zobrist-} Property.Empty.empty {-MoveFrequency-} (+					Property.ForsythEdwards.readFEN fen	-- Game.+				) :: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean+			 )+		 ) searchOptions of+			quantifiedGame : _	-> Evaluation.QuantifiedGame.getLastTurn quantifiedGame+			_			-> Control.Exception.throw $ Data.Exception.mkNullDatum "BishBosh.Test.HUnit.Search.Search.testCases:\tfailed."++		moveStrings	= words moveOptions+	in elem turnString moveStrings ~? showString "Bratko-Kopec:\t" (+		shows turnString . showString " !~ /" $ showString (Data.List.intercalate "|" moveStrings) "/."+	)+ ) [+--		FEN									Accepted moves	Observed move, at various search-depths.+--													4		5+	(4,	"1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 w - -",			"e3a7p"),+	(4,	"3r1k2/4npp1/1ppr3p/p6P/P2PPPP1/1NR5/5K2/2R5 w - -",			"d4d5"),	-- f2g2		e4e5.+	(4,	"2q1rr1k/3bbnnp/p2p1pp1/2pPp3/PpP1P1P1/1P2BNNP/2BQ1PRK/7R b - -",	"f6f5"),	-- c8b7		d7g4p.+	(4,	"rnbqkb1r/p3pppp/1p6/2ppP3/3N4/2P5/PPP1QPPP/R1B1KB1R w KQkq -",		"e5e6"),	-- d4b3		c1g5.+	(4,	"r1b2rk1/2q1b1pp/p2ppn2/1p6/3QP3/1BN1B3/PPP3PP/R4RK1 w - -",		"c3d5 a3a4"),	-- e3g5		d4b6.+	(4,	"2r3k1/pppR1pp1/4p3/4P1P1/5P2/1P4K1/P1P5/8 w - -",			"g5g6"),	-- g3f2		g3f2.+	(4,	"1nk1r1r1/pp2n1pp/4p3/q2pPp1N/b1pP1P2/B1P2R2/2P1B1PP/R2Q2K1 w - -",	"h5f6"),	-- a3d6		a3e7n.+	(4,	"4b3/p3kp2/6p1/3pP2p/2pP1P2/4K1P1/P3N2P/8 w - -",			"f4f5"),	-- e2c3		e2c3.+	(4,	"2kr1bnr/pbpq4/2n1pp2/3p3p/3P1P1B/2N2N1Q/PPP3PP/2KR1B1R w - -",		"f4f5"),	-- f1b5.+	(4,	"3rr1k1/pp3pp1/1qn2np1/8/3p4/PP1R1P2/2P1NQPP/R1B3K1 b - -",		"c6e5"),+	(4,	"2r1nrk1/p2q1ppp/bp1p4/n1pPp3/P1P1P3/2PBB1N1/4QPPP/R4RK1 w - -",	"f3f4"),	-- f1e1.+	(4,	"r3r1k1/ppqb1ppp/8/4p1NQ/8/2P5/PP3PPP/R3R1K1 b - -",			"d7f5"),+	(4,	"r2q1rk1/4bppp/p2p4/2pP4/3pP3/3Q4/PP1B1PPP/R3R1K1 w - -",		"b2b4"),+	(4,	"rnb2r1k/pp2p2p/2pp2p1/q2P1p2/8/1Pb2NP1/PB2PPBP/R2Q1RK1 w - -",		"d1d2 d1e1"),+	(4,	"2r3k1/1p2q1pp/2b1pr2/p1pp4/6Q1/1P1PP1R1/P1PN2PP/5RK1 w - -",		"g4g7p"),	-- g4h3.+	(4,	"r1bqkb1r/4npp1/p1p4p/1p1pP1B1/8/1B6/PPPN1PPP/R2Q1RK1 w kq -",		"d2e4"),	-- g5h4.+	(4,	"r2q1rk1/1ppnbppp/p2p1nb1/3Pp3/2P1P1P1/2N2N1P/PPB1QP2/R1B2RK1 b - -",	"h7h5"),	-- f6e8.+	(4,	"r1bq1rk1/pp2ppbp/2np2p1/2n5/P3PP2/N1P2N2/1PB3PP/R1B1QRK1 b - -",	"c5b3"),	-- c8g4.+	(4,	"3rr3/2pq2pk/p2p1pnp/8/2QBPP2/1P6/P5PP/4RRK1 b - -",			"e8e4p"),	-- c7c5.+	(4,	"r4k2/pb2bp1r/1p1qp2p/3pNp2/3P1P2/2N3P1/PPP1Q2P/2KRR3 w - -",		"g3g4"),	-- c3b5.+	(4,	"3rn2k/ppb2rpp/2ppqp2/5N2/2P1P3/1P5Q/PB3PPP/3RR1K1 w - -",		"f5h6"),	-- f5h4.+	(4,	"2r2rk1/1bqnbpp1/1p1ppn1p/pP6/N1P1P3/P2B1N1P/1B2QPP1/R2R2K1 b - -",	"b7e4p"),	-- d7e5.+	(4,	"r1bqk2r/pp2bppp/2p5/3pP3/P2Q1P2/2N1B3/1PP3PP/R4RK1 b kq -",		"f7f6"),	-- c8f5.+	(4,	"r2qnrnk/p2b2b1/1p1p2pp/2pPpp2/1PP1P3/PRNBB3/3QNPPP/5RK1 w - -",	"f2f4")		-- e4f5p.+ ]
+ src-test/BishBosh/Test/HUnit/State/Board.hs view
@@ -0,0 +1,323 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Static tests.+-}++module BishBosh.Test.HUnit.State.Board(+-- * Types+-- ** Type-synonyms+	Board,+-- * Constants+	testCases+) where++import			Control.Arrow((***))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.LogicalColour			as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank					as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa				as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates				as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate				as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector				as Cartesian.Vector+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.Piece				as Component.Piece+import qualified	BishBosh.Property.Empty					as Property.Empty+import qualified	BishBosh.Property.Opposable				as Property.Opposable+import qualified	BishBosh.State.Board					as State.Board+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour		as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.MaybePieceByCoordinates			as State.MaybePieceByCoordinates+import qualified	BishBosh.Test.HUnit.Cartesian.Coordinates		as Test.HUnit.Cartesian.Coordinates+import qualified	BishBosh.Types						as T+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Test.HUnit+import qualified	ToolShed.Data.Foldable+import			Test.HUnit((~:), (~?=), (~?))++-- | Defines a concrete type for testing.+type Board	= State.Board.Board T.X T.Y++-- | Check the sanity of the implementation, by validating a list of static test-cases.+testCases :: Test.HUnit.Test+testCases	= Test.HUnit.test [+	"'BishBosh.Cartesian.Coordinates.range' failed to locate the expected pieces on a default board." ~: (+		map length . ToolShed.Data.Foldable.gather $ map (+			`State.MaybePieceByCoordinates.dereference` Data.Default.def+		) (Cartesian.Coordinates.range :: [Test.HUnit.Cartesian.Coordinates.Coordinates])+	) ~?= [32, 8, 2, 2, 2, 1, 1, 8, 2, 2, 2, 1, 1],+	let+		kingsColour		= Attribute.LogicalColour.Black+		destination		= Cartesian.Coordinates.mkRelativeCoordinates ((+ 3) *** (+ 3))+		directionToCoordinates	= last . (`Cartesian.Coordinates.extrapolate` destination)+		mkPiece			= Component.Piece.mkPiece $ Property.Opposable.getOpposite kingsColour++		maybeShift :: Cartesian.Vector.VectorInt -> Maybe Test.HUnit.Cartesian.Coordinates.Coordinates+		maybeShift	= Cartesian.Vector.maybeTranslate destination+	in all (+		State.Board.isKingChecked kingsColour . placePieces . (:) (Component.Piece.mkKing kingsColour, destination) . return {-to List-monad-}+	) (+		concat [+			Data.Maybe.mapMaybe (+				fmap ((,) (mkPiece Attribute.Rank.Pawn)) . maybeShift . Property.Opposable.getOpposite+			) . Cartesian.Vector.attackVectorsForPawn $ Property.Opposable.getOpposite kingsColour,+			let+				attacker	= mkPiece Attribute.Rank.Rook+			in map ((,) attacker . directionToCoordinates) $ Component.Piece.attackDirectionsByPiece Data.Map.! attacker,+			let+				attacker	= mkPiece Attribute.Rank.Bishop+			in map ((,) attacker . directionToCoordinates) $ Component.Piece.attackDirectionsByPiece Data.Map.! attacker,+			Data.Maybe.mapMaybe (fmap ((,) (mkPiece Attribute.Rank.Knight)) . maybeShift) Cartesian.Vector.attackVectorsForKnight,+			let+				attacker	= mkPiece Attribute.Rank.Queen+			in map ((,) attacker . directionToCoordinates) $ Component.Piece.attackDirectionsByPiece Data.Map.! attacker+		]+	) ~? "'BishBosh.State.Board.isKingChecked' failed.",+	"'BishBosh.State.CoordinatesByRankByLogicalColour.countPassedPawns' failed, for passed Pawn adjacent to opposing Pawn of equal rank." ~: Data.Array.IArray.elems (+		Data.Array.IArray.amap length . State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			Component.Piece.mkPawn *** Cartesian.Coordinates.mkRelativeCoordinates+		) [+			(+				Attribute.LogicalColour.Black,+				id+			), (+				Attribute.LogicalColour.White,+				Control.Arrow.first succ+			)+		]+	) ~?= [1, 1],+	"'BishBosh.State.CoordinatesByRankByLogicalColour.countPassedPawns' failed for passed Pawns isolated from opposing Pawn." ~: Data.Array.IArray.elems (+		Data.Array.IArray.amap length . State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			Component.Piece.mkPawn *** Cartesian.Coordinates.mkRelativeCoordinates+		) [+			(+				Attribute.LogicalColour.Black,+				Control.Arrow.second succ+			), (+				Attribute.LogicalColour.White,+				Control.Arrow.first (+ 2)+			)+		]+	) ~?= [1, 1],+	"'BishBosh.State.CoordinatesByRankByLogicalColour.countPassedPawns' failed for un-passed Pawn approaching opposing Pawn." ~: Data.Array.IArray.elems (+		 Data.Array.IArray.amap length . State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			Component.Piece.mkPawn *** Cartesian.Coordinates.mkRelativeCoordinates+		) [+			(+				Attribute.LogicalColour.White,+				id+			), (+				Attribute.LogicalColour.Black,+				succ *** succ+			)+		]+	) ~?= [0, 0],+	"'BishBosh.State.CoordinatesByRankByLogicalColour.countPassedPawns' failed for un-passed Pawn sandwiched by opposing Pawns." ~: Data.Array.IArray.elems (+		 Data.Array.IArray.amap length . State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			Component.Piece.mkPawn *** Cartesian.Coordinates.mkRelativeCoordinates+		) [+			(+				Attribute.LogicalColour.Black,+				id+			), (+				Attribute.LogicalColour.White,+				succ *** succ+			), (+				Attribute.LogicalColour.Black,+				(+ 2) *** (+ 2)+			)+		]+	) ~?= [1, 0],+	"'BishBosh.State.CoordinatesByRankByLogicalColour.countPassedPawns' failed for un-passed Pawn between doubled opposing Pawns." ~: Data.Array.IArray.elems (+		Data.Array.IArray.amap length . State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			Component.Piece.mkPawn *** Cartesian.Coordinates.mkRelativeCoordinates+		) [+			(+				Attribute.LogicalColour.Black,+				id+			), (+				Attribute.LogicalColour.Black,+				Control.Arrow.second (+ 2)+			), (+				Attribute.LogicalColour.White,+				succ *** succ+			)+		]+	) ~?= [1, 0],+	let+		whitePawnsCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+	in not (+		State.Board.exposesKing Attribute.LogicalColour.White (+			Component.Move.mkMove whitePawnsCoordinates $ Cartesian.Coordinates.advance Attribute.LogicalColour.White whitePawnsCoordinates+		) $ placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkPawn Attribute.LogicalColour.White,+				whitePawnsCoordinates+			), (+				Component.Piece.mkPawn Attribute.LogicalColour.Black,+				Cartesian.Coordinates.mkRelativeCoordinates $ (+ 2) *** (+ 2)+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing false positive attack by black Pawn, after moving White Pawn.",+	let+		whitePawnsCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+	in not (+		State.Board.exposesKing Attribute.LogicalColour.White (+			Component.Move.mkMove whitePawnsCoordinates $ Cartesian.Coordinates.advance Attribute.LogicalColour.White whitePawnsCoordinates+		) $ placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkPawn Attribute.LogicalColour.White,+				whitePawnsCoordinates+			), (+				Component.Piece.mkKing Attribute.LogicalColour.Black,+				Cartesian.Coordinates.mkRelativeCoordinates $ (+ 2) *** (+ 2)+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing false positive attack by black King, after moving White Pawn.",+	let+		whiteBishopsCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+	in not (+		State.Board.exposesKing Attribute.LogicalColour.White (+			Component.Move.mkMove whiteBishopsCoordinates $ Cartesian.Coordinates.translate (succ *** succ) whiteBishopsCoordinates	-- Move towards Black Queen.+		) $ placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkBishop Attribute.LogicalColour.White,+				whiteBishopsCoordinates+			), (+				Component.Piece.mkQueen Attribute.LogicalColour.Black,+				maxBound+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing false positive attack by black Queen, after moving White Bishop.",+	let+		whitePawnsCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+	in State.Board.exposesKing Attribute.LogicalColour.White (+		Component.Move.mkMove whitePawnsCoordinates $ Cartesian.Coordinates.advance Attribute.LogicalColour.White whitePawnsCoordinates	-- Expose attack from Black Queen.+	) (+		placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkPawn Attribute.LogicalColour.White,+				whitePawnsCoordinates+			), (+				Component.Piece.mkQueen Attribute.LogicalColour.Black,+				maxBound+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing failed after advancing White Pawn.",+	let+		whiteKnightsCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+	in State.Board.exposesKing Attribute.LogicalColour.White (+		Component.Move.mkMove whiteKnightsCoordinates . Cartesian.Coordinates.mkRelativeCoordinates $ (+ 3) *** (+ 2)	-- Expose attack from Black Queen.+	) (+		placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkKnight Attribute.LogicalColour.White,+				whiteKnightsCoordinates+			), (+				Component.Piece.mkQueen Attribute.LogicalColour.Black,+				maxBound+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing failed after moving White Knight.",+	let+		whiteRooksCoordinates	= Cartesian.Coordinates.mkRelativeCoordinates $ (+ 2) *** (+ 2)+	in not (+		State.Board.exposesKing Attribute.LogicalColour.White (+			Component.Move.mkMove whiteRooksCoordinates $ Cartesian.Coordinates.advance Attribute.LogicalColour.White whiteRooksCoordinates	-- Shift blocking-role to Pawn.+		) $ placePieces [+			(+				Component.Piece.mkKing Attribute.LogicalColour.White,+				minBound+			), (+				Component.Piece.mkPawn Attribute.LogicalColour.White,+				Cartesian.Coordinates.mkRelativeCoordinates $ succ *** succ+			), (+				Component.Piece.mkRook Attribute.LogicalColour.White,+				whiteRooksCoordinates+			), (+				Component.Piece.mkQueen Attribute.LogicalColour.Black,+				maxBound+			)+		]+	) ~? "'BishBosh.State.Board.exposesKing failed after moving White Rook.",+	Data.Foldable.all (+		Data.Foldable.all (== 1)+	) (+		State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour $ State.Board.getCoordinatesByRankByLogicalColour (Data.Default.def :: Board)+	) ~? "'BishBosh.State.Board.countPawnsByFileByLogicalColour': failed for default board",+	(+		(== [(0, 3), (2, 2), (4, 1)]) . Data.Map.assocs . (! Attribute.LogicalColour.White) . State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour . placePieces $ map (+			(,) (Component.Piece.mkPawn Attribute.LogicalColour.White) . Cartesian.Coordinates.mkRelativeCoordinates+		) [+			Control.Arrow.second succ,+			Control.Arrow.second (+ 3),+			Control.Arrow.second (+ 5),+			(+ 2) *** (+ 2),+			(+ 2) *** (+ 4),+			(+ 4) *** succ+		]+	) ~? "'BishBosh.State.Board.countPawnsByFileByLogicalColour': failed",+	(+		Data.Map.unions (+			Data.Array.IArray.elems $ State.Board.countDefendersByCoordinatesByLogicalColour (Data.Default.def :: Board)+		) == foldr (+			Data.Map.delete . Cartesian.Coordinates.kingsStartingCoordinates+		) (+			Data.Map.fromList $ zip [+				Cartesian.Coordinates.mkCoordinates x y |+					y	<- [+						Cartesian.Ordinate.yMax,+						Cartesian.Ordinate.pawnsFirstRank Attribute.LogicalColour.Black,+						Cartesian.Ordinate.pawnsFirstRank Attribute.LogicalColour.White,+						Cartesian.Ordinate.yMin+					],+					x	<- Cartesian.Abscissa.xRange+			] [+				0, 1, 1, 1, 1, 1, 1, 0,	-- Black Pieces.+				1, 1, 1, 4, 4, 1, 1, 1,	-- Black Pawns.+				1, 1, 1, 4, 4, 1, 1, 1,	-- White Pawns.+				0, 1, 1, 1, 1, 1, 1, 0	-- White Pieces.+			]+		) Attribute.LogicalColour.range+	) ~? "'BoshBosh.State.Board.countDefendersByCoordinatesByLogicalColour': failed"+ ] where+	placePieces :: [(Component.Piece.Piece, Test.HUnit.Cartesian.Coordinates.Coordinates)] -> Board+	placePieces	= foldr (uncurry State.Board.placePiece) Property.Empty.empty {-Board-}+
+ src-test/BishBosh/Test/QuickCheck/Attribute/CaptureMoveSortAlgorithm.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Attribute.CaptureMoveSortAlgorithm() where++import qualified	BishBosh.Attribute.CaptureMoveSortAlgorithm	as Attribute.CaptureMoveSortAlgorithm+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm where+	arbitrary	= Test.QuickCheck.elements Attribute.CaptureMoveSortAlgorithm.range+
+ src-test/BishBosh/Test/QuickCheck/Attribute/CriterionWeight.hs view
@@ -0,0 +1,37 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Attribute.CriterionWeight() where++import qualified	BishBosh.Attribute.CriterionWeight	as Attribute.CriterionWeight+import qualified	Test.QuickCheck++instance (+	Fractional	criterionWeight,+	Ord		criterionWeight,+	Show		criterionWeight+ ) => Test.QuickCheck.Arbitrary (Attribute.CriterionWeight.CriterionWeight criterionWeight) where+	arbitrary	= (Attribute.CriterionWeight.mkCriterionWeight . (/ 10) . fromInteger) `fmap` Test.QuickCheck.elements [0 .. 9]+
+ src-test/BishBosh/Test/QuickCheck/Attribute/Direction.hs view
@@ -0,0 +1,86 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Attribute.Direction(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Direction	as Attribute.Direction+import qualified	BishBosh.Property.Opposable	as Property.Opposable+import qualified	BishBosh.Property.Orientated	as Property.Orientated+import qualified	BishBosh.Property.Reflectable	as Property.Reflectable+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary Attribute.Direction.Direction where+	arbitrary	= Test.QuickCheck.elements Attribute.Direction.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Direction.prop_read" $ case (reads garbage :: [(Attribute.Direction.Direction, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Attribute.Direction.Direction -> String -> Test.QuickCheck.Property+		f direction	= Test.QuickCheck.label "Direction.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` "ewEW") direction+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_reflectOnY" . uncurry (==) . (id &&& Property.Reflectable.reflectOnY . Property.Reflectable.reflectOnY)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_getOpposite/Reflectable" . uncurry (==) . (Property.Opposable.getOpposite &&& Property.Reflectable.reflectOnY . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_areAligned" . uncurry Attribute.Direction.areAligned . (id &&& Property.Opposable.getOpposite)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Attribute.Direction.Direction -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Direction.prop_isParallel" . uncurry (/=) . (Property.Orientated.isDiagonal &&& Property.Orientated.isParallel)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f+ ]+++
+ src-test/BishBosh/Test/QuickCheck/Attribute/LogicalColour.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Attribute.LogicalColour(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour+import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Attribute.LogicalColour.LogicalColour where+	arbitrary	= Test.QuickCheck.elements Attribute.LogicalColour.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "LogicalColour.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4 } f,+	let+		f :: Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Property+		f logicalColour	= Test.QuickCheck.label "LogicalColour.prop_fen" $ case Property.ForsythEdwards.readsFEN $ Property.ForsythEdwards.showFEN logicalColour of+			[(logicalColour', "")]	-> logicalColour' == logicalColour+			_			-> False+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4 } f+ ]++
+ src-test/BishBosh/Test/QuickCheck/Attribute/MoveType.hs view
@@ -0,0 +1,85 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Attribute.MoveType(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.MoveType	as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary Attribute.MoveType.MoveType where+	arbitrary	= Test.QuickCheck.frequency [+		(+			2,+			Test.QuickCheck.elements [Attribute.MoveType.shortCastle, Attribute.MoveType.longCastle]+		), (+			1,+			return {-to Gen-monad-} Attribute.MoveType.enPassant+		), (+			7,+			Attribute.MoveType.mkNormalMoveType <$> Test.QuickCheck.oneof [+				return {-to Gen-monad-} Nothing,+				Test.QuickCheck.elements $ map Just Attribute.Rank.expendable+			] <*> Test.QuickCheck.frequency [+				(+					9,	return {-to Gen-monad-} Nothing+				), (+					1,	Test.QuickCheck.elements $ map Just Attribute.Rank.promotionProspects+				)+			]+		)+	 ]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Attribute.MoveType.MoveType -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "MoveType.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "MoveType.prop_read" $ case (reads garbage :: [(Attribute.MoveType.MoveType, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Attribute.MoveType.MoveType -> String -> Test.QuickCheck.Property+		f moveType	= Test.QuickCheck.label "MoveType.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+			const False+		 ) moveType+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f,+	let+		f :: Attribute.MoveType.MoveType -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "MoveType.prop_isQuiet" . uncurry (==) . (+			Attribute.MoveType.isQuiet &&& not . uncurry (||) . (Attribute.MoveType.isCapture &&& Attribute.MoveType.isPromotion)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64} f+ ]
+ src-test/BishBosh/Test/QuickCheck/Attribute/Rank.hs view
@@ -0,0 +1,56 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Attribute.Rank(+-- * Constants+	results+) where++import qualified	BishBosh.Attribute.Rank	as Attribute.Rank+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary Attribute.Rank.Rank where+	arbitrary	= Test.QuickCheck.elements Attribute.Rank.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Attribute.Rank.Rank -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Rank.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Rank.prop_read" $ case (reads garbage :: [(Attribute.Rank.Rank, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Attribute.Rank.Rank -> String -> Test.QuickCheck.Property+		f rank	= Test.QuickCheck.label "Rank.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) rank+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Attribute/RankValues.hs view
@@ -0,0 +1,48 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Attribute.RankValues(+-- * Types+-- ** Type-synonyms+	RankValues+) where++import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Attribute.RankValues	as Attribute.RankValues+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck++instance (+	Fractional	rankValue,+	Ord		rankValue,+	Show		rankValue+ ) => Test.QuickCheck.Arbitrary (Attribute.RankValues.RankValues rankValue) where+	arbitrary	= Attribute.RankValues.fromAssocs . zip Attribute.Rank.range . map (+		recip . fromInteger . succ . (`mod` 100)	-- Normalise to the half open unit-interval (0,1].+	 ) <$> Test.QuickCheck.vector Attribute.Rank.nDistinctRanks++-- | Defines a concrete type for testing.+type RankValues	= Attribute.RankValues.RankValues T.RankValue+
+ src-test/BishBosh/Test/QuickCheck/Cartesian/Coordinates.hs view
@@ -0,0 +1,180 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Cartesian.Coordinates(+-- * Types+-- ** Type-synonyms+	Coordinates,+-- * Constants+	results,+-- * Functions+	translate+) where++import			BishBosh.Test.QuickCheck.Attribute.Direction()+import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Direction	as Attribute.Direction+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Vector	as Cartesian.Vector+import qualified	BishBosh.Property.Reflectable	as Property.Reflectable+import qualified	BishBosh.Property.Rotatable	as Property.Rotatable+import qualified	BishBosh.Types			as T+import qualified	Data.Array.IArray+import qualified	Data.List.Extra+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.Ix+import qualified	ToolShed.Test.ReversibleIO+import			Test.QuickCheck((==>))++-- | Defines a concrete type for testing.+type Coordinates	= Cartesian.Coordinates.Coordinates T.X T.Y++instance (Enum x, Enum y) => Test.QuickCheck.Arbitrary (Cartesian.Coordinates.Coordinates x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Coordinates #-}+	arbitrary	= Test.QuickCheck.elements Cartesian.Coordinates.range++-- | Re-cast the specified coordinates.+translate :: (+	Integral	x,+	Integral	y,+	Num		p,+	Num		q+ )+	=> Cartesian.Coordinates.Coordinates x y+	-> Cartesian.Coordinates.Coordinates p q+translate coordinates	= coordinates {+	Cartesian.Coordinates.getX	= fromIntegral $ Cartesian.Coordinates.getX coordinates,+	Cartesian.Coordinates.getY	= fromIntegral $ Cartesian.Coordinates.getY coordinates+}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results = sequence [+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinates.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Coordinates.prop_read" $ case (+			reads garbage	:: [(Coordinates, String)]+		 ) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> String -> Test.QuickCheck.Property+		f coordinates	= Test.QuickCheck.label "Coordinates.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) coordinates+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinates.prop_ix" . ToolShed.Test.Ix.index+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f coordinates	= Test.QuickCheck.label "Coordinates.prop_fromIx" $ Cartesian.Coordinates.fromIx (Data.Array.IArray.index (minBound, maxBound) coordinates) == coordinates+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f	:: Coordinates -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinates.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinates.prop_reflectOnY" . uncurry (==) . (id &&& Property.Reflectable.reflectOnY . Property.Reflectable.reflectOnY)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinates.prop_rotate180" . uncurry (==) . (Property.Rotatable.rotate180 &&& Property.Rotatable.rotate180)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f coordinates	= Test.QuickCheck.label "Coordinates.prop_rotateIdentity" $ all ((== coordinates) . ($ coordinates)) [+			Property.Rotatable.rotate90 . Property.Rotatable.rotate90 . Property.Rotatable.rotate90 . Property.Rotatable.rotate90,+			Property.Rotatable.rotate180 . Property.Rotatable.rotate180,+			Property.Rotatable.rotate270 . Property.Rotatable.rotate270 . Property.Rotatable.rotate270 . Property.Rotatable.rotate270+		 ]+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f coordinates	= Test.QuickCheck.label "Coordinates.prop_rotate180/identity" . Data.List.Extra.allSame $ map ($ coordinates) [+			Property.Rotatable.rotate180,+			Property.Rotatable.rotate90 . Property.Rotatable.rotate90,+			Property.Rotatable.rotate270 . Property.Rotatable.rotate270+		 ]+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Coordinates -> Test.QuickCheck.Property+		f source destination	= Test.QuickCheck.label "Coordinates.prop_interpolateInt" $ Cartesian.Coordinates.interpolate source destination == map translate (+			Cartesian.Coordinates.interpolate (+				translate source	:: Cartesian.Coordinates.Coordinates Integer Integer	-- Force use of unspecialised instance.+			) (+				translate destination+			)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Attribute.Direction.Direction -> Coordinates -> Test.QuickCheck.Property+		f direction source	= Test.QuickCheck.label "Coordinates.prop_extrapolateInt" $ Cartesian.Coordinates.extrapolate direction source == map translate (+			Cartesian.Coordinates.extrapolate direction (+				translate source	:: Cartesian.Coordinates.Coordinates Integer Integer	-- Force use of unspecialised instance.+			)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Attribute.Direction.Direction -> Coordinates -> Test.QuickCheck.Property+		f direction source	= Test.QuickCheck.label "Coordinates.prop_extrapolate" . (+			\extrapolation -> let+				destination+					| null extrapolation	= source+					| otherwise		= last extrapolation+			 in source : extrapolation == reverse (+				destination : Cartesian.Coordinates.interpolate destination source+			 )+		 ) $ Cartesian.Coordinates.extrapolate direction source+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Coordinates -> Test.QuickCheck.Property+		f source destination	= Cartesian.Vector.isStraight (+			Cartesian.Vector.measureDistance source destination	:: Cartesian.Vector.VectorInt+		 ) ==> Test.QuickCheck.label "Coordinates.prop_interpolate" $ source : Cartesian.Coordinates.interpolate source destination == reverse (+			destination : Cartesian.Coordinates.interpolate destination source+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Coordinates -> Test.QuickCheck.Property+		f coordinates	= Test.QuickCheck.label "Coordinates.prop_radiusSquared" $ Data.List.Extra.allSame [+			Cartesian.Coordinates.radiusSquared ! transform coordinates :: T.RadiusSquared | transform <- [+				id,+				Property.Reflectable.reflectOnX,+				Property.Reflectable.reflectOnY,+				Property.Rotatable.rotate90,+				Property.Rotatable.rotate180,+				Property.Rotatable.rotate270+			]+		 ] -- List-comprehension.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Cartesian/Vector.hs view
@@ -0,0 +1,97 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Cartesian.Vector(+-- * Constants+	results+) where++import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate			as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector			as Cartesian.Vector+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Property.Orientated			as Property.Orientated+import qualified	BishBosh.Test.QuickCheck.Cartesian.Coordinates	as Test.QuickCheck.Cartesian.Coordinates+import qualified	BishBosh.Types					as T+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++instance Integral distance => Test.QuickCheck.Arbitrary (Cartesian.Vector.Vector distance) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Cartesian.Vector.VectorInt #-}+	arbitrary	= do+		source		<- Test.QuickCheck.arbitrary :: Test.QuickCheck.Gen Test.QuickCheck.Cartesian.Coordinates.Coordinates+		destination	<- Test.QuickCheck.suchThat Test.QuickCheck.arbitrary (/= source)++		return {-to Gen-monad-} $ Cartesian.Vector.measureDistance source destination++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Cartesian.Vector.VectorInt -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Vector.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f	:: Cartesian.Vector.VectorInt -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Vector.prop_orthogonal" . not . uncurry (&&) . (Property.Orientated.isDiagonal &&& Property.Orientated.isParallel)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Cartesian.Vector.VectorInt -> Test.QuickCheck.Property+		f vector	= not (Property.Orientated.isStraight vector) ==> Test.QuickCheck.label "Vector.prop_straight" . not . uncurry (||) $ (Property.Orientated.isDiagonal &&& Property.Orientated.isParallel) vector+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: (T.Distance, T.Distance) -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Test.QuickCheck.Property+		f (distanceX, distanceY) coordinates	= Test.QuickCheck.label "Vector.prop_maybeTranslate" $ Cartesian.Coordinates.maybeTranslate (deltaX *** deltaY) coordinates == (+			Cartesian.Coordinates.maybeTranslateX deltaX coordinates >>= Cartesian.Coordinates.maybeTranslateY deltaY+		 ) where+			deltaX	:: T.X -> T.X+			deltaX = (+				+ fromIntegral (+					(distanceX `mod` Cartesian.Abscissa.xLength) - (Cartesian.Abscissa.xLength `div` 2)+				)+			 )++			deltaY	:: T.Y -> T.Y+			deltaY	= (+				+ fromIntegral (+					(distanceY `mod` Cartesian.Ordinate.yLength) - (Cartesian.Ordinate.yLength `div` 2)+				)+			 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Test.QuickCheck.Property+		f source destination = Test.QuickCheck.label "Vector.prop_measureDistance => translate" $ Cartesian.Vector.translate source (+			Cartesian.Vector.measureDistance source destination	:: Cartesian.Vector.VectorInt+		 ) == destination+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Test.QuickCheck.Property+		f source destination = Test.QuickCheck.label "Vector.prop_translate" $ Cartesian.Vector.measureDistance source destination == Property.Opposable.getOpposite (+			Cartesian.Vector.measureDistance destination source	:: Cartesian.Vector.VectorInt+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Component/Move.hs view
@@ -0,0 +1,101 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Component.Move(+-- * Types+-- ** Type-synonyms+	Move,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Cartesian.Coordinates()+import			Control.Arrow((&&&))+import qualified	BishBosh.Cartesian.Vector	as Cartesian.Vector+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Property.Opposable	as Property.Opposable+import qualified	BishBosh.Property.Orientated	as Property.Orientated+import qualified	BishBosh.Property.Reflectable	as Property.Reflectable+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import			Test.QuickCheck((==>))++-- | Defines a concrete type for testing.+type Move	= Component.Move.Move T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Component.Move.Move x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Move #-}+	arbitrary	= fmap (uncurry Component.Move.mkMove) . Test.QuickCheck.suchThat Test.QuickCheck.arbitrary $ uncurry (/=)++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Move -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Move.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Move.prop_read" $ case (reads garbage :: [(Move, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Move -> String -> Test.QuickCheck.Property+		f move	= Test.QuickCheck.label "Move.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) move+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Move -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Move.prop_orthogonal" . not . uncurry (&&) . (Property.Orientated.isDiagonal &&& Property.Orientated.isParallel)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Move -> Test.QuickCheck.Property+		f move	= not (Property.Orientated.isStraight move) ==> Test.QuickCheck.label "Move.prop_straight" . not . uncurry (||) $ (Property.Orientated.isDiagonal &&& Property.Orientated.isParallel) move+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Move -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Move.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Move -> Test.QuickCheck.Property+		f move	= Test.QuickCheck.label "Move.prop_measureDistance" $ Component.Move.measureDistance (Property.Opposable.getOpposite move) == Property.Opposable.getOpposite (+			Component.Move.measureDistance move	:: Cartesian.Vector.VectorInt+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Move -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Move.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f	 :: Move -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Move.prop_reflectOnY" . uncurry (==) . (id &&& Property.Reflectable.reflectOnY . Property.Reflectable.reflectOnY)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Component/Piece.hs view
@@ -0,0 +1,81 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Component.Piece(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Test.QuickCheck.Cartesian.Coordinates	as Test.QuickCheck.Cartesian.Coordinates+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import			Test.QuickCheck((==>))++instance Test.QuickCheck.Arbitrary Component.Piece.Piece where+	arbitrary	= Test.QuickCheck.elements Component.Piece.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Component.Piece.Piece -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Piece.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Component.Piece.Piece -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Piece.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Piece.prop_read" $ case (reads garbage :: [(Component.Piece.Piece, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Component.Piece.Piece -> String -> Test.QuickCheck.Property+		f piece	= Test.QuickCheck.label "Piece.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) piece+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Component.Piece.Piece -> Test.QuickCheck.Property+		f piece	= Test.QuickCheck.label "Piece.prop_fen" $ case Property.ForsythEdwards.readsFEN $ Property.ForsythEdwards.showFEN piece of+			[(piece', "")]	-> piece' == piece+			_		-> False+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Component.Piece.Piece -> Test.QuickCheck.Property+		f coordinates piece	= Component.Piece.getRank piece `elem` Attribute.Rank.fixedAttackRange ==> Test.QuickCheck.label "Piece.prop_findAttackDestinationsInt" $ Component.Piece.findAttackDestinations coordinates piece == map Test.QuickCheck.Cartesian.Coordinates.translate (+			Component.Piece.findAttackDestinations (+				Test.QuickCheck.Cartesian.Coordinates.translate coordinates	:: Cartesian.Coordinates.Coordinates Integer Integer	-- Force use of unspecialised instance.+			) piece+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Component/QualifiedMove.hs view
@@ -0,0 +1,76 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Component.QualifiedMove(+-- * Types+-- ** Type-synonyms+--	QualifiedMove,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.MoveType()+import			BishBosh.Test.QuickCheck.Component.Move()+import			Control.Arrow((&&&))+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Property.Reflectable		as Property.Reflectable+import qualified	BishBosh.Types				as T+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type QualifiedMove	= Component.QualifiedMove.QualifiedMove T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Component.QualifiedMove.QualifiedMove x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary QualifiedMove #-}+	arbitrary	= uncurry Component.QualifiedMove.mkQualifiedMove `fmap` Test.QuickCheck.arbitrary	-- CAVEAT: the move & moveType are unlikely to be compatible.++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: QualifiedMove -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "QualifiedMove.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "QualifiedMove.prop_read" $ case (reads garbage :: [(QualifiedMove, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: QualifiedMove -> String -> Test.QuickCheck.Property+		f qualifiedMove	= Test.QuickCheck.label "QualifiedMove.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) qualifiedMove+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: QualifiedMove -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "QualifiedMove.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Component/Turn.hs view
@@ -0,0 +1,146 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Component.Turn(+-- * Types+-- ** Type-synonyms+	Turn,+-- * Constants+--	rankValues,+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			BishBosh.Test.QuickCheck.Attribute.MoveType()+import			BishBosh.Test.QuickCheck.Component.Move()+import			BishBosh.Test.QuickCheck.Component.Piece()+import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.MoveType			as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Attribute.RankValues			as Attribute.RankValues+import qualified	BishBosh.Component.Move				as Component.Move+import qualified	BishBosh.Component.Piece			as Component.Piece+import qualified	BishBosh.Component.QualifiedMove		as Component.QualifiedMove+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.Test.QuickCheck.Attribute.RankValues	as Test.QuickCheck.Attribute.RankValues+import qualified	BishBosh.Types					as T+import qualified	Control.Arrow+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Test.QuickCheck+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.Triple+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type Turn	= Component.Turn.Turn T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Component.Turn.Turn x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Turn #-}+	arbitrary	= do+		moveType	<- Test.QuickCheck.arbitrary+		(move, piece)	<- case moveType of+			Attribute.MoveType.Castle _	-> fmap (+				ToolShed.Data.Triple.getSecond . Data.Maybe.fromJust . Data.List.find (+					(== moveType) . ToolShed.Data.Triple.getFirst+				) . (Component.Move.castlingMovesByLogicalColour !) &&& Component.Piece.mkKing+			 ) Test.QuickCheck.arbitrary {-logicalColour-}+			Attribute.MoveType.EnPassant	-> (,) <$> Test.QuickCheck.arbitrary {-piece. CAVEAT: very lax-} <*> fmap Component.Piece.mkPawn Test.QuickCheck.arbitrary {-logicalColour-}+			_				-> Test.QuickCheck.arbitrary	-- CAVEAT: the move-vector isn't tailored to the rank of piece.++		return {-to Gen-monad-} . Component.Turn.mkTurn (Component.QualifiedMove.mkQualifiedMove move moveType) $ Component.Piece.getRank piece++-- | Distinct rank-values designed for a predictable sort-order.+rankValues :: Test.QuickCheck.Attribute.RankValues.RankValues+rankValues	= Attribute.RankValues.fromAssocs . zip Attribute.Rank.range $ map (/ 10) [1, 5, 3, 4, 9, 0]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Turn -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Turn.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Turn.prop_read" $ case (reads garbage :: [(Turn, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Turn -> String -> Test.QuickCheck.Property+		f turn	= Test.QuickCheck.label "Turn.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) turn+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Turn -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Turn.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Test.QuickCheck.Attribute.RankValues.RankValues -> [Turn] -> Test.QuickCheck.Property+		f rankValues'	= Test.QuickCheck.label "Turn.prop_compareByMVVLVA/quiet" . uncurry (==) . (+			dropWhile Component.Turn.isCapture . Data.List.sortBy (+				Component.Turn.compareByMVVLVA (`Attribute.RankValues.findRankValue` rankValues')+			) &&& filter (+				not . Component.Turn.isCapture+			)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: [Turn] -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Turn.prop_compareByMVVLVA/MVV" . (+			\ranks -> Data.List.sortOn (+				negate . (`Attribute.RankValues.findRankValue` rankValues) -- Most valuable victim should be first.+			) ranks == ranks+		 ) . map head . Data.List.group . Data.Maybe.mapMaybe (+			Attribute.MoveType.getMaybeImplicitlyTakenRank . Component.QualifiedMove.getMoveType . Component.Turn.getQualifiedMove+		 ) . Data.List.sortBy (+			Component.Turn.compareByMVVLVA (`Attribute.RankValues.findRankValue` rankValues)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: [Turn] -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Turn.prop_compareByMVVLVA/LVA" . all (+			(+				\ranks -> uncurry (++) (+					Control.Arrow.first (+						Data.List.sortOn (`Attribute.RankValues.findRankValue` rankValues)	-- Least valuable aggressor should be first.+					) $ Data.List.partition (/= Attribute.Rank.King) ranks+				) == ranks+			) . map head . Data.List.group . map Component.Turn.getRank {-aggressor's rank-}+		 ) . Data.List.groupBy (+			ToolShed.Data.List.equalityBy $ Attribute.MoveType.getMaybeImplicitlyTakenRank . Component.QualifiedMove.getMoveType . Component.Turn.getQualifiedMove+		 ) . takeWhile Component.Turn.isCapture . Data.List.sortBy (+			Component.Turn.compareByMVVLVA (`Attribute.RankValues.findRankValue` rankValues)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Component/Zobrist.hs view
@@ -0,0 +1,107 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Component.Zobrist(+-- * Types+-- ** Type-synonyms+	Zobrist,+-- * Constants,+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Zobrist		as Component.Zobrist+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	BishBosh.Types				as T+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.List+import qualified	System.Random+import qualified	Test.QuickCheck++-- | Defines a concrete type for testing.+type Zobrist	= Component.Zobrist.Zobrist T.X T.Y T.PositionHash++instance (+	Data.Array.IArray.Ix	x,+	Data.Bits.FiniteBits	positionHash,+	Enum			x,+	Enum			y,+	Num			positionHash,+	Ord			y,+	Show			positionHash,+	System.Random.Random	positionHash+ ) => Test.QuickCheck.Arbitrary (Component.Zobrist.Zobrist x y positionHash) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Zobrist #-}+	arbitrary	= Component.Zobrist.mkZobrist <$> fmap (+		fmap (+			`mod` 3	-- CAVEAT: this value is limited by the width of 'T.PositionHash'.+		)+	 ) Test.QuickCheck.arbitrary <*> fmap System.Random.mkStdGen Test.QuickCheck.arbitrary++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Zobrist -> Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f zobrist game	= Test.QuickCheck.label "Zobrist.prop_hash2D(Game)/unique" . areUnique . map (+			(`Component.Zobrist.hash2D` zobrist) . (`Model.Game.applyQualifiedMove` game)+		 ) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Zobrist -> Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f zobrist game	= Test.QuickCheck.label "Zobrist.prop_hash2D(Position)/unique" . areUnique . map (+			(`Component.Zobrist.hash2D` zobrist) . Model.Game.mkPosition . (`Model.Game.applyQualifiedMove` game)+		 ) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Zobrist -> Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f zobrist game	= Test.QuickCheck.label "Zobrist.prop_(hash2D(Game) == hash2D(Position))" . all (+			uncurry (==)+		 ) . map (+			(+				(+					`Component.Zobrist.hash2D` zobrist+				) &&& (+					`Component.Zobrist.hash2D` zobrist+				) . Model.Game.mkPosition+			) . (`Model.Game.applyQualifiedMove` game)+		 ) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: Zobrist -> Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f zobrist game	= Test.QuickCheck.label "Zobrist.prop_incrementalEvaluation" . all (+			(+				\game' -> Component.Zobrist.hash2D game' zobrist == Model.Game.incrementalHash game (+					Component.Zobrist.hash2D game zobrist+				) game' zobrist+			) . (`Model.Game.applyQualifiedMove` game)+		 ) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ] where+	areUnique :: Ord a => [a] -> Bool+	areUnique	= all ((== 1) . length) . Data.List.group . Data.List.sort+
+ src-test/BishBosh/Test/QuickCheck/ContextualNotation/PGN.hs view
@@ -0,0 +1,160 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.ContextualNotation.PGN(+-- * Types+-- ** Type-synonyms+	PGN,+-- * Constants+--	ficsGamesDBGameNoTag,+--	ecoCodeTag,+	results+-- * Functions+--	arbitraryECOCode+) where++import			BishBosh.Test.QuickCheck.ContextualNotation.PGNComment()+import qualified	BishBosh.ContextualNotation.PGN			as ContextualNotation.PGN+import qualified	BishBosh.ContextualNotation.PGNComment		as ContextualNotation.PGNComment+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Test.QuickCheck.Model.Game		as Test.QuickCheck.Model.Game+import qualified	BishBosh.Types					as T+import qualified	Data.Word+import qualified	Test.QuickCheck++#ifndef USE_POLYPARSE+import qualified	Text.ParserCombinators.Parsec+#elif USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif++-- | Qualifies a value.+ficsGamesDBGameNoTag :: ContextualNotation.PGN.Tag+ficsGamesDBGameNoTag	= "FICSGamesDBGameNo"++-- | Qualifies a value.+ecoCodeTag :: ContextualNotation.PGN.Tag+ecoCodeTag		= "ECO"++-- | Returns an arbitrary ECO-code.+arbitraryECOCode :: Test.QuickCheck.Gen String+arbitraryECOCode	= do+	c	<- Test.QuickCheck.elements ['A' .. 'E']+	i	<- Test.QuickCheck.elements ['0' .. '9']+	j	<- Test.QuickCheck.elements ['0' .. '9']++	return {-to Gen-monad-} [c, i, j]++-- | Defines a concrete type for testing.+type PGN	= ContextualNotation.PGN.PGN T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Test.QuickCheck.Arbitrary (ContextualNotation.PGN.PGN x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary PGN #-}+	arbitrary	= let+		arbitraryString :: Test.QuickCheck.Gen String+		arbitraryString	= do+			s	<- filter (+				`notElem` ['\\', '\n', '\r', ContextualNotation.PGN.quoteDelimiter]+			 ) <$> Test.QuickCheck.arbitrary++			return {-to Gen-monad-} $ if s == [ContextualNotation.PGN.unknownTagValue]+				then '\\' : s+				else s++		arbitraryWord :: Test.QuickCheck.Gen String+		arbitraryWord	= (show :: Data.Word.Word -> String) <$> Test.QuickCheck.arbitrary++		arbitraryMaybeWord :: Test.QuickCheck.Gen (Maybe String)+		arbitraryMaybeWord	= Test.QuickCheck.oneof [+			return {-to Gen-monad-} Nothing,+			fmap Just arbitraryWord+		 ]+	 in ContextualNotation.PGN.mkPGN <$> fmap Just arbitraryString {-Event-} <*> fmap Just arbitraryString {-Site-} <*> fmap (+		toEnum . abs+	 ) Test.QuickCheck.arbitrary {-Day-} <*> arbitraryMaybeWord {-Round-} <*> fmap Just arbitraryString {-White-} <*> fmap Just arbitraryString {-Black-} <*> (+		do+			ficsGamesDBGameNo	<- arbitraryWord+			ecoCode			<- arbitraryECOCode++			return {-to Gen-monad-} [+				(+					ficsGamesDBGameNoTag,	ficsGamesDBGameNo+				), (+					ecoCodeTag,		ecoCode+				)+			 ] -- Optional tags.+	 ) <*> Test.QuickCheck.arbitrary {-Game-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Bool -> ContextualNotation.StandardAlgebraic.ValidateMoves -> Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f isStrictlySequential validateMoves game	= Test.QuickCheck.label "PGN.prop_moveTextParser" .+#ifdef USE_POLYPARSE+#if USE_POLYPARSE == 1+			(Model.Game.listTurns game ==) . Model.Game.listTurns+#else /* Plain */+			either (const False) ((Model.Game.listTurns game ==) . Model.Game.listTurns)+#endif+			. fst {-discard unparsed text-} . Poly.runParser moveTextParser+#else /* Parsec */+			either (const False) ((Model.Game.listTurns game ==) . Model.Game.listTurns) . Text.ParserCombinators.Parsec.parse moveTextParser "Move-text parser"+#endif+			$ ContextualNotation.PGN.showsMoveText game ""+			where+				moveTextParser	= ContextualNotation.PGN.moveTextParser isStrictlySequential validateMoves+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 128 } f,+	let+		f :: Bool -> ContextualNotation.StandardAlgebraic.ValidateMoves -> PGN -> [ContextualNotation.PGNComment.PGNComment] -> Test.QuickCheck.Property+		f isStrictlySequential validateMoves pgn pgnComments	= Test.QuickCheck.label "PGN.prop_pgnParser" .+#ifdef USE_POLYPARSE+#if USE_POLYPARSE == 1+			(== pgn)+#else /* Plain */+			either (const False) (== pgn)+#endif+			. fst {-discard unparsed text-} . Poly.runParser parser+#else /* Parsec */+			either (const False) (== pgn) . Text.ParserCombinators.Parsec.parse parser "PGN parser"+#endif+			. unlines . (+				\l -> zipWith (++) l $ map (showChar '\t' . show) pgnComments ++ repeat "" {-pad comment-list with null lines-}+			) . lines $ show pgn+			where+				parser	= ContextualNotation.PGN.parser isStrictlySequential validateMoves [ficsGamesDBGameNoTag, ecoCodeTag]+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/ContextualNotation/PGNComment.hs view
@@ -0,0 +1,70 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.ContextualNotation.PGNComment(+-- * Constants+	results+) where++import qualified	BishBosh.ContextualNotation.PGNComment	as ContextualNotation.PGNComment+import qualified	Test.QuickCheck++#ifndef USE_POLYPARSE+import qualified	Text.ParserCombinators.Parsec+#elif USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif++instance Test.QuickCheck.Arbitrary ContextualNotation.PGNComment.PGNComment where+	arbitrary	= Test.QuickCheck.arbitrary >>= (+		\s -> Test.QuickCheck.elements [+			ContextualNotation.PGNComment.BlockComment $ filter (`notElem` ['\\', ContextualNotation.PGNComment.blockCommentEnd]) s,+			ContextualNotation.PGNComment.LineComment $ filter (`notElem` ['\\', ContextualNotation.PGNComment.lineCommentEnd]) s+		]+	 )+-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: ContextualNotation.PGNComment.PGNComment -> Test.QuickCheck.Property+		f pgnComment	= Test.QuickCheck.label "PGNComment.prop_io" .+#ifdef USE_POLYPARSE+#if USE_POLYPARSE == 1+			(== s)+#else /* Plain */+			either (const False) (== s)+#endif+			. fst {-discard unparsed text-} . Poly.runParser ContextualNotation.PGNComment.parser+#else /* Parsec */+			either (const False) (== s) . Text.ParserCombinators.Parsec.parse ContextualNotation.PGNComment.parser "PGN parser"+#endif+			$ show pgnComment where+				s	= ContextualNotation.PGNComment.getString pgnComment+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f++ ]
+ src-test/BishBosh/Test/QuickCheck/ContextualNotation/PositionHashQualifiedMoveTree.hs view
@@ -0,0 +1,89 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.ContextualNotation.PositionHashQualifiedMoveTree(+-- * Types+-- ** Type-synonyms+--	PositionHashQualifiedMoveTree,+-- * Constants+	results+) where++import qualified	BishBosh.Component.QualifiedMove				as Component.QualifiedMove+import qualified	BishBosh.Component.Turn						as Component.Turn+import qualified	BishBosh.ContextualNotation.PositionHashQualifiedMoveTree	as ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest			as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Input.EvaluationOptions				as Input.EvaluationOptions+import qualified	BishBosh.Input.StandardOpeningOptions				as Input.StandardOpeningOptions+import qualified	BishBosh.Model.Game						as Model.Game+import qualified	BishBosh.Model.GameTree						as Model.GameTree+import qualified	BishBosh.Property.Null						as Property.Null+import qualified	BishBosh.Test.QuickCheck.Component.Zobrist			as Test.QuickCheck.Component.Zobrist+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.QualifiedMoveForest	as Test.QuickCheck.ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Types							as T+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Tree+import qualified	System.Random+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++-- | Defines a concrete type for testing.+type PositionHashQualifiedMoveTree	= ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree T.X T.Y T.PositionHash++instance (+	Data.Array.IArray.Ix	x,+	Data.Bits.FiniteBits	positionHash,+	Enum			x,+	Enum			y,+	Num			positionHash,+	Ord			x,+	Ord			y,+	Show			positionHash,+	Show			x,+	Show			y,+	System.Random.Random	positionHash+ ) => Test.QuickCheck.Arbitrary (ContextualNotation.PositionHashQualifiedMoveTree.PositionHashQualifiedMoveTree x y positionHash) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary PositionHashQualifiedMoveTree #-}+	arbitrary	= ContextualNotation.PositionHashQualifiedMoveTree.fromQualifiedMoveForest <$> Test.QuickCheck.arbitrary {-IncrementalEvaluation-} <*> Test.QuickCheck.arbitrary {-Zobrist-} <*> Test.QuickCheck.arbitrary {-QualifiedMoveForest-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Input.EvaluationOptions.IncrementalEvaluation -> Input.StandardOpeningOptions.MatchSwitches -> Test.QuickCheck.Component.Zobrist.Zobrist -> Test.QuickCheck.ContextualNotation.QualifiedMoveForest.QualifiedMoveForest -> Test.QuickCheck.Property+		f incrementalEvaluation tryToMatchSwitches zobrist qualifiedMoveForest	= not (Property.Null.isNull qualifiedMoveForest) ==> Test.QuickCheck.label "PositionHashQualifiedMoveTree.prop_findNextOnymousQualifiedMoves" $ all (+			(+				\(previousGame, lastTurn)	-> Data.Maybe.isJust . Data.List.find (+					(+						== Component.QualifiedMove.getMove (Component.Turn.getQualifiedMove lastTurn)+					) . Component.QualifiedMove.getMove . fst {-qualifiedMove-}+				) . ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMoves tryToMatchSwitches previousGame $ ContextualNotation.PositionHashQualifiedMoveTree.fromQualifiedMoveForest incrementalEvaluation zobrist qualifiedMoveForest+			) . head . Model.Game.rollBack+		 ) . tail {-drop the default game-} . Data.Tree.flatten . Model.GameTree.deconstruct $ ContextualNotation.QualifiedMoveForest.toGameTree qualifiedMoveForest+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 8 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/ContextualNotation/QualifiedMoveForest.hs view
@@ -0,0 +1,79 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.ContextualNotation.QualifiedMoveForest(+-- * Types+-- ** Type-synonyms+	QualifiedMoveForest,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.ContextualNotation.PGN()+import			Control.Arrow((&&&))+import qualified	BishBosh.ContextualNotation.QualifiedMoveForest	as ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Model.GameTree				as Model.GameTree+import qualified	BishBosh.Property.Null				as Property.Null+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.Types					as T+import qualified	Data.Foldable+import qualified	Data.Tree+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Test.QuickCheck.Arbitrary (ContextualNotation.QualifiedMoveForest.QualifiedMoveForest x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary QualifiedMoveForest #-}+	arbitrary	= fmap ContextualNotation.QualifiedMoveForest.fromPGNDatabase Test.QuickCheck.arbitrary++-- | Defines a concrete type for testing.+type QualifiedMoveForest	= ContextualNotation.QualifiedMoveForest.QualifiedMoveForest T.X T.Y++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: QualifiedMoveForest -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "QualifiedMoveForest.prop_findMinimumPieces" . uncurry (==) . (+			ContextualNotation.QualifiedMoveForest.findMinimumPieces &&& Data.Foldable.minimum . fmap (+				State.Board.getNPieces . Model.Game.getBoard+			) . Model.GameTree.deconstruct . ContextualNotation.QualifiedMoveForest.toGameTree+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: QualifiedMoveForest -> Test.QuickCheck.Property+		f qualifiedMoveForest	= not (Property.Null.isNull qualifiedMoveForest) ==> Test.QuickCheck.label "QualifiedMoveForest.prop_count" . uncurry (==) $ (+			snd {-nMoves-} . ContextualNotation.QualifiedMoveForest.count &&& length . tail {-remove the apex-} . Data.Tree.flatten . Model.GameTree.deconstruct . ContextualNotation.QualifiedMoveForest.toGameTree+		 ) qualifiedMoveForest+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/ContextualNotation/StandardAlgebraic.hs view
@@ -0,0 +1,85 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.ContextualNotation.StandardAlgebraic(+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.Rank()+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Component.Turn				as Component.Turn+import qualified	BishBosh.ContextualNotation.StandardAlgebraic	as ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Model.Game				as Model.Game+import qualified	BishBosh.Test.QuickCheck.Model.Game		as Test.QuickCheck.Model.Game+import qualified	Test.QuickCheck++#ifdef USE_POLYPARSE+import			Control.Arrow((***))+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy		as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain		as Poly+#endif+#else /* Parsec */+import qualified	Text.ParserCombinators.Parsec+#endif++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Attribute.Rank.Rank -> Test.QuickCheck.Property+		f rank	= Test.QuickCheck.label "StandardAlgebraic.prop_san" $ ContextualNotation.StandardAlgebraic.toRank (ContextualNotation.StandardAlgebraic.fromRank rank) == rank+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> ContextualNotation.StandardAlgebraic.ExplicitEnPassant -> ContextualNotation.StandardAlgebraic.ValidateMoves -> Test.QuickCheck.Property+		f game explicitEnPassant validateMoves	= Test.QuickCheck.label "StandardAlgebraic.prop_sanParser" $ all (+			\(game', turn) -> let+				qualifiedMove	= Component.Turn.getQualifiedMove turn+			in+#ifdef USE_POLYPARSE+			uncurry (&&) . (+#if USE_POLYPARSE == 1+				(== qualifiedMove) . ContextualNotation.StandardAlgebraic.getQualifiedMove *** null {-unparsed input-}+#else /* Plain */+				either (const False) (+					(== qualifiedMove) . ContextualNotation.StandardAlgebraic.getQualifiedMove+				) *** null {-unparsed input-}+#endif+			) . Poly.runParser (+				ContextualNotation.StandardAlgebraic.parser explicitEnPassant validateMoves game'+			)+#else /* Parsec */+			either (const False) (+				(== qualifiedMove) . ContextualNotation.StandardAlgebraic.getQualifiedMove+			) . Text.ParserCombinators.Parsec.parse (+				ContextualNotation.StandardAlgebraic.parser explicitEnPassant validateMoves game'+			) "SAN-parser"+#endif+			$ ContextualNotation.StandardAlgebraic.showTurn explicitEnPassant turn game'+		 ) $ Model.Game.rollBack game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Data/Integral.hs view
@@ -0,0 +1,43 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Data.Integral (+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Data.Integral	as Data.Integral+import qualified	Data.Word+import qualified	Test.QuickCheck++-- | The constant test-results.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Data.Word.Word -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Integral.prop_stringToUnsignedDecimal" . uncurry (==) . (Data.Integral.stringToUnsignedDecimal . show &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Evaluation/PositionHashQuantifiedGameTree.hs view
@@ -0,0 +1,103 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Evaluation.PositionHashQuantifiedGameTree(+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Input.SearchOptions()+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+-- import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Property.Empty					as Property.Empty+-- import qualified	BishBosh.Property.Tree					as Property.Tree+import qualified	BishBosh.State.Position					as State.Position+import qualified	BishBosh.Test.QuickCheck.Component.Zobrist		as Test.QuickCheck.Component.Zobrist+import qualified	BishBosh.Test.QuickCheck.Input.EvaluationOptions	as Test.QuickCheck.Input.EvaluationOptions+import qualified	BishBosh.Test.QuickCheck.Model.Game			as Test.QuickCheck.Model.Game+import qualified	BishBosh.Types						as T+import qualified	Data.List.Extra+import qualified	Data.Ord+import qualified	Data.Tree+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+{-+	let+		f+			:: Test.QuickCheck.Input.EvaluationOptions.EvaluationOptions+			-> Input.SearchOptions.SearchOptions+			-> Test.QuickCheck.Component.Zobrist.Zobrist+			-> Test.QuickCheck.Model.Game.Game+			-> Test.QuickCheck.Property+		f evaluationOptions searchOptions zobrist game	= Test.QuickCheck.label "PositionHashQuantifiedGameTree.prop_mkPositionHashQuantifiedGameTree" $ prune (+			Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree evaluationOptions {+				Input.EvaluationOptions.getIncrementalEvaluation	= False+			} searchOptions zobrist Property.Empty.empty {-MoveFrequency-} game	:: Evaluation.PositionHashQuantifiedGameTree.PositionHashQuantifiedGameTree T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean+		 ) == prune (+			Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree evaluationOptions {+				Input.EvaluationOptions.getIncrementalEvaluation	= True	-- CAVEAT: unrealistic given rounding-errors in incremental calculation of pieceSquareValue.+			} searchOptions zobrist Property.Empty.empty {-MoveFrequency-} game+		 ) where+			prune	= Property.Tree.prune 3+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4 } f,+-}+	let+		f+			:: Test.QuickCheck.Input.EvaluationOptions.EvaluationOptions+			-> Input.SearchOptions.SearchOptions+			-> Test.QuickCheck.Component.Zobrist.Zobrist+			-> Test.QuickCheck.Model.Game.Game+			-> Test.QuickCheck.Property+		f evaluationOptions searchOptions zobrist game	= not (null matches) ==> Test.QuickCheck.label "PositionHashQuantifiedGameTree.prop_hashCollisions" $ all (+			Data.List.Extra.allSame . map (+				Model.Game.mkPosition . Evaluation.QuantifiedGame.getGame . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame	:: Evaluation.PositionHashQuantifiedGameTree.NodeLabel T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean -> State.Position.Position T.X T.Y+			)+		 ) matches where+			matches	= filter (+				(/= 1) . length+			 ) . Data.List.Extra.groupSortBy (+				Data.Ord.comparing Evaluation.PositionHashQuantifiedGameTree.getPositionHash+			 ) . take 10000 . Data.Tree.flatten . Evaluation.PositionHashQuantifiedGameTree.deconstruct $ Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree evaluationOptions searchOptions zobrist Property.Empty.empty {-MoveFrequency-} game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f+			:: Test.QuickCheck.Input.EvaluationOptions.EvaluationOptions+			-> Input.SearchOptions.SearchOptions+			-> Test.QuickCheck.Component.Zobrist.Zobrist+			-> Test.QuickCheck.Model.Game.Game+			-> Test.QuickCheck.Property+		f evaluationOptions searchOptions zobrist	= Test.QuickCheck.label "PositionHashQuantifiedGameTree.prop_fitness" . all (+			(<= 1) . abs+		 ) . take 10000 . map (+			Evaluation.QuantifiedGame.getFitness . Evaluation.PositionHashQuantifiedGameTree.getQuantifiedGame	:: Evaluation.PositionHashQuantifiedGameTree.NodeLabel T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean -> T.WeightedMean+		 ) . Data.Tree.flatten . Evaluation.PositionHashQuantifiedGameTree.deconstruct . Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree evaluationOptions searchOptions zobrist Property.Empty.empty {-MoveFrequency-}+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Input/CECPFeatures.hs view
@@ -0,0 +1,46 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.CECPFeatures() where++import			Control.Arrow((***))+import qualified	BishBosh.Input.CECPFeatures	as Input.CECPFeatures+import qualified	Data.Char+import qualified	Test.QuickCheck+import			ToolShed.Test.QuickCheck.Arbitrary.Map()++instance Test.QuickCheck.Arbitrary Input.CECPFeatures.CECPFeatures where+	arbitrary	= Input.CECPFeatures.mkCECPFeatures <$> (+		filter (+			not . null . fst {-key-}+		) . map (+			filter Data.Char.isAlpha *** either (+				Left . (`mod` 3)+			) (+				Right . filter Data.Char.isAlphaNum+			)+		) <$> Test.QuickCheck.arbitrary+	 ) <*> Test.QuickCheck.arbitrary {-done-}+
+ src-test/BishBosh/Test/QuickCheck/Input/CECPOptions.hs view
@@ -0,0 +1,34 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.CECPOptions() where++import			BishBosh.Test.QuickCheck.Input.CECPFeatures()+import qualified	BishBosh.Input.CECPOptions	as Input.CECPOptions+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Input.CECPOptions.CECPOptions where+	arbitrary	= Input.CECPOptions.mkCECPOptions <$> Test.QuickCheck.arbitrary {-analyseMode-} <*> Test.QuickCheck.arbitrary {-displaySAN-} <*> Test.QuickCheck.arbitrary {-editMode-} <*> Test.QuickCheck.arbitrary {-forceMode-} <*> fmap (fmap $ toEnum . abs) Test.QuickCheck.arbitrary {-Maybe pause-} <*> Test.QuickCheck.arbitrary {-ponderMode-} <*> Test.QuickCheck.arbitrary {-postMode-} <*> Test.QuickCheck.elements [1 .. 3] {-protocolVersion-} <*> Test.QuickCheck.arbitrary {-CECPFeatures-}+
+ src-test/BishBosh/Test/QuickCheck/Input/CriteriaWeights.hs view
@@ -0,0 +1,68 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Input.CriteriaWeights(+-- * Types+-- ** Type-synonyms+--	CriteriaWeights,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.CriterionWeight()+import qualified	BishBosh.Input.CriteriaWeights	as Input.CriteriaWeights+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck++instance (+	Fractional	criterionWeight,+	Ord		criterionWeight,+	Show		criterionWeight+ ) => Test.QuickCheck.Arbitrary (Input.CriteriaWeights.CriteriaWeights criterionWeight) where+	arbitrary	= Input.CriteriaWeights.mkCriteriaWeights <$> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary++-- | Defines a concrete type for testing.+type CriteriaWeights	= Input.CriteriaWeights.CriteriaWeights T.CriterionWeight++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: CriteriaWeights -> Test.QuickCheck.Property+		f criteriaWeights	= Test.QuickCheck.label "CriteriaWeights.prop_normalise" . (== maxBound) . maximum $ map ($ criteriaWeights') [+			Input.CriteriaWeights.getWeightOfMaterial,+			Input.CriteriaWeights.getWeightOfMobility,+			Input.CriteriaWeights.getWeightOfPieceSquareValue,+			Input.CriteriaWeights.getWeightOfCastlingPotential,+			Input.CriteriaWeights.getWeightOfDefence,+			Input.CriteriaWeights.getWeightOfDoubledPawns,+			Input.CriteriaWeights.getWeightOfIsolatedPawns,+			Input.CriteriaWeights.getWeightOfPassedPawns+		 ] where+			criteriaWeights'	= Input.CriteriaWeights.normalise criteriaWeights++	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Input/EvaluationOptions.hs view
@@ -0,0 +1,113 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Input.EvaluationOptions(+-- * Types+-- ** Type-synonyms+	EvaluationOptions,+-- * Constants+	results+) where++import			BishBosh.Data.Bool()+import			BishBosh.Test.QuickCheck.Attribute.Rank()+import			BishBosh.Test.QuickCheck.Attribute.RankValues()+import			BishBosh.Test.QuickCheck.Input.CriteriaWeights()+import			BishBosh.Test.QuickCheck.Input.PieceSquareTable()+import			Control.Arrow((&&&))+import qualified	BishBosh.Component.PieceSquareArray		as Component.PieceSquareArray+import qualified	BishBosh.Input.CriteriaWeights			as Input.CriteriaWeights+import qualified	BishBosh.Input.EvaluationOptions		as Input.EvaluationOptions+import qualified	BishBosh.Input.PieceSquareTable			as Input.PieceSquareTable+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.Board				as State.Board+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour	as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.MaybePieceByCoordinates		as State.MaybePieceByCoordinates+import qualified	BishBosh.Test.QuickCheck.State.Board		as Test.QuickCheck.State.Board+import qualified	BishBosh.Types					as T+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++-- | Defines a concrete type for testing.+type EvaluationOptions	= Input.EvaluationOptions.EvaluationOptions T.CriterionWeight T.PieceSquareValue T.RankValue T.X T.Y++instance (+	Enum				x,+	Enum				y,+	Fractional			criterionWeight,+	Fractional			pieceSquareValue,+	Fractional			rankValue,+	Ord				pieceSquareValue,+	Ord				rankValue,+	Ord				x,+	Ord				y,+	Real				criterionWeight,+	Show				criterionWeight,+	Show				pieceSquareValue,+	Show				rankValue,+	Test.QuickCheck.Arbitrary	rankValue+ ) => Test.QuickCheck.Arbitrary (Input.EvaluationOptions.EvaluationOptions criterionWeight pieceSquareValue rankValue x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary EvaluationOptions #-}+	arbitrary	= do+		criteriaWeights	<- Test.QuickCheck.arbitrary++		Input.EvaluationOptions.mkEvaluationOptions <$> Test.QuickCheck.arbitrary {-RankValues-} <*> return {-to Gen-monad-} criteriaWeights <*> Test.QuickCheck.arbitrary {-incrementalEvaluation-} <*> if Input.CriteriaWeights.getWeightOfPieceSquareValue criteriaWeights == minBound+			then return {-to Gen-monad-} Nothing+			else do+				(pieceSquareTable, pieceSquareTable', ranks)	<- Test.QuickCheck.arbitrary++				return {-to Gen-monad-} $ Just (+					pieceSquareTable,+					pieceSquareTable' {+						Input.PieceSquareTable.getByRank	= foldr Data.Map.delete (Input.PieceSquareTable.getByRank pieceSquareTable') $ Data.List.nub ranks	-- Delete arbitrary ranks from the end-game table.+					}+				 ) -- Pair.++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: EvaluationOptions -> Test.QuickCheck.State.Board.Board -> Test.QuickCheck.Property+		f evaluationOptions board	= Data.Maybe.isJust maybePieceSquareArray ==> Test.QuickCheck.label "EvaluationOptions.prop_sumPieceSquareValueByLogicalColour/reflectOnX" . uncurry (==) $ (+			Data.Array.IArray.elems . sumPieceSquareValueByLogicalColour &&& reverse . Data.Array.IArray.elems . sumPieceSquareValueByLogicalColour . Property.Reflectable.reflectOnX+		 ) board where+			maybePieceSquareArray			= Input.EvaluationOptions.getMaybePieceSquareArray evaluationOptions+			sumPieceSquareValueByLogicalColour	= State.Board.sumPieceSquareValueByLogicalColour $ Data.Maybe.fromJust maybePieceSquareArray+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Input.EvaluationOptions.EvaluationOptions T.CriterionWeight Rational {-precision is required-} T.RankValue T.X T.Y -> Test.QuickCheck.State.Board.Board -> Test.QuickCheck.Property+		f evaluationOptions board	= Data.Maybe.isJust maybePieceSquareArray ==> Test.QuickCheck.label "EvaluationOptions.prop_sumPieceSquareValueByLogicalColour" . uncurry (==) $ (+			State.CoordinatesByRankByLogicalColour.sumPieceSquareValueByLogicalColour findPieceSquareValue . State.Board.getCoordinatesByRankByLogicalColour &&& State.MaybePieceByCoordinates.sumPieceSquareValueByLogicalColour findPieceSquareValue . State.Board.getMaybePieceByCoordinates+		 ) board where+			maybePieceSquareArray	= Input.EvaluationOptions.getMaybePieceSquareArray evaluationOptions+			nPieces			= State.Board.getNPieces board+			findPieceSquareValue logicalColour rank coordinates	= Component.PieceSquareArray.findPieceSquareValue nPieces logicalColour rank coordinates $ Data.Maybe.fromJust maybePieceSquareArray+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Input/IOOptions.hs view
@@ -0,0 +1,68 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.IOOptions() where++import			BishBosh.Test.QuickCheck.Input.PGNOptions()+import			BishBosh.Test.QuickCheck.Input.UIOptions()+import qualified	BishBosh.Input.IOOptions	as Input.IOOptions+import qualified	Control.Arrow+import qualified	Data.Maybe+import qualified	System.FilePath+import qualified	Test.QuickCheck+import			System.FilePath((</>), (<.>))++instance (+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => Test.QuickCheck.Arbitrary (Input.IOOptions.IOOptions row column) where+	arbitrary	= do+		maybePGNOptions	<- Test.QuickCheck.arbitrary++		Input.IOOptions.mkIOOptions <$> Test.QuickCheck.elements (+			map (+				fmap $ showChar System.FilePath.pathSeparator	-- Make path absolute.+			) [+				Nothing,+				Just $ "dev" </> "null",+				Just $ "tmp" </> "chess" <.> "xml"+			] -- MaybeOutputConfigFilePath.+		 ) <*> (+			if Data.Maybe.isJust maybePGNOptions+				then Test.QuickCheck.elements [Nothing, Just 0, Just 10] {-maybeMaximumPGNNames-}+				else return {-to Gen-monad-} Nothing+		 ) <*> return {-to Gen-monad-} (Data.Maybe.maybeToList maybePGNOptions) <*> Test.QuickCheck.elements (+			map (+				fmap . Control.Arrow.first $ showChar System.FilePath.pathSeparator	-- Make path absolute.+			) [+				Nothing,+				Just ("dev" </> "null", False),+				Just ("tmp" </> "chess" <.> "txt", False),+				Just ("tmp" </> "chess" <.> "txt", True)+			] {-MaybePersistence-}+		 ) <*> Test.QuickCheck.arbitrary {-UI-}+
+ src-test/BishBosh/Test/QuickCheck/Input/NativeUIOptions.hs view
@@ -0,0 +1,42 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.NativeUIOptions() where++import			Control.Arrow((***))+import qualified	BishBosh.Input.NativeUIOptions	as Input.NativeUIOptions+import qualified	Data.Default+import qualified	Test.QuickCheck++instance (+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => Test.QuickCheck.Arbitrary (Input.NativeUIOptions.NativeUIOptions row column) where+	arbitrary	= Input.NativeUIOptions.mkNativeUIOptions <$> fmap (+		fromInteger . succ . (* 2) . (`mod` 3) *** fromInteger . succ . (* 2) . (`mod` 3)+	 ) Test.QuickCheck.arbitrary {-BoardMagnification-} <*> return {-to Gen-monad-} Data.Default.def {-ColourScheme-}+
+ src-test/BishBosh/Test/QuickCheck/Input/Options.hs view
@@ -0,0 +1,90 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Input.Options(+-- * Types+-- ** Type-synonyms+--	Row,+--	Column,+	Options,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Input.EvaluationOptions()+import			BishBosh.Test.QuickCheck.Input.IOOptions()+import			BishBosh.Test.QuickCheck.Input.SearchOptions()+import qualified	BishBosh.Input.Options	as Input.Options+import qualified	BishBosh.Types		as T+import qualified	Test.QuickCheck++-- | Defines a concrete type for testing.+type Row	= T.Y++-- | Defines a concrete type for testing.+type Column	= T.X++-- | Defines a concrete type for testing.+type Options	= Input.Options.Options Column T.CriterionWeight T.PieceSquareValue T.RankValue Row T.X T.Y++instance (+	Enum				pieceSquareValue,+	Fractional			criterionWeight,+	Fractional			pieceSquareValue,+	Fractional			rankValue,+	Integral			column,+	Integral			row,+	Ord				pieceSquareValue,+	Ord				rankValue,+	Enum				x,+	Enum				y,+	Ord				x,+	Ord				y,+	Real				criterionWeight,+	Show				column,+	Show				criterionWeight,+	Show				pieceSquareValue,+	Show				rankValue,+	Show				row,+	Test.QuickCheck.Arbitrary	pieceSquareValue,+	Test.QuickCheck.Arbitrary	rankValue+ ) => Test.QuickCheck.Arbitrary (Input.Options.Options column criterionWeight pieceSquareValue rankValue row x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Options #-}+	arbitrary	= do+		(maybeMaximumPlies, maybeRandomSeed, evaluationOptions, searchOptions, ioOptions)	<- Test.QuickCheck.arbitrary++		return {-to Gen-monad-} $ Input.Options.mkOptions (+			fmap (succ . abs) maybeMaximumPlies+		 ) maybeRandomSeed evaluationOptions searchOptions ioOptions++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Options -> Test.QuickCheck.Property+		f options	= Test.QuickCheck.label "Options.prop_swapSearchDepth" $ Input.Options.swapSearchDepth (Input.Options.swapSearchDepth options) == options+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Input/PGNOptions.hs view
@@ -0,0 +1,41 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.PGNOptions() where++import qualified	BishBosh.Input.PGNOptions	as Input.PGNOptions+import qualified	System.FilePath+import qualified	Test.QuickCheck+import			System.FilePath((</>), (<.>))++instance Test.QuickCheck.Arbitrary Input.PGNOptions.PGNOptions where+	arbitrary	= Input.PGNOptions.mkPGNOptions (+		showChar System.FilePath.pathSeparator $ "tmp" </> "database" <.> "pgn"+	 ) <$> Test.QuickCheck.arbitrary {-isStrictlySequential-} <*> Test.QuickCheck.arbitrary {-validateMoves-} <*> Test.QuickCheck.elements [+		["FICSGamesDBGameNo"],+		["ECO"],+		["FICSGamesDBGameNo", "ECO"]+	 ] <*> fmap (`mod` 128) Test.QuickCheck.arbitrary+
+ src-test/BishBosh/Test/QuickCheck/Input/PieceSquareTable.hs view
@@ -0,0 +1,68 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.PieceSquareTable(+-- * Types+-- ** Type-synonyms+	PieceSquareTable+) where++import			BishBosh.Test.QuickCheck.Component.Piece()+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Input.PieceSquareTable	as Input.PieceSquareTable+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck++-- | Defines a concrete type for testing.+type PieceSquareTable	= Input.PieceSquareTable.PieceSquareTable T.X T.Y T.PieceSquareValue++instance (+	Enum		x,+	Enum		y,+	Fractional	pieceSquareValue,+	Ord		pieceSquareValue,+	Ord		x,+	Ord		y,+	Show		pieceSquareValue+ ) => Test.QuickCheck.Arbitrary (Input.PieceSquareTable.PieceSquareTable x y pieceSquareValue) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary PieceSquareTable #-}+	arbitrary	= do+		reflectOnY	<- Test.QuickCheck.arbitrary++		Input.PieceSquareTable.mkPieceSquareTable reflectOnY <$> mapM (+			\rank -> (,) rank <$> fmap (+				map $ recip . fromInteger . succ . (`mod` 100)	-- Normalise to the half open unit-interval (0,1].+			) (+				Test.QuickCheck.vector (+					(+						if reflectOnY+							then (`div` 2)+							else id+					) Cartesian.Coordinates.nSquares+				)+			)+		 ) Attribute.Rank.range+
+ src-test/BishBosh/Test/QuickCheck/Input/SearchOptions.hs view
@@ -0,0 +1,60 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.SearchOptions() where++import			BishBosh.Test.QuickCheck.Attribute.CaptureMoveSortAlgorithm()+import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			BishBosh.Test.QuickCheck.Input.StandardOpeningOptions()+import			Control.Arrow((***))+import qualified	BishBosh.Input.SearchOptions	as Input.SearchOptions+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Input.SearchOptions.SearchOptions where+	arbitrary	= do+		searchDepthByLogicalColour	<- Data.Map.map (+			(+ Input.SearchOptions.minimumSearchDepth) . (`mod` 4)+		 ) <$> Test.QuickCheck.arbitrary++		Input.SearchOptions.mkSearchOptions <$> Test.QuickCheck.arbitrary {-PreferMovesTowardsCentre-} <*> Test.QuickCheck.arbitrary {-SortOnStandardOpeningMoveFrequency-} <*> Test.QuickCheck.arbitrary {-maybeCaptureMoveSortAlgorithm-} <*> (+			fmap (succ . (`mod` 3)) <$> Test.QuickCheck.arbitrary	-- maybeMinimumHammingDistance.+		 ) <*> (+			fmap (`mod` 4) <$> Test.QuickCheck.arbitrary	-- maybeRetireKillerMovesAfter.+		 ) <*> Test.QuickCheck.arbitrary {-trapRepeatedPositions-} <*> (+			if Data.Map.size searchDepthByLogicalColour == 1+				then Test.QuickCheck.arbitrary+				else return {-to Gen-monad-} False	-- UsePondering.+		 ) <*> (+			fmap (+				(`mod` 3) *** (+					if Data.Map.null searchDepthByLogicalColour+						then id+						else min $ Data.Foldable.maximum searchDepthByLogicalColour+				) . succ . (`mod` 3)+			) <$> Test.QuickCheck.arbitrary {-maybeUseTranspositions-}+		 ) <*> Test.QuickCheck.arbitrary {-standardOpeningOptions-} <*> return {-to Gen-monad-} searchDepthByLogicalColour+
+ src-test/BishBosh/Test/QuickCheck/Input/StandardOpeningOptions.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.StandardOpeningOptions() where++import qualified	BishBosh.Input.StandardOpeningOptions	as Input.StandardOpeningOptions+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Input.StandardOpeningOptions.StandardOpeningOptions where+	arbitrary	= Input.StandardOpeningOptions.mkStandardOpeningOptions <$> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary+
+ src-test/BishBosh/Test/QuickCheck/Input/UIOptions.hs view
@@ -0,0 +1,49 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.UIOptions() where++import			BishBosh.Test.QuickCheck.Input.CECPOptions()+import			BishBosh.Test.QuickCheck.Input.NativeUIOptions()+import			BishBosh.Test.QuickCheck.Input.Verbosity()+import			BishBosh.Test.QuickCheck.Notation.MoveNotation()+import qualified	BishBosh.Input.UIOptions	as Input.UIOptions+import qualified	BishBosh.Notation.MoveNotation	as Notation.MoveNotation+import qualified	Test.QuickCheck++instance (+	Integral	column,+	Integral	row,+	Show		column,+	Show		row+ ) => Test.QuickCheck.Arbitrary (Input.UIOptions.UIOptions row column) where+	arbitrary	= do+		eitherNativeUIOrCECPOptions	<- Test.QuickCheck.arbitrary+		moveNotation			<- const Test.QuickCheck.arbitrary `either` const (return {-to Gen-monad-} Notation.MoveNotation.coordinate) $ eitherNativeUIOrCECPOptions++		Input.UIOptions.mkUIOptions <$> return {-to Gen-monad-} moveNotation <*> fmap (+			fmap $ succ . (`mod` 3)	-- maybePrintMoveTree.+		 ) Test.QuickCheck.arbitrary <*> Test.QuickCheck.elements [1 .. 6] {-NDecimalDigits-} <*> return {-to Gen-monad-} eitherNativeUIOrCECPOptions <*> Test.QuickCheck.arbitrary {-Verbosity-}+
+ src-test/BishBosh/Test/QuickCheck/Input/Verbosity.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Input.Verbosity() where++import qualified	BishBosh.Input.Verbosity	as Input.Verbosity+import qualified	Distribution.Verbosity+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Distribution.Verbosity.Verbosity where+	arbitrary	= Test.QuickCheck.elements Input.Verbosity.range
+ src-test/BishBosh/Test/QuickCheck/Model/DrawReason.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Model.DrawReason() where++import qualified	BishBosh.Model.DrawReason	as Model.DrawReason+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Model.DrawReason.DrawReason where+	arbitrary	= Test.QuickCheck.elements Model.DrawReason.range+
+ src-test/BishBosh/Test/QuickCheck/Model/Game.hs view
@@ -0,0 +1,312 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Model.Game(+-- * Types+-- ** Type-synonyms+	Game,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.State.Board()+import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour			as Attribute.LogicalColour+import qualified	BishBosh.Attribute.MoveType				as Attribute.MoveType+import qualified	BishBosh.Attribute.Rank					as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates				as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate				as Cartesian.Ordinate+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.Piece				as Component.Piece+import qualified	BishBosh.Component.QualifiedMove			as Component.QualifiedMove+import qualified	BishBosh.Component.Turn					as Component.Turn+import qualified	BishBosh.Model.DrawReason				as Model.DrawReason+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Property.ForsythEdwards			as Property.ForsythEdwards+import qualified	BishBosh.Property.Null					as Property.Null+import qualified	BishBosh.Property.Opposable				as Property.Opposable+import qualified	BishBosh.Property.Reflectable				as Property.Reflectable+import qualified	BishBosh.State.Board					as State.Board+import qualified	BishBosh.State.CastleableRooksByLogicalColour		as State.CastleableRooksByLogicalColour+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour		as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.MaybePieceByCoordinates			as State.MaybePieceByCoordinates+import qualified	BishBosh.State.TurnsByLogicalColour			as State.TurnsByLogicalColour+import qualified	BishBosh.Types						as T+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	System.Random+import qualified	Test.QuickCheck+import qualified	ToolShed.Data.Foldable+import qualified	ToolShed.System.Random+import qualified	ToolShed.Test.ReversibleIO+import			Test.QuickCheck((==>))++-- | Defines a concrete type for testing.+type Game	= Model.Game.Game T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y+ ) => Test.QuickCheck.Arbitrary (Model.Game.Game x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Game #-}+	arbitrary	= let+		play game (randomGen : randomGens)+			| Model.Game.isTerminated game	= game+			| otherwise			= (+				\qualifiedMove -> play (Model.Game.applyQualifiedMove qualifiedMove game) randomGens	-- Recurse.+			) . Data.Maybe.fromJust . ToolShed.System.Random.select randomGen $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+		play game _				= game	-- Terminate recursion.+	 in Test.QuickCheck.arbitrary >>= (+		\randomGens -> (+			play Data.Default.def . (`take` ToolShed.System.Random.randomGens (System.Random.mkStdGen randomGens))+		) `fmap` Test.QuickCheck.choose (1 :: Int, 64)+	 )++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Game.prop_read" $ case (reads garbage :: [(Game, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> String -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_fen/nFields" . (== 6) . length . words $ Property.ForsythEdwards.showFEN game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_fen/Half move clock" $ uncurry (&&) . (+			(>= 0) &&& (<= Model.DrawReason.maximumConsecutiveRepeatablePlies)+		 ) . read . (+			!! 4+		 ) . words $ Property.ForsythEdwards.showFEN game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_fen/Full move number" $ (> (0 :: Component.Move.NMoves)) . read . (!! 5) . words $ Property.ForsythEdwards.showFEN game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= not (Model.Game.isTerminated game) ==> Test.QuickCheck.label "Game.prop_isValidQualifiedMove" . all (`Model.Game.isValidQualifiedMove` game) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4096 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_findOrderedQualifiedMovesAvailableToNextPlayer" . (+			== if Model.Game.isTerminated game+				then []+				else sort $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+		 ) $ sort [+			qualifiedMove |+				source			<- State.CoordinatesByRankByLogicalColour.elems $ State.Board.getCoordinatesByRankByLogicalColour board,+				destination		<- Cartesian.Coordinates.range,+				source /= destination,+				let move	= Component.Move.mkMove source destination,+				maybePromotionRank	<- if Data.Maybe.maybe False (Component.Piece.isPawnPromotion destination) $ State.MaybePieceByCoordinates.dereference source maybePieceByCoordinates+					then map Just Attribute.Rank.promotionProspects+					else [Nothing],+				let qualifiedMove	= Component.QualifiedMove.mkQualifiedMove move $ State.MaybePieceByCoordinates.inferMoveType move maybePromotionRank maybePieceByCoordinates,+				Model.Game.isValidQualifiedMove qualifiedMove game+		 ] {-list-comprehension-} where+			sort			= Data.List.sortBy $ Data.Ord.comparing Component.QualifiedMove.getMove+			board			= Model.Game.getBoard game+			maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4096 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_inferMoveType" . all (+			\qualifiedMove -> let+				moveType		= Component.QualifiedMove.getMoveType qualifiedMove+				inferredMoveType	= State.MaybePieceByCoordinates.inferMoveType (Component.QualifiedMove.getMove qualifiedMove) Nothing {-promotion-rank-} . State.Board.getMaybePieceByCoordinates $ Model.Game.getBoard game+			in if Attribute.MoveType.isPromotion moveType+				then Attribute.MoveType.isPromotion inferredMoveType && Attribute.MoveType.getMaybeExplicitlyTakenRank moveType == Attribute.MoveType.getMaybeExplicitlyTakenRank inferredMoveType+				else moveType == inferredMoveType+		 ) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_findQualifiedMovesAvailableToNextPlayer/unique" . uncurry (==) . (id &&& Data.List.nub) $ Model.Game.findQualifiedMovesAvailableToNextPlayer game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_getNextLogicalColour" . uncurry (==) . (Model.Game.getNextLogicalColour &&& State.TurnsByLogicalColour.inferNextLogicalColour . Model.Game.getTurnsByLogicalColour)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_mkCoordinatesByRankByLogicalColour" . uncurry (==) . (+			State.CoordinatesByRankByLogicalColour.deconstruct . State.CoordinatesByRankByLogicalColour.sortCoordinates . State.Board.getCoordinatesByRankByLogicalColour &&& State.CoordinatesByRankByLogicalColour.deconstruct . State.CoordinatesByRankByLogicalColour.sortCoordinates . State.CoordinatesByRankByLogicalColour.fromMaybePieceByCoordinates . State.Board.getMaybePieceByCoordinates+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_getCoordinatesByRankByLogicalColour/unique" . all (+			(== 1) . length+		 ) . ToolShed.Data.Foldable.gather . State.CoordinatesByRankByLogicalColour.elems . State.Board.getCoordinatesByRankByLogicalColour . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_(getAvailableQualifiedMovesByLogicalColour == mkAvailableQualifiedMovesFor)" . Data.Maybe.maybe True (+			== Model.Game.mkAvailableQualifiedMovesFor nextLogicalColour game+		 ) . Data.Map.lookup nextLogicalColour $ Model.Game.getAvailableQualifiedMovesByLogicalColour game where+			nextLogicalColour	= Model.Game.getNextLogicalColour game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 4096 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_(findQualifiedMovesAvailableTo => countMovesAvailableTo)" $ all (+			\logicalColour -> Model.Game.countMovesAvailableTo logicalColour game == (+				if Model.Game.isTerminated game+					then 0+					else length $ Model.Game.findQualifiedMovesAvailableTo logicalColour game+			)+		 ) Attribute.LogicalColour.range+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.prop_(getNDefendersByCoordinatesByLogicalColour == countDefendersByCoordinatesByLogicalColour)" . uncurry (==) . (+			State.Board.getNDefendersByCoordinatesByLogicalColour &&& State.Board.countDefendersByCoordinatesByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 2048 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.prop_(getNPawnsByFileByLogicalColour => countPawnsByFileByLogicalColour)" . uncurry (==) . (+			State.Board.getNPawnsByFileByLogicalColour &&& State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.prop_getNPawnsByFileByLogicalColour/non-zero" . Data.Foldable.all (+			Data.Foldable.all (> 0)+		 ) . State.Board.getNPawnsByFileByLogicalColour . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_(getCoordinatesByRankByLogicalColour => getNPawnsByFileByLogicalColour)" . all (+			\(logicalColour, nPawnsByFile) -> Data.Foldable.sum nPawnsByFile == length (+				State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.Pawn $ State.Board.getCoordinatesByRankByLogicalColour board+			)+		 ) . Data.Array.IArray.assocs $ State.Board.getNPawnsByFileByLogicalColour board where+			board	= Model.Game.getBoard game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.prop_(getPassedPawnCoordinatesByLogicalColour == findPassedPawnCoordinatesByLogicalColour)" . uncurry (==) . (+			 State.Board.getPassedPawnCoordinatesByLogicalColour &&& State.CoordinatesByRankByLogicalColour.findPassedPawnCoordinatesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.prop_(getMaybeChecked == isKingChecked)" . uncurry (==) . (+			Data.Maybe.isJust . Model.Game.getMaybeChecked &&& uncurry State.Board.isKingChecked . (Model.Game.getNextLogicalColour &&& Model.Game.getBoard)+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Game.(prop_getCastleableRooksByLogicalColour == fromTurnsByLogicalColour)" . uncurry (==) . (+			Model.Game.getCastleableRooksByLogicalColour &&& State.CastleableRooksByLogicalColour.fromTurnsByLogicalColour . Model.Game.getTurnsByLogicalColour+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_reflectOnX/isValidQualifiedMove" . all (+			\(game, turn) -> Model.Game.isValidQualifiedMove (Component.Turn.getQualifiedMove turn) game+		 ) . Model.Game.rollBack . Property.Reflectable.reflectOnX+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Game.prop_cantConverge" . not . any (+			\(game, turn) -> Model.Game.cantConverge game $ Model.Game.takeTurn turn game+		 ) . Model.Game.rollBack+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= not (Property.Null.isNull game) ==> Test.QuickCheck.label "Game.prop_rollBack/restart" . (== Data.Default.def) . fst {-game-} . last {-original-} $ Model.Game.rollBack game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_rollBack/takeTurn" . (== game) . foldr (+			Model.Game.takeTurn . snd {-turn-}+		 ) Data.Default.def $ Model.Game.rollBack game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_(findAttackersOf => listDestinationsFor)" $ all (+			\(destination, destinationLogicalColour, destinationRank, source, sourceRank) -> (destination, Just destinationRank) `elem` State.MaybePieceByCoordinates.listDestinationsFor source (+				Component.Piece.mkPiece (Property.Opposable.getOpposite destinationLogicalColour) sourceRank+			) maybePieceByCoordinates+		 ) [+			(destination, destinationLogicalColour, destinationRank, source, sourceRank) |+				(destination, piece)	<- State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates,+				let (destinationLogicalColour, destinationRank)	= Component.Piece.getLogicalColour &&& Component.Piece.getRank $ piece,	-- Deconstruct.+				(source, sourceRank)	<- State.Board.findAttackersOf destinationLogicalColour destination board+		 ] {-list-comprehension-} where+			board			= Model.Game.getBoard game+			maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_(listDestinationsFor => findAttackersOf)" $ all (+			\(source, piece, destination) -> (source, Component.Piece.getRank piece) `elem` State.Board.findAttackersOf (+				Property.Opposable.getOpposite $ Component.Piece.getLogicalColour piece+			) destination board+		 ) [+			(source, piece, destination) |+				(source, piece)		<- State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates,+				(destination, Just _)	<- State.MaybePieceByCoordinates.listDestinationsFor source piece maybePieceByCoordinates	-- Identify attacks.+		 ] {-list-comprehension-} where+			board			= Model.Game.getBoard game+			maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_pawnOrdinates" . all (+			uncurry (&&) . (+				(/= Cartesian.Ordinate.yMin) &&& (/= Cartesian.Ordinate.yMax)+			) . Cartesian.Coordinates.getY . fst {-coordinates-}+		 ) . State.CoordinatesByRankByLogicalColour.findPieces Component.Piece.isPawn . State.Board.getCoordinatesByRankByLogicalColour $ Model.Game.getBoard game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Model/GameTerminationReason.hs view
@@ -0,0 +1,53 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Model.GameTerminationReason(+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			BishBosh.Test.QuickCheck.Model.DrawReason()+import			Control.Arrow((&&&))+import qualified	BishBosh.Model.GameTerminationReason	as Model.GameTerminationReason+import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Model.GameTerminationReason.GameTerminationReason where+	arbitrary	= Test.QuickCheck.oneof [+		fmap Model.GameTerminationReason.mkCheckMate Test.QuickCheck.arbitrary,+		fmap Model.GameTerminationReason.mkResignation Test.QuickCheck.arbitrary,+		fmap Model.GameTerminationReason.mkDraw Test.QuickCheck.arbitrary+	 ]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Model.GameTerminationReason.GameTerminationReason -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "GameTerminationReason.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 8 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Model/GameTree.hs view
@@ -0,0 +1,63 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Model.GameTree(+-- * Types+-- ** Type-synonyms+	GameTree,+-- * Constants+	results+) where++import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.Model.GameTree			as Model.GameTree+import qualified	BishBosh.Property.Tree			as Property.Tree+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	BishBosh.Types				as T+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Test.QuickCheck++instance (Enum x, Enum y, Ord x, Ord y, Show x, Show y) => Test.QuickCheck.Arbitrary (Model.GameTree.GameTree x y) where+	arbitrary	= do+		depth	<- Test.QuickCheck.elements [1 .. 3]++		fmap (Property.Tree.prune depth . Model.GameTree.fromGame) Test.QuickCheck.arbitrary++-- | Define a concrete type for testing.+type GameTree	= Model.GameTree.GameTree T.X T.Y++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "GameTree.prop_traceRoute" . (+			\turns -> Data.Maybe.maybe False (+				Data.Maybe.maybe False (== turns) . mapM Model.Game.maybeLastTurn+			) $ Model.GameTree.traceRoute Data.Default.def turns+		 ) . Model.Game.listTurnsChronologically+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Model/MoveFrequency.hs view
@@ -0,0 +1,52 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Model.MoveFrequency(+-- * Constants+	results+) where++import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.Model.GameTree			as Model.GameTree+import qualified	BishBosh.Model.MoveFrequency		as Model.MoveFrequency+import qualified	BishBosh.State.TurnsByLogicalColour	as State.TurnsByLogicalColour+import qualified	BishBosh.Test.QuickCheck.Model.GameTree	as Test.QuickCheck.Model.GameTree+import qualified	Data.Foldable+import qualified	Data.Tree+import qualified	Test.QuickCheck++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Test.QuickCheck.Model.GameTree.GameTree -> Test.QuickCheck.Property+		f gameTree	= Test.QuickCheck.label "MoveFrequency.prop_countMoves" $ Model.MoveFrequency.countEntries (+			Model.GameTree.toMoveFrequency gameTree+		 ) == State.TurnsByLogicalColour.getNPlies (+			Model.Game.getTurnsByLogicalColour . Data.Tree.rootLabel $ Model.GameTree.deconstruct gameTree+		 ) + pred {-the apex is counted in 'getNPlies'-} (+			Data.Foldable.length $ Model.GameTree.deconstruct gameTree+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Model/Result.hs view
@@ -0,0 +1,63 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Model.Result(+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			Control.Arrow((&&&))+import qualified	BishBosh.Model.Result		as Model.Result+import qualified	BishBosh.Property.Opposable	as Property.Opposable+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary Model.Result.Result where+	arbitrary	= Model.Result.mkResult `fmap` Test.QuickCheck.oneof [fmap Just Test.QuickCheck.arbitrary, return {-to Gen-monad-} Nothing]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Model.Result.Result -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Result.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Result.prop_read" $ case (reads garbage :: [(Model.Result.Result, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Model.Result.Result -> String -> Test.QuickCheck.Property+		f result	= Test.QuickCheck.label "Result.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) result+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Model.Result.Result -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Result.prop_getOpposite" . uncurry (==) . (Property.Opposable.getOpposite . Property.Opposable.getOpposite &&& id)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 8 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Notation/Coordinate.hs view
@@ -0,0 +1,97 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Notation.Coordinate(+-- * Types+-- ** Type-synonyms+--	Coordinate,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Component.Move()+import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector	as Cartesian.Vector+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Notation.Coordinate	as Notation.Coordinate+import qualified	BishBosh.Types			as T+import qualified	Data.Char+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type Coordinate	= Notation.Coordinate.Coordinate T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Notation.Coordinate.Coordinate x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Coordinate #-}+	arbitrary	= do+		move	<- Test.QuickCheck.arbitrary++		Notation.Coordinate.mkCoordinate move `fmap` if abs (+			Cartesian.Vector.getXDistance (Component.Move.measureDistance move :: Cartesian.Vector.VectorInt)+		 ) <= 1 && (+			Cartesian.Coordinates.getY . Component.Move.getSource &&& Cartesian.Coordinates.getY . Component.Move.getDestination $ move+		 ) `elem` [+			(succ Cartesian.Ordinate.yMin, Cartesian.Ordinate.yMin),	-- Black moving down.+			(pred Cartesian.Ordinate.yMax, Cartesian.Ordinate.yMax)		-- White moving up.+		 ]+			then Test.QuickCheck.oneof [+				return {-to Gen-monad-} Nothing,+				Test.QuickCheck.elements $ map Just Attribute.Rank.promotionProspects	-- CAVEAT: move & promotionRank are still unlikely to be compatible.+			]+			else return {-to Gen-monad-} Nothing++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Coordinate -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Coordinate.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Coordinate.prop_read" $ case (+			reads garbage :: [(Notation.Coordinate.Coordinate Int Int, String)]+		 ) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Coordinate -> String -> Test.QuickCheck.Property+		f coordinate	= Test.QuickCheck.label "Coordinate.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+			(+				`elem` concatMap show Attribute.Rank.promotionProspects+			) . Data.Char.toLower+		 ) coordinate+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 2048 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Notation/ICCFNumeric.hs view
@@ -0,0 +1,94 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Notation.ICCFNumeric(+-- * Types+-- ** Type-synonyms+--	ICCFNumeric,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Component.Move()+import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector	as Cartesian.Vector+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Notation.ICCFNumeric	as Notation.ICCFNumeric+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type ICCFNumeric	= Notation.ICCFNumeric.ICCFNumeric T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Notation.ICCFNumeric.ICCFNumeric x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary ICCFNumeric #-}+	arbitrary	= do+		move	<- Test.QuickCheck.arbitrary++		Notation.ICCFNumeric.mkICCFNumeric move `fmap` if abs (+			Cartesian.Vector.getXDistance (Component.Move.measureDistance move :: Cartesian.Vector.VectorInt)+		 ) <= 1 && (+			Cartesian.Coordinates.getY . Component.Move.getSource &&& Cartesian.Coordinates.getY . Component.Move.getDestination $ move+		 ) `elem` [+			(succ Cartesian.Ordinate.yMin, Cartesian.Ordinate.yMin),	-- Black moving down.+			(pred Cartesian.Ordinate.yMax, Cartesian.Ordinate.yMax)		-- White moving up.+		 ]+			then Test.QuickCheck.oneof [+				return {-to Gen-monad-} Nothing,+				Test.QuickCheck.elements $ map Just Attribute.Rank.promotionProspects	-- CAVEAT: move & promotionRank are still unlikely to be compatible.+			]+			else return {-to Gen-monad-} Nothing++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: ICCFNumeric -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "ICCFNumeric.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "ICCFNumeric.prop_read" $ case (+			reads garbage :: [(Notation.ICCFNumeric.ICCFNumeric Int Int, String)]+		 ) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: ICCFNumeric -> String -> Test.QuickCheck.Property+		f coordinate	= Test.QuickCheck.label "ICCFNumeric.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+			`elem` concatMap (show . fst {-digit-}) Notation.ICCFNumeric.toRank+		 ) coordinate+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 2048 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Notation/MoveNotation.hs view
@@ -0,0 +1,32 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Notation.MoveNotation () where++import qualified	BishBosh.Notation.MoveNotation	as Notation.MoveNotation+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Notation.MoveNotation.MoveNotation where+	arbitrary	= Test.QuickCheck.elements Notation.MoveNotation.range
+ src-test/BishBosh/Test/QuickCheck/Notation/Smith.hs view
@@ -0,0 +1,72 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Notation.Smith(+-- * Types+-- ** Type-synonyms+--	Smith,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Component.QualifiedMove()+import qualified	BishBosh.Component.Piece	as Component.Piece+import qualified	BishBosh.Notation.Smith		as Notation.Smith+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type Smith	= Notation.Smith.Smith T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Notation.Smith.Smith x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Smith #-}+	arbitrary	= fmap Notation.Smith.fromQualifiedMove Test.QuickCheck.arbitrary++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Smith -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Smith.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Smith.prop_read" $ case (+			reads garbage :: [(Notation.Smith.Smith Int Int, String)]+		 ) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Smith -> String -> Test.QuickCheck.Property+		f smith	= Test.QuickCheck.label "Smith.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` ("cCE" ++ concatMap show Component.Piece.range)) smith+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 512 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/Search/KillerMoves.hs view
@@ -0,0 +1,86 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Search.KillerMoves(+-- * Types+-- ** Type-synonyms+--	Key,+	KillerMoves,+-- * Constants+	results+-- * Functions+--	normalise,+--	populate+) where++import			BishBosh.Test.QuickCheck.Component.Turn()+import			Control.Arrow((&&&))+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Property.Empty		as Property.Empty+import qualified	BishBosh.Search.DynamicMoveData	as Search.DynamicMoveData+import qualified	BishBosh.Search.EphemeralData	as Search.EphemeralData+import qualified	BishBosh.Search.KillerMoves	as Search.KillerMoves+import qualified	BishBosh.Types			as T+import qualified	Test.QuickCheck++-- | Defines a concrete type for testing.+type KillerMoveKey	= Search.DynamicMoveData.KillerMoveKey T.X T.Y++instance (+	Enum				x,+	Enum				y,+	Ord				x,+	Ord				y,+	Test.QuickCheck.Arbitrary	x,+	Test.QuickCheck.Arbitrary	y+ ) => Test.QuickCheck.Arbitrary (Search.DynamicMoveData.KillerMoveKey x y) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary KillerMoveKey #-}+	arbitrary	= fmap Search.DynamicMoveData.mkKillerMoveKeyFromTurn Test.QuickCheck.arbitrary++normalise :: Int -> Component.Move.NPlies+normalise	= succ . (`mod` 4)++populate :: Ord key => [(Component.Move.NPlies, key)] -> Search.KillerMoves.KillerMoves key+populate	= foldr (\(nPlies, killerMoveKey) -> Search.KillerMoves.insert (normalise nPlies) killerMoveKey) Property.Empty.empty {-KillerMoves-}++-- | Defines a concrete type for testing.+type KillerMoves	= Search.KillerMoves.KillerMoves KillerMoveKey++instance (+	Enum				key,+	Ord				key,+	Test.QuickCheck.Arbitrary	key+ ) => Test.QuickCheck.Arbitrary (Search.KillerMoves.KillerMoves key) where+	arbitrary	= fmap populate Test.QuickCheck.arbitrary++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: [(Component.Move.NPlies, KillerMoveKey)] -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "KillerMoves.prop_insert/getNMoves" . uncurry (==) . (Search.EphemeralData.getSize . populate &&& length)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Search/Search.hs view
@@ -0,0 +1,71 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Search.Search(+-- * Constants+	results+) where++import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Evaluation.QuantifiedGame			as Evaluation.QuantifiedGame+import qualified	BishBosh.Input.SearchOptions				as Input.SearchOptions+import qualified	BishBosh.Model.Game					as Model.Game+import qualified	BishBosh.Search.Search					as Search.Search+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.Test.QuickCheck.Search.SearchState		as Test.QuickCheck.Search.SearchState+import qualified	Control.Monad.Reader+import qualified	Data.Default+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))++-- | The constant test-results.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+{- CAVEAT: has failed with [+	{captureMoveSortAlgorithm = MVVLVA, minimumHammingDistance = 2, retireKillerMovesAfter = 1, preferMovesTowardsCentre = True, sortOnStandardOpeningMoveFrequency = False, retireTranspositionsAfter = 0, minimumTranspositionSearchDepth = 2, trapRepeatedPositions = False},+	{captureMoveSortAlgorithm = SEE, retireKillerMovesAfter = 2, preferMovesTowardsCentre = False, sortOnStandardOpeningMoveFrequency = False, retireTranspositionsAfter = 1, minimumTranspositionSearchDepth = 1, trapRepeatedPositions = False, usePondering = False}+ ]+-}+	let+		f+			:: Input.SearchOptions.SearchOptions+			-> Input.SearchOptions.SearchDepth+			-> Test.QuickCheck.Search.SearchState.SearchState+			-> Test.QuickCheck.Property+		f searchOptions searchDepth searchState	= searchOptions /= Data.Default.def && not (+			Model.Game.isTerminated . Evaluation.QuantifiedGame.getGame . Evaluation.PositionHashQuantifiedGameTree.getRootQuantifiedGame $ Search.SearchState.getPositionHashQuantifiedGameTree searchState+		 ) ==> Test.QuickCheck.label "Search.prop_search/search-options" $ getQuantifiedGames searchOptions' == getQuantifiedGames defaultSearchOptions where+			defaultSearchOptions	= Data.Default.def++			searchOptions'	= searchOptions {+				Input.SearchOptions.getUsePondering			= Input.SearchOptions.getUsePondering defaultSearchOptions,+				Input.SearchOptions.getStandardOpeningOptions		= Input.SearchOptions.getStandardOpeningOptions defaultSearchOptions,+				Input.SearchOptions.getSearchDepthByLogicalColour	= Input.SearchOptions.getSearchDepthByLogicalColour defaultSearchOptions++			}++			getQuantifiedGames	= Search.Search.getQuantifiedGames . Control.Monad.Reader.runReader (Search.Search.search (Input.SearchOptions.minimumSearchDepth + mod searchDepth 3) searchState)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 128 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/Search/SearchState.hs view
@@ -0,0 +1,78 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary'.+-}++module BishBosh.Test.QuickCheck.Search.SearchState(+-- * Types+-- ** Type-synonyms+	SearchState+) where++import			BishBosh.Test.QuickCheck.Component.Zobrist()+import			BishBosh.Test.QuickCheck.Input.EvaluationOptions()+import			BishBosh.Test.QuickCheck.Input.SearchOptions()+import			BishBosh.Test.QuickCheck.Model.Game()+import qualified	BishBosh.Evaluation.PositionHashQuantifiedGameTree	as Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Input.EvaluationOptions			as Input.EvaluationOptions+import qualified	BishBosh.Property.Empty					as Property.Empty+import qualified	BishBosh.Search.SearchState				as Search.SearchState+import qualified	BishBosh.Types						as T+import qualified	Data.Array.IArray+import qualified	Data.Bits+import qualified	System.Random+import qualified	Test.QuickCheck++-- | A suitable concrete type for testing.+type SearchState	= Search.SearchState.SearchState T.X T.Y T.PositionHash T.CriterionValue T.WeightedMean++instance forall x y positionHash criterionValue weightedMean. (+	Data.Array.IArray.Ix		x,+	Data.Bits.FiniteBits		positionHash,+	Fractional			criterionValue,+	Fractional			weightedMean,+	Integral			x,+	Integral			y,+	Num				positionHash,+	Real				criterionValue,+	Real				weightedMean,+	Show				positionHash,+	Show				x,+	Show				y,+	System.Random.Random		positionHash,+	Test.QuickCheck.Arbitrary	criterionValue,+	Test.QuickCheck.Arbitrary	weightedMean,+	Test.QuickCheck.Arbitrary	x,+	Test.QuickCheck.Arbitrary	y+ ) => Test.QuickCheck.Arbitrary (Search.SearchState.SearchState x y positionHash criterionValue weightedMean) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary SearchState #-}+	arbitrary	= do+		evaluationOptions	<- Test.QuickCheck.arbitrary++		Search.SearchState.initialise <$> (+			Evaluation.PositionHashQuantifiedGameTree.mkPositionHashQuantifiedGameTree (+				evaluationOptions	:: Input.EvaluationOptions.EvaluationOptions T.CriterionWeight T.PieceSquareValue T.RankValue x y+			) <$> Test.QuickCheck.arbitrary {-SearchOptions-} <*> Test.QuickCheck.arbitrary {-Zobrist-} <*> return {-to Gen-monad-} Property.Empty.empty {-MoveFrequency-} <*> Test.QuickCheck.arbitrary {-Game-}+		 )+
+ src-test/BishBosh/Test/QuickCheck/State/Board.hs view
@@ -0,0 +1,231 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.Board(+-- * Types+-- ** Type-synonyms+	Board,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			BishBosh.Test.QuickCheck.Component.Piece()+import			Control.Arrow((&&&))+import			Data.Array.IArray((!))+import qualified	BishBosh.Attribute.Direction				as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour			as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank					as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa				as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates				as Cartesian.Coordinates+import qualified	BishBosh.Component.Move					as Component.Move+import qualified	BishBosh.Component.Piece				as Component.Piece+import qualified	BishBosh.Property.Empty					as Property.Empty+import qualified	BishBosh.Property.ForsythEdwards			as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable				as Property.Opposable+import qualified	BishBosh.Property.Reflectable				as Property.Reflectable+import qualified	BishBosh.State.Board					as State.Board+import qualified	BishBosh.State.CoordinatesByRankByLogicalColour		as State.CoordinatesByRankByLogicalColour+import qualified	BishBosh.State.MaybePieceByCoordinates			as State.MaybePieceByCoordinates+import qualified	BishBosh.Test.QuickCheck.Cartesian.Coordinates		as Test.QuickCheck.Cartesian.Coordinates+import qualified	BishBosh.Types						as T+import qualified	Control.Monad+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type Board	= State.Board.Board T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (State.Board.Board x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Board #-}+	arbitrary	= let+		isKingChecked :: (Enum x, Enum y, Ord x, Ord y) => Attribute.LogicalColour.LogicalColour -> State.Board.Board x y -> Bool+		isKingChecked logicalColour board = any (+			not . null . ($ board) . State.Board.findAttackersOf logicalColour+		 ) . State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.King $ State.Board.getCoordinatesByRankByLogicalColour board+	 in Control.Monad.foldM (+		\board piece -> Test.QuickCheck.suchThat (+			fmap (+				($ board) . State.Board.defineCoordinates (Just piece)	-- Mutate the board.+			) . Test.QuickCheck.suchThat Test.QuickCheck.arbitrary {-destination-} $ uncurry (&&) . (+				Data.Maybe.maybe True {-unoccupied-} (+					not . Component.Piece.isKing	-- Avoid taking a King.+				) . (`State.MaybePieceByCoordinates.dereference` State.Board.getMaybePieceByCoordinates board) &&& not . (`Component.Piece.isPawnPromotion` piece)	-- Avoid impossible scenarios.+			) -- Predicate.+		) $ not . uncurry (||) . (+			isKingChecked minBound &&& isKingChecked maxBound+		) -- Predicate.+	 ) Property.Empty.empty {-Board-} $ Data.List.sortBy (+		Data.Ord.comparing Component.Piece.getRank	-- Minimise the chance that either 'selectDestination' or 'mutateBoard' must recurse, by moving both Kings to the end of the list.+	 ) Component.Piece.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Board -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Board.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "Board.prop_read" $ case (reads garbage :: [(Board, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> String -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` ('/' : concatMap show Component.Piece.range ++ concatMap show [1 .. Cartesian.Abscissa.xLength])) board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_fen" $ case Property.ForsythEdwards.readsFEN $ Property.ForsythEdwards.showFEN board of+			[(board', "")]	-> board' == board+			_		-> False+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 16 } f,+	let+		f :: Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Property+		f source logicalColour	= Test.QuickCheck.label "Board.prop_bishopsMove/logicalColour" . all (+			(== Cartesian.Coordinates.getLogicalColourOfSquare source) . Cartesian.Coordinates.getLogicalColourOfSquare . fst {-coordinates-}+		 ) . State.MaybePieceByCoordinates.listDestinationsFor source piece . State.Board.getMaybePieceByCoordinates $ State.Board.placePiece piece source Property.Empty.empty {-Board-} where+			piece	= Component.Piece.mkBishop logicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Cartesian.Coordinates.Coordinates -> Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Property+		f source logicalColour	= Test.QuickCheck.label "Board.prop_knightsMove/logicalColour" . all (+			(/= Cartesian.Coordinates.getLogicalColourOfSquare source) . Cartesian.Coordinates.getLogicalColourOfSquare . fst {-coordinates-}+		 ) . State.MaybePieceByCoordinates.listDestinationsFor source piece . State.Board.getMaybePieceByCoordinates $ State.Board.placePiece piece source Property.Empty.empty {-Board-} where+			piece	= Component.Piece.mkKnight logicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_listDestinationsFor/unique" $ all (+			\(coordinates, piece) -> uncurry (==) . (+				length &&& length . Data.List.nub+			) $ State.MaybePieceByCoordinates.listDestinationsFor coordinates piece maybePieceByCoordinates+		 ) $ State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates where+			maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_(findAttacksBy <=> findAttackersOf)" $ all (+			\(piece, coordinates) -> let+				logicalColour	= Component.Piece.getLogicalColour piece+			in all (+				\destination -> foldr (+					\rank m -> foldr (+						\source -> Data.Map.insertWith Data.Set.union source $ Data.Set.singleton rank+					) m $ State.Board.findAttacksBy (+						Component.Piece.mkPiece (Property.Opposable.getOpposite logicalColour) rank+					) destination board+				) Data.Map.empty Attribute.Rank.range == foldr (+					\(source, rank)	-> Data.Map.insertWith Data.Set.union source $ Data.Set.singleton rank+				) Data.Map.empty (+					State.Board.findAttackersOf logicalColour destination board+				)+			) coordinates+		 ) . State.CoordinatesByRankByLogicalColour.assocs $ State.Board.getCoordinatesByRankByLogicalColour board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_(findBlockingPiece => isObstructed)" $ all (+			\(source, _) -> let+				isClear	= ($ maybePieceByCoordinates) . State.MaybePieceByCoordinates.isClear source+			in all (+				\direction -> Data.Maybe.maybe (+					Data.Maybe.maybe True isClear . Data.Maybe.listToMaybe . reverse $ Cartesian.Coordinates.extrapolate direction source+				) (+					isClear . fst {-destination-}+				) $ State.MaybePieceByCoordinates.findBlockingPiece direction source maybePieceByCoordinates+			) Attribute.Direction.range+		 ) $ State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates where+			maybePieceByCoordinates	= State.Board.getMaybePieceByCoordinates board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Board.prop_findPieces" . uncurry (==) . (+			Data.List.sort . State.CoordinatesByRankByLogicalColour.findPieces (const True) . State.Board.getCoordinatesByRankByLogicalColour &&& Data.List.sort . State.MaybePieceByCoordinates.findPieces . State.Board.getMaybePieceByCoordinates+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Board.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Board.prop_reflectOnY" . uncurry (==) . (id &&& Property.Reflectable.reflectOnY . Property.Reflectable.reflectOnY)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Board.prop_countPawnsByFileByLogicalColour" . (+			\coordinatesByRankByLogicalColour -> all (+				uncurry (==) . (+					Data.Foldable.sum . (+						State.CoordinatesByRankByLogicalColour.countPawnsByFileByLogicalColour coordinatesByRankByLogicalColour !+					) &&& length . (+						\logicalColour -> State.CoordinatesByRankByLogicalColour.dereference logicalColour Attribute.Rank.Pawn coordinatesByRankByLogicalColour+					)+				)+			) Attribute.LogicalColour.range+		 ) . State.Board.getCoordinatesByRankByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_(exposesKing => isKingChecked)" $ all (+			\(logicalColour, move)	-> State.Board.isKingChecked logicalColour $ State.Board.movePiece move Nothing board+		 ) [+			(logicalColour, move) |+				(source, piece)		<- State.MaybePieceByCoordinates.findPieces $ State.Board.getMaybePieceByCoordinates board,+				let logicalColour	= Component.Piece.getLogicalColour piece,+				(destination, _)	<- State.MaybePieceByCoordinates.listDestinationsFor source piece $ State.Board.getMaybePieceByCoordinates board,+				let move	= Component.Move.mkMove source destination,+				State.Board.exposesKing logicalColour move board+		 ]	-- List-comprehension.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f,+	let+		f :: Board -> Test.QuickCheck.Property+		f board	= Test.QuickCheck.label "Board.prop_findProximateKnights" . all (+			\(coordinates, piece) -> let+				logicalColour	= Property.Opposable.getOpposite $ Component.Piece.getLogicalColour piece+			in Data.List.sort (+				State.MaybePieceByCoordinates.findProximateKnights logicalColour coordinates maybePieceByCoordinates+			) == Data.List.sort (+				State.CoordinatesByRankByLogicalColour.findProximateKnights logicalColour coordinates coordinatesByRankByLogicalColour+			)+		 ) $ State.MaybePieceByCoordinates.findPieces maybePieceByCoordinates where+			(maybePieceByCoordinates, coordinatesByRankByLogicalColour)	= State.Board.getMaybePieceByCoordinates &&& State.Board.getCoordinatesByRankByLogicalColour $ board+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/State/CastleableRooksByLogicalColour.hs view
@@ -0,0 +1,122 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.CastleableRooksByLogicalColour(+-- * Types+-- ** Type-synonyms+	CastleableRooksByLogicalColour,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Attribute.LogicalColour()+import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Reflectable			as Property.Reflectable+import qualified	BishBosh.State.CastleableRooksByLogicalColour	as State.CastleableRooksByLogicalColour+import qualified	BishBosh.Test.QuickCheck.Cartesian.Coordinates	as Test.QuickCheck.Cartesian.Coordinates+import qualified	BishBosh.Types					as T+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import			Test.QuickCheck((==>))++instance (+	Enum	x,+	Ord	x,+	Show	x+ ) => Test.QuickCheck.Arbitrary (State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x) where+	arbitrary	= fmap (+		State.CastleableRooksByLogicalColour.fromAssocs . Data.List.Extra.groupSort+	 ) . Test.QuickCheck.elements $ Data.List.subsequences [+		(logicalColour, x) |+			logicalColour	<- Attribute.LogicalColour.range,+			x		<- [Cartesian.Abscissa.xMin, Cartesian.Abscissa.xMax]+	 ] -- List-comprehension.++-- | Defines a concrete type for testing.+type CastleableRooksByLogicalColour	= State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour T.X++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_read" $ case (reads garbage :: [(CastleableRooksByLogicalColour, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: CastleableRooksByLogicalColour -> String -> Test.QuickCheck.Property+		f castleableRooksByLogicalColour	= Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) castleableRooksByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_reflectOnX" . uncurry (==) . (id &&& Property.Reflectable.reflectOnX . Property.Reflectable.reflectOnX)+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_fen" . uncurry (==) . (+			State.CastleableRooksByLogicalColour.unify . Property.ForsythEdwards.readFEN . Property.ForsythEdwards.showFEN &&& State.CastleableRooksByLogicalColour.unify+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f castleableRooksByLogicalColour = Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_(canCastle /= hasCastled)" . not $ any (+			uncurry (&&) . (+				(`State.CastleableRooksByLogicalColour.canCastle` castleableRooksByLogicalColour) &&& (`State.CastleableRooksByLogicalColour.hasCastled` castleableRooksByLogicalColour)+			)+		 ) Attribute.LogicalColour.range+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 32 } f,+	let+		f :: Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f logicalColour coordinates castleableRooksByLogicalColour = coordinates `notElem` [+			minBound,+			Cartesian.Coordinates.bottomRight,+			Cartesian.Coordinates.topLeft,+			maxBound+		 ] ==> Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_canCastleWith" . not $ State.CastleableRooksByLogicalColour.canCastleWith logicalColour coordinates castleableRooksByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64} f,+	let+		f :: Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f logicalColour coordinates castleableRooksByLogicalColour = State.CastleableRooksByLogicalColour.canCastleWith logicalColour coordinates castleableRooksByLogicalColour ==> Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_(canCastleWith => canCastle)" $ State.CastleableRooksByLogicalColour.canCastle logicalColour castleableRooksByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {+		Test.QuickCheck.maxSuccess	= 64,+		Test.QuickCheck.maxDiscardRatio	= 128+	} f,+	let+		f :: Attribute.LogicalColour.LogicalColour -> Test.QuickCheck.Cartesian.Coordinates.Coordinates -> CastleableRooksByLogicalColour -> Test.QuickCheck.Property+		f logicalColour coordinates castleableRooksByLogicalColour = not (State.CastleableRooksByLogicalColour.canCastle logicalColour castleableRooksByLogicalColour) ==> Test.QuickCheck.label "CastleableRooksByLogicalColour.prop_(not . canCastle => not . canCastleWith)" . not $ State.CastleableRooksByLogicalColour.canCastleWith logicalColour coordinates castleableRooksByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/State/Censor.hs view
@@ -0,0 +1,95 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.Censor(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.State.Board			as State.Board+import qualified	BishBosh.State.Censor			as State.Censor+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	Test.QuickCheck+-- import		Test.QuickCheck((==>))++-- | The constant test-results.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_countPiecesByLogicalColour" . uncurry (==) . (+			State.Censor.countPiecesByLogicalColour . State.Board.getMaybePieceByCoordinates &&& State.Censor.countPiecesByLogicalColour . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_countPieces" . uncurry (==) . (+			State.Censor.countPieces . State.Board.getMaybePieceByCoordinates &&& State.Censor.countPieces . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_countPieces/bounds" . uncurry (&&) . (+			(> 2) &&& (<= 32)+		 ) . State.Censor.countPieces . State.Board.getCoordinatesByRankByLogicalColour . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_countPieceDifferenceByRank" . uncurry (==) . (+			State.Censor.countPieceDifferenceByRank . State.Board.getMaybePieceByCoordinates &&& State.Censor.countPieceDifferenceByRank . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+{-+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f game = Model.Game.isTerminated game ==> Test.QuickCheck.label "Censor.prop_hasInsufficientMaterial" . uncurry (==) . (+			State.Censor.hasInsufficientMaterial . State.Board.getMaybePieceByCoordinates &&& State.Censor.hasInsufficientMaterial . State.Board.getCoordinatesByRankByLogicalColour+		 ) $ Model.Game.getBoard game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {+		Test.QuickCheck.maxDiscardRatio	= 2048,+		Test.QuickCheck.maxSuccess	= 8+	} f,+-}+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_hasBothKings" . uncurry (==) . (+			State.Censor.hasBothKings . State.Board.getMaybePieceByCoordinates &&& State.Censor.hasBothKings . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Censor.prop_(getNPieces == countPieces)" . uncurry (==) . (+			State.Board.getNPieces &&& State.Censor.countPieces . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "Censor.prop_(getNPiecesDifferenceByRank == countPieceDifferenceByRank)" . uncurry (==) . (+			State.Board.getNPiecesDifferenceByRank &&& State.Censor.countPieceDifferenceByRank . State.Board.getCoordinatesByRankByLogicalColour+		 ) . Model.Game.getBoard+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/State/InstancesByPosition.hs view
@@ -0,0 +1,52 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.InstancesByPosition(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.State.InstancesByPosition	as State.InstancesByPosition+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	Test.QuickCheck++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "InstancesByPosition.prop_countPositionRepetitions" . uncurry (==) . (+			State.InstancesByPosition.countPositionRepetitions &&& uncurry (-) . (+				succ . State.InstancesByPosition.countConsecutiveRepeatablePlies &&& State.InstancesByPosition.getNDistinctPositions+			)+		 ) . Model.Game.getInstancesByPosition+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "InstancesByPosition.prop_anyInstancesByPosition (< 1)" . not . State.InstancesByPosition.anyInstancesByPosition (< 1) . Model.Game.getInstancesByPosition+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/State/Position.hs view
@@ -0,0 +1,56 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.Position(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.State.EnPassantAbscissa	as State.EnPassantAbscissa+import qualified	BishBosh.State.Position			as State.Position+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	Data.List+import qualified	Test.QuickCheck++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f = Test.QuickCheck.label "Position.prop_getMaybeEnPassantAbscissa" . uncurry (==) . (+			fmap (+				Cartesian.Coordinates.getX . Component.Move.getDestination . Component.QualifiedMove.getMove	-- Extract the ordinate.+			) . Data.List.find (+				Attribute.MoveType.isEnPassant . Component.QualifiedMove.getMoveType+			) . Model.Game.findQualifiedMovesAvailableToNextPlayer &&& fmap State.EnPassantAbscissa.getAbscissa . State.Position.getMaybeEnPassantAbscissa . Model.Game.mkPosition+		 )+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/State/TurnsByLogicalColour.hs view
@@ -0,0 +1,83 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.State.TurnsByLogicalColour(+-- * Types+-- ** Type-synonyms+--	TurnsByLogicalColour,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Component.Turn()+import			Control.Arrow((&&&))+import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa+import qualified	BishBosh.Component.Piece		as Component.Piece+import qualified	BishBosh.Component.Turn			as Component.Turn+import qualified	BishBosh.Model.Game			as Model.Game+import qualified	BishBosh.State.TurnsByLogicalColour	as State.TurnsByLogicalColour+import qualified	BishBosh.Test.QuickCheck.Model.Game	as Test.QuickCheck.Model.Game+import qualified	BishBosh.Types				as T+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Define a concrete type for testing.+type TurnsByLogicalColour	= State.TurnsByLogicalColour.TurnsByLogicalColour (Component.Turn.Turn T.X T.Y)++instance (+	Show				a,+	Test.QuickCheck.Arbitrary	a+ ) => Test.QuickCheck.Arbitrary (State.TurnsByLogicalColour.TurnsByLogicalColour a) where+--	{-# SPECIALISE instance Test.QuickCheck.Arbitrary TurnsByLogicalColour #-}+	arbitrary	= do+		turns	<- Test.QuickCheck.arbitrary++		let (black, white)	= splitAt (length turns `div` 2) turns++		return {-to Gen-monad-} $ State.TurnsByLogicalColour.fromAssocs [(maxBound, white), (minBound, black)]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: TurnsByLogicalColour -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "TurnsByLogicalColour.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "TurnsByLogicalColour.prop_read" $ case (reads garbage :: [(TurnsByLogicalColour, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 64 } f,+	let+		f :: TurnsByLogicalColour -> String -> Test.QuickCheck.Property+		f turnsByLogicalColour	= Test.QuickCheck.label "TurnsByLogicalColour.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` ('/' : concatMap show Component.Piece.range ++ concatMap show [1 .. Cartesian.Abscissa.xLength])) turnsByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 128 } f,+	let+		f :: Test.QuickCheck.Model.Game.Game -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "TurnsByLogicalColour.prop_getNPlies" . uncurry (==) . (State.TurnsByLogicalColour.getNPlies &&& State.TurnsByLogicalColour.countPlies) . Model.Game.getTurnsByLogicalColour+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/UI/Command.hs view
@@ -0,0 +1,65 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.UI.Command (+-- * Types+-- ** Type-synonyms+--	Command,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.UI.PrintObject()+import			BishBosh.Test.QuickCheck.UI.SetObject()+import qualified	BishBosh.Types		as T+import qualified	BishBosh.UI.Command	as UI.Command+-- import qualified	Control.Arrow+import qualified	Test.QuickCheck++-- | Define a concrete type for testing.+type Command	= UI.Command.Command T.X T.Y++instance Test.QuickCheck.Arbitrary (UI.Command.Command x y) where+	arbitrary	= Test.QuickCheck.oneof [+		return {-to Gen-monad-} UI.Command.Hint,+		fmap UI.Command.Print Test.QuickCheck.arbitrary,+		return {-to Gen-monad-} UI.Command.Quit,+		return {-to Gen-monad-} UI.Command.Resign,+		return {-to Gen-monad-} UI.Command.Restart,+		fmap (UI.Command.RollBack . fmap (`mod` 10)) Test.QuickCheck.arbitrary,+		return {-to Gen-monad-} UI.Command.Save,+		fmap UI.Command.Set Test.QuickCheck.arbitrary,+		return {-to Gen-monad-} UI.Command.Swap+	 ]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: Command -> Test.QuickCheck.Property+		f command	= Test.QuickCheck.label "Command.prop_io" $ UI.Command.readsCommand (UI.Command.showsCommand command "") == Right (command, "")+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f+ ]+
+ src-test/BishBosh/Test/QuickCheck/UI/PrintObject.hs view
@@ -0,0 +1,59 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.UI.PrintObject (+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	BishBosh.UI.PrintObject		as UI.PrintObject+import qualified	Data.Char+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary UI.PrintObject.PrintObject where+	arbitrary	= Test.QuickCheck.elements UI.PrintObject.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: UI.PrintObject.PrintObject -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "PrintObject.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "PrintObject.prop_read" $ case (reads garbage :: [(UI.PrintObject.PrintObject, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: UI.PrintObject.PrintObject -> String -> Test.QuickCheck.Property+		f printObject	= Test.QuickCheck.label "PrintObject.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+			uncurry (||) . (Data.Char.isAlphaNum &&& (`elem` "_'"))	-- Haskell's lexer accepts these.+		 ) printObject+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024 } f+ ]
+ src-test/BishBosh/Test/QuickCheck/UI/SetObject.hs view
@@ -0,0 +1,59 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.UI.SetObject (+-- * Constants+	results+) where++import qualified	BishBosh.Input.SearchOptions	as Input.SearchOptions+import qualified	BishBosh.UI.SetObject		as UI.SetObject+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++instance Test.QuickCheck.Arbitrary UI.SetObject.SetObject where+	arbitrary	= fmap (UI.SetObject.SearchDepth . (+ Input.SearchOptions.minimumSearchDepth) . (`mod` 4)) Test.QuickCheck.arbitrary++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: UI.SetObject.SetObject -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "SetObject.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "SetObject.prop_read" $ case (reads garbage :: [(UI.SetObject.SetObject, String)]) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: UI.SetObject.SetObject -> String -> Test.QuickCheck.Property+		f setObject	= Test.QuickCheck.label "SetObject.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` (".-+eEoOxX" ++ ['0' .. '9'])) setObject+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 1024} f+ ]+++
+ src-test/Main.hs view
@@ -0,0 +1,155 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh 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 3 of the License, or+	(at your option) any later version.++	BishBosh 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 BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The entry-point to the application's test-suite.+-}++module Main(main) where++import qualified	BishBosh.Test.HUnit.Attribute.Direction						as Test.HUnit.Attribute.Direction+import qualified	BishBosh.Test.HUnit.Attribute.LogicalColour					as Test.HUnit.Attribute.LogicalColour+import qualified	BishBosh.Test.HUnit.Attribute.Rank						as Test.HUnit.Attribute.Rank+import qualified	BishBosh.Test.HUnit.Cartesian.Coordinates					as Test.HUnit.Cartesian.Coordinates+import qualified	BishBosh.Test.HUnit.Cartesian.Vector						as Test.HUnit.Cartesian.Vector+import qualified	BishBosh.Test.HUnit.Component.Move						as Test.HUnit.Component.Move+import qualified	BishBosh.Test.HUnit.Component.Piece						as Test.HUnit.Component.Piece+import qualified	BishBosh.Test.HUnit.Component.Zobrist						as Test.HUnit.Component.Zobrist+import qualified	BishBosh.Test.HUnit.ContextualNotation.PGN					as Test.HUnit.ContextualNotation.PGN+import qualified	BishBosh.Test.HUnit.ContextualNotation.PositionHashQualifiedMoveTree		as Test.HUnit.ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.Test.HUnit.ContextualNotation.StandardAlgebraic			as Test.HUnit.ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Test.HUnit.Evaluation.Fitness						as Test.HUnit.Evaluation.Fitness+import qualified	BishBosh.Test.HUnit.Input.Options						as Test.HUnit.Input.Options+import qualified	BishBosh.Test.HUnit.Model.Game							as Test.HUnit.Model.Game+import qualified	BishBosh.Test.HUnit.Model.GameTree						as Test.HUnit.Model.GameTree+import qualified	BishBosh.Test.HUnit.Model.PositionHashTree					as Test.HUnit.Model.PositionHashTree+-- import qualified	BishBosh.Test.HUnit.Search.Search						as Test.HUnit.Search.Search+import qualified	BishBosh.Test.HUnit.State.Board							as Test.HUnit.State.Board+import qualified	BishBosh.Test.QuickCheck.Attribute.Direction					as Test.QuickCheck.Attribute.Direction+import qualified	BishBosh.Test.QuickCheck.Attribute.LogicalColour				as Test.QuickCheck.Attribute.LogicalColour+import qualified	BishBosh.Test.QuickCheck.Attribute.MoveType					as Test.QuickCheck.Attribute.MoveType+import qualified	BishBosh.Test.QuickCheck.Attribute.Rank						as Test.QuickCheck.Attribute.Rank+import qualified	BishBosh.Test.QuickCheck.Cartesian.Coordinates					as Test.QuickCheck.Cartesian.Coordinates+import qualified	BishBosh.Test.QuickCheck.Cartesian.Vector					as Test.QuickCheck.Cartesian.Vector+import qualified	BishBosh.Test.QuickCheck.Component.Move						as Test.QuickCheck.Component.Move+import qualified	BishBosh.Test.QuickCheck.Component.Piece					as Test.QuickCheck.Component.Piece+import qualified	BishBosh.Test.QuickCheck.Component.QualifiedMove				as Test.QuickCheck.Component.QualifiedMove+import qualified	BishBosh.Test.QuickCheck.Component.Turn						as Test.QuickCheck.Component.Turn+import qualified	BishBosh.Test.QuickCheck.Component.Zobrist					as Test.QuickCheck.Component.Zobrist+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.PGN					as Test.QuickCheck.ContextualNotation.PGN+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.PGNComment				as Test.QuickCheck.ContextualNotation.PGNComment+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.PositionHashQualifiedMoveTree	as Test.QuickCheck.ContextualNotation.PositionHashQualifiedMoveTree+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.QualifiedMoveForest			as Test.QuickCheck.ContextualNotation.QualifiedMoveForest+import qualified	BishBosh.Test.QuickCheck.ContextualNotation.StandardAlgebraic			as Test.QuickCheck.ContextualNotation.StandardAlgebraic+import qualified	BishBosh.Test.QuickCheck.Data.Integral						as Test.QuickCheck.Data.Integral+import qualified	BishBosh.Test.QuickCheck.Evaluation.PositionHashQuantifiedGameTree		as Test.QuickCheck.Evaluation.PositionHashQuantifiedGameTree+import qualified	BishBosh.Test.QuickCheck.Input.CriteriaWeights					as Test.QuickCheck.Input.CriteriaWeights+import qualified	BishBosh.Test.QuickCheck.Input.EvaluationOptions				as Test.QuickCheck.Input.EvaluationOptions+import qualified	BishBosh.Test.QuickCheck.Input.Options						as Test.QuickCheck.Input.Options+import qualified	BishBosh.Test.QuickCheck.Model.Game						as Test.QuickCheck.Model.Game+import qualified	BishBosh.Test.QuickCheck.Model.GameTerminationReason				as Test.QuickCheck.Model.GameTerminationReason+import qualified	BishBosh.Test.QuickCheck.Model.GameTree						as Test.QuickCheck.Model.GameTree+import qualified	BishBosh.Test.QuickCheck.Model.MoveFrequency					as Test.QuickCheck.Model.MoveFrequency+import qualified	BishBosh.Test.QuickCheck.Model.Result						as Test.QuickCheck.Model.Result+import qualified	BishBosh.Test.QuickCheck.Notation.Coordinate					as Test.QuickCheck.Notation.Coordinate+import qualified	BishBosh.Test.QuickCheck.Notation.ICCFNumeric					as Test.QuickCheck.Notation.ICCFNumeric+import qualified	BishBosh.Test.QuickCheck.Notation.Smith						as Test.QuickCheck.Notation.Smith+import qualified	BishBosh.Test.QuickCheck.Search.KillerMoves					as Test.QuickCheck.Search.KillerMoves+-- import qualified	BishBosh.Test.QuickCheck.Search.Search						as Test.QuickCheck.Search.Search+import qualified	BishBosh.Test.QuickCheck.State.Board						as Test.QuickCheck.State.Board+import qualified	BishBosh.Test.QuickCheck.State.CastleableRooksByLogicalColour			as Test.QuickCheck.State.CastleableRooksByLogicalColour+import qualified	BishBosh.Test.QuickCheck.State.Censor						as Test.QuickCheck.State.Censor+import qualified	BishBosh.Test.QuickCheck.State.InstancesByPosition				as Test.QuickCheck.State.InstancesByPosition+import qualified	BishBosh.Test.QuickCheck.State.Position						as Test.QuickCheck.State.Position+import qualified	BishBosh.Test.QuickCheck.State.TurnsByLogicalColour				as Test.QuickCheck.State.TurnsByLogicalColour+import qualified	BishBosh.Test.QuickCheck.UI.Command						as Test.QuickCheck.UI.Command+import qualified	BishBosh.Test.QuickCheck.UI.PrintObject						as Test.QuickCheck.UI.PrintObject+import qualified	BishBosh.Test.QuickCheck.UI.SetObject						as Test.QuickCheck.UI.SetObject+import qualified	Control.Monad+import qualified	System.Exit+import qualified	Test.HUnit+import qualified	ToolShed.Test.QuickCheck.Result++-- | Entry-point to the test-suite.+main :: IO ()+main	= mapM_ Test.HUnit.runTestTT [+	Test.HUnit.Attribute.Direction.testCases,+	Test.HUnit.Attribute.LogicalColour.testCases,+	Test.HUnit.Attribute.Rank.testCases,+	Test.HUnit.Cartesian.Coordinates.testCases,+	Test.HUnit.Cartesian.Vector.testCases,+	Test.HUnit.Component.Piece.testCases,+	Test.HUnit.Component.Move.testCases,+	Test.HUnit.Component.Zobrist.testCases,+	Test.HUnit.State.Board.testCases,+	Test.HUnit.Model.Game.testCases,+	Test.HUnit.Model.GameTree.testCases,+	Test.HUnit.Model.PositionHashTree.testCases,+	Test.HUnit.ContextualNotation.StandardAlgebraic.testCases,+	Test.HUnit.ContextualNotation.PGN.testCases,+	Test.HUnit.ContextualNotation.PositionHashQualifiedMoveTree.testCases,+	Test.HUnit.Input.Options.testCases,+	Test.HUnit.Evaluation.Fitness.testCases+--	Test.HUnit.Search.Search.testCases+ ] >> mapM_ (+	(`Control.Monad.unless` System.Exit.exitFailure) . all ToolShed.Test.QuickCheck.Result.isSuccessful =<<+ ) [+	Test.QuickCheck.Data.Integral.results,+	Test.QuickCheck.Attribute.LogicalColour.results,+	Test.QuickCheck.Attribute.Direction.results,+	Test.QuickCheck.Attribute.Rank.results,+	Test.QuickCheck.Attribute.MoveType.results,+	Test.QuickCheck.Input.CriteriaWeights.results,+	Test.QuickCheck.Input.EvaluationOptions.results,+	Test.QuickCheck.Input.Options.results,+	Test.QuickCheck.Cartesian.Coordinates.results,+	Test.QuickCheck.Cartesian.Vector.results,+	Test.QuickCheck.Component.Piece.results,+	Test.QuickCheck.Component.Move.results,+	Test.QuickCheck.Component.QualifiedMove.results,+	Test.QuickCheck.Component.Turn.results,+	Test.QuickCheck.Notation.Coordinate.results,+	Test.QuickCheck.Notation.ICCFNumeric.results,+	Test.QuickCheck.Notation.Smith.results,+	Test.QuickCheck.Model.GameTerminationReason.results,+	Test.QuickCheck.Model.Result.results,+	Test.QuickCheck.State.CastleableRooksByLogicalColour.results,+	Test.QuickCheck.State.Position.results,+	Test.QuickCheck.State.InstancesByPosition.results,+	Test.QuickCheck.State.Board.results,+	Test.QuickCheck.State.Censor.results,+	Test.QuickCheck.State.TurnsByLogicalColour.results,+	Test.QuickCheck.Model.Game.results,+	Test.QuickCheck.Model.GameTree.results,+	Test.QuickCheck.Model.MoveFrequency.results,+	Test.QuickCheck.Component.Zobrist.results,+	Test.QuickCheck.ContextualNotation.PositionHashQualifiedMoveTree.results,+	Test.QuickCheck.ContextualNotation.StandardAlgebraic.results,+	Test.QuickCheck.ContextualNotation.PGNComment.results,+	Test.QuickCheck.ContextualNotation.PGN.results,+	Test.QuickCheck.ContextualNotation.QualifiedMoveForest.results,+	Test.QuickCheck.Evaluation.PositionHashQuantifiedGameTree.results,+	Test.QuickCheck.Search.KillerMoves.results,+	Test.QuickCheck.UI.PrintObject.results,+	Test.QuickCheck.UI.SetObject.results,+	Test.QuickCheck.UI.Command.results+--	Test.QuickCheck.Search.Search.results+ ]+