From 8cda4dd70e39014661116ea80c37429bcbcee0a5 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 11 Sep 2024 10:04:11 +0530 Subject: [PATCH 01/27] chore: copy a bunch of files from chess-rs --- games/src/ataxx/piece.rs | 1 - games/src/ataxx/square.rs | 1 - games/src/chess/bitboard.rs | 113 +++++++++++++++++++ games/src/chess/castling.rs | 207 ++++++++++++++++++++++++++++++++++ games/src/chess/color.rs | 89 +++++++++++++++ games/src/chess/mod.rs | 20 ++++ games/src/chess/move.rs | 144 ++++++++++++++++++++++++ games/src/chess/moves.rs | 144 ++++++++++++++++++++++++ games/src/chess/position.rs | 217 ++++++++++++++++++++++++++++++++++++ games/src/chess/square.rs | 51 +++++++++ games/src/chess/zobrist.rs | 83 ++++++++++++++ games/src/interface/hash.rs | 3 +- games/src/interface/mod.rs | 6 +- games/src/lib.rs | 2 + 14 files changed, 1075 insertions(+), 6 deletions(-) create mode 100644 games/src/chess/bitboard.rs create mode 100644 games/src/chess/castling.rs create mode 100644 games/src/chess/color.rs create mode 100644 games/src/chess/mod.rs create mode 100644 games/src/chess/move.rs create mode 100644 games/src/chess/moves.rs create mode 100644 games/src/chess/position.rs create mode 100644 games/src/chess/square.rs create mode 100644 games/src/chess/zobrist.rs diff --git a/games/src/ataxx/piece.rs b/games/src/ataxx/piece.rs index e5e5b4a..99b6098 100644 --- a/games/src/ataxx/piece.rs +++ b/games/src/ataxx/piece.rs @@ -13,7 +13,6 @@ use std::fmt; use std::ops; -use std::str::FromStr; use crate::interface::representable_type; use crate::interface::ColoredPieceType; diff --git a/games/src/ataxx/square.rs b/games/src/ataxx/square.rs index f0028c1..80b97c0 100644 --- a/games/src/ataxx/square.rs +++ b/games/src/ataxx/square.rs @@ -12,7 +12,6 @@ // limitations under the License. use std::fmt; -use std::str::FromStr; use crate::interface::{representable_type, RepresentableType, SquareType}; diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs new file mode 100644 index 0000000..cbc95bb --- /dev/null +++ b/games/src/chess/bitboard.rs @@ -0,0 +1,113 @@ +// Copyright © 2024 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::interface::{bitboard_type, BitBoardType, RepresentableType}; + +use super::Square; + +bitboard_type! { + /// A set of Squares implemented as a bitset where the `1 << sq.into()` bit + /// represents whether `sq` is in the BitBoard or not. + struct BitBoard : u64 { + // The BitBoard's Square type. + Square = Square; + + // BitBoards representing the null and the universe sets. + Empty = Self(0); + Universe = Self(0xfffffffffffff); + + // BitBoards containing the squares of the first file and the first rank. + FirstFile = Self(0x0101010101010101); + FirstRank = Self(0xff00000000000000); + } +} + +impl BitBoard { + pub fn new(raw: u64) -> BitBoard { + BitBoard(raw) + } +} + +impl BitBoard { + pub fn between(sq_1: Square, sq_2: Square) -> BitBoard { + BitBoard(BitBoard::BETWEEN[sq_1 as usize][sq_2 as usize]) + } + + #[rustfmt::skip] + const BETWEEN: [[u64; Square::N]; Square::N] = [ + [ 0x0101010101010100, 0x0000000000000000, 0x0000000000000002, 0x0000000000000006, 0x000000000000000e, 0x000000000000001e, 0x000000000000003e, 0x000000000000007e, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040200, 0x0000000000000000, 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040200 ], + [ 0x0000000000000000, 0x0202020202020200, 0x0000000000000000, 0x0000000000000004, 0x000000000000000c, 0x000000000000001c, 0x000000000000003c, 0x000000000000007c, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000002, 0x0000000000000000, 0x0404040404040400, 0x0000000000000000, 0x0000000000000008, 0x0000000000000018, 0x0000000000000038, 0x0000000000000078, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000006, 0x0000000000000004, 0x0000000000000000, 0x0808080808080800, 0x0000000000000000, 0x0000000000000010, 0x0000000000000030, 0x0000000000000070, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x000000000000000e, 0x000000000000000c, 0x0000000000000008, 0x0000000000000000, 0x1010101010101000, 0x0000000000000000, 0x0000000000000020, 0x0000000000000060, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x000000000000001e, 0x000000000000001c, 0x0000000000000018, 0x0000000000000010, 0x0000000000000000, 0x2020202020202000, 0x0000000000000000, 0x0000000000000040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x000000000000003e, 0x000000000000003c, 0x0000000000000038, 0x0000000000000030, 0x0000000000000020, 0x0000000000000000, 0x4040404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000 ], + [ 0x000000000000007e, 0x000000000000007c, 0x0000000000000078, 0x0000000000000070, 0x0000000000000060, 0x0000000000000040, 0x0000000000000000, 0x8080808080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0002040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010101010001, 0x0000000000000000, 0x0000000000000200, 0x0000000000000600, 0x0000000000000e00, 0x0000000000001e00, 0x0000000000003e00, 0x0000000000007e00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020202020002, 0x0000000000000000, 0x0000000000000400, 0x0000000000000c00, 0x0000000000001c00, 0x0000000000003c00, 0x0000000000007c00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0404040404040004, 0x0000000000000000, 0x0000000000000800, 0x0000000000001800, 0x0000000000003800, 0x0000000000007800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000600, 0x0000000000000400, 0x0000000000000000, 0x0808080808080008, 0x0000000000000000, 0x0000000000001000, 0x0000000000003000, 0x0000000000007000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000e00, 0x0000000000000c00, 0x0000000000000800, 0x0000000000000000, 0x1010101010100010, 0x0000000000000000, 0x0000000000002000, 0x0000000000006000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001e00, 0x0000000000001c00, 0x0000000000001800, 0x0000000000001000, 0x0000000000000000, 0x2020202020200020, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000003e00, 0x0000000000003c00, 0x0000000000003800, 0x0000000000003000, 0x0000000000002000, 0x0000000000000000, 0x4040404040400040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000007e00, 0x0000000000007c00, 0x0000000000007800, 0x0000000000007000, 0x0000000000006000, 0x0000000000004000, 0x0000000000000000, 0x8080808080800080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000 ], + [ 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010101000101, 0x0000000000000000, 0x0000000000020000, 0x0000000000060000, 0x00000000000e0000, 0x00000000001e0000, 0x00000000003e0000, 0x00000000007e0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020202000202, 0x0000000000000000, 0x0000000000040000, 0x00000000000c0000, 0x00000000001c0000, 0x00000000003c0000, 0x00000000007c0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000 ], + [ 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0404040404000404, 0x0000000000000000, 0x0000000000080000, 0x0000000000180000, 0x0000000000380000, 0x0000000000780000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000 ], + [ 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000060000, 0x0000000000040000, 0x0000000000000000, 0x0808080808000808, 0x0000000000000000, 0x0000000000100000, 0x0000000000300000, 0x0000000000700000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000e0000, 0x00000000000c0000, 0x0000000000080000, 0x0000000000000000, 0x1010101010001010, 0x0000000000000000, 0x0000000000200000, 0x0000000000600000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000001e0000, 0x00000000001c0000, 0x0000000000180000, 0x0000000000100000, 0x0000000000000000, 0x2020202020002020, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000003e0000, 0x00000000003c0000, 0x0000000000380000, 0x0000000000300000, 0x0000000000200000, 0x0000000000000000, 0x4040404040004040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000007e0000, 0x00000000007c0000, 0x0000000000780000, 0x0000000000700000, 0x0000000000600000, 0x0000000000400000, 0x0000000000000000, 0x8080808080008080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000 ], + [ 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010100010101, 0x0000000000000000, 0x0000000002000000, 0x0000000006000000, 0x000000000e000000, 0x000000001e000000, 0x000000003e000000, 0x000000007e000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020200020202, 0x0000000000000000, 0x0000000004000000, 0x000000000c000000, 0x000000001c000000, 0x000000003c000000, 0x000000007c000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0404040400040404, 0x0000000000000000, 0x0000000008000000, 0x0000000018000000, 0x0000000038000000, 0x0000000078000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000 ], + [ 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000006000000, 0x0000000004000000, 0x0000000000000000, 0x0808080800080808, 0x0000000000000000, 0x0000000010000000, 0x0000000030000000, 0x0000000070000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000 ], + [ 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000000e000000, 0x000000000c000000, 0x0000000008000000, 0x0000000000000000, 0x1010101000101010, 0x0000000000000000, 0x0000000020000000, 0x0000000060000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000001e000000, 0x000000001c000000, 0x0000000018000000, 0x0000000010000000, 0x0000000000000000, 0x2020202000202020, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000003e000000, 0x000000003c000000, 0x0000000038000000, 0x0000000030000000, 0x0000000020000000, 0x0000000000000000, 0x4040404000404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000007e000000, 0x000000007c000000, 0x0000000078000000, 0x0000000070000000, 0x0000000060000000, 0x0000000040000000, 0x0000000000000000, 0x8080808000808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000 ], + [ 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010001010101, 0x0000000000000000, 0x0000000200000000, 0x0000000600000000, 0x0000000e00000000, 0x0000001e00000000, 0x0000003e00000000, 0x0000007e00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020002020202, 0x0000000000000000, 0x0000000400000000, 0x0000000c00000000, 0x0000001c00000000, 0x0000003c00000000, 0x0000007c00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0404040004040404, 0x0000000000000000, 0x0000000800000000, 0x0000001800000000, 0x0000003800000000, 0x0000007800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000600000000, 0x0000000400000000, 0x0000000000000000, 0x0808080008080808, 0x0000000000000000, 0x0000001000000000, 0x0000003000000000, 0x0000007000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000 ], + [ 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000e00000000, 0x0000000c00000000, 0x0000000800000000, 0x0000000000000000, 0x1010100010101010, 0x0000000000000000, 0x0000002000000000, 0x0000006000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000 ], + [ 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001e00000000, 0x0000001c00000000, 0x0000001800000000, 0x0000001000000000, 0x0000000000000000, 0x2020200020202020, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000003e00000000, 0x0000003c00000000, 0x0000003800000000, 0x0000003000000000, 0x0000002000000000, 0x0000000000000000, 0x4040400040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000007e00000000, 0x0000007c00000000, 0x0000007800000000, 0x0000007000000000, 0x0000006000000000, 0x0000004000000000, 0x0000000000000000, 0x8080800080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000 ], + [ 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101000101010101, 0x0000000000000000, 0x0000020000000000, 0x0000060000000000, 0x00000e0000000000, 0x00001e0000000000, 0x00003e0000000000, 0x00007e0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202000202020202, 0x0000000000000000, 0x0000040000000000, 0x00000c0000000000, 0x00001c0000000000, 0x00003c0000000000, 0x00007c0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0404000404040404, 0x0000000000000000, 0x0000080000000000, 0x0000180000000000, 0x0000380000000000, 0x0000780000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000060000000000, 0x0000040000000000, 0x0000000000000000, 0x0808000808080808, 0x0000000000000000, 0x0000100000000000, 0x0000300000000000, 0x0000700000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000e0000000000, 0x00000c0000000000, 0x0000080000000000, 0x0000000000000000, 0x1010001010101010, 0x0000000000000000, 0x0000200000000000, 0x0000600000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000 ], + [ 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00001e0000000000, 0x00001c0000000000, 0x0000180000000000, 0x0000100000000000, 0x0000000000000000, 0x2020002020202020, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000 ], + [ 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00003e0000000000, 0x00003c0000000000, 0x0000380000000000, 0x0000300000000000, 0x0000200000000000, 0x0000000000000000, 0x4040004040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007e0000000000, 0x00007c0000000000, 0x0000780000000000, 0x0000700000000000, 0x0000600000000000, 0x0000400000000000, 0x0000000000000000, 0x8080008080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000 ], + [ 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0100010101010101, 0x0000000000000000, 0x0002000000000000, 0x0006000000000000, 0x000e000000000000, 0x001e000000000000, 0x003e000000000000, 0x007e000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200020202020202, 0x0000000000000000, 0x0004000000000000, 0x000c000000000000, 0x001c000000000000, 0x003c000000000000, 0x007c000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0400040404040404, 0x0000000000000000, 0x0008000000000000, 0x0018000000000000, 0x0038000000000000, 0x0078000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0006000000000000, 0x0004000000000000, 0x0000000000000000, 0x0800080808080808, 0x0000000000000000, 0x0010000000000000, 0x0030000000000000, 0x0070000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000e000000000000, 0x000c000000000000, 0x0008000000000000, 0x0000000000000000, 0x1000101010101010, 0x0000000000000000, 0x0020000000000000, 0x0060000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x001e000000000000, 0x001c000000000000, 0x0018000000000000, 0x0010000000000000, 0x0000000000000000, 0x2000202020202020, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x003e000000000000, 0x003c000000000000, 0x0038000000000000, 0x0030000000000000, 0x0020000000000000, 0x0000000000000000, 0x4000404040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x007e000000000000, 0x007c000000000000, 0x0078000000000000, 0x0070000000000000, 0x0060000000000000, 0x0040000000000000, 0x0000000000000000, 0x8000808080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], + [ 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810204000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010101010101, 0x0000000000000000, 0x0200000000000000, 0x0600000000000000, 0x0e00000000000000, 0x1e00000000000000, 0x3e00000000000000, 0x7e00000000000000 ], + [ 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020202, 0x0000000000000000, 0x0400000000000000, 0x0c00000000000000, 0x1c00000000000000, 0x3c00000000000000, 0x7c00000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200000000000000, 0x0000000000000000, 0x0004040404040404, 0x0000000000000000, 0x0800000000000000, 0x1800000000000000, 0x3800000000000000, 0x7800000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0600000000000000, 0x0400000000000000, 0x0000000000000000, 0x0008080808080808, 0x0000000000000000, 0x1000000000000000, 0x3000000000000000, 0x7000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0e00000000000000, 0x0c00000000000000, 0x0800000000000000, 0x0000000000000000, 0x0010101010101010, 0x0000000000000000, 0x2000000000000000, 0x6000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1e00000000000000, 0x1c00000000000000, 0x1800000000000000, 0x1000000000000000, 0x0000000000000000, 0x0020202020202020, 0x0000000000000000, 0x4000000000000000 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x3e00000000000000, 0x3c00000000000000, 0x3800000000000000, 0x3000000000000000, 0x2000000000000000, 0x0000000000000000, 0x0040404040404040, 0x0000000000000000 ], + [ 0x0040201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000, 0x0000000000000000, 0x0040201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x7e00000000000000, 0x7c00000000000000, 0x7800000000000000, 0x7000000000000000, 0x6000000000000000, 0x4000000000000000, 0x0000000000000000, 0x0080808080808080 ], + ]; +} diff --git a/games/src/chess/castling.rs b/games/src/chess/castling.rs new file mode 100644 index 0000000..5652040 --- /dev/null +++ b/games/src/chess/castling.rs @@ -0,0 +1,207 @@ +// Copyright © 2023 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::interface::{BitBoardType, RepresentableType, SquareType}; + +use super::{BitBoard, Color, File, Rank, Square}; +use std::ops; + +#[derive(Copy, Clone, PartialEq, Eq, Default)] +pub struct Rights(pub u8); + +impl Rights { + pub const N: usize = 16; + + pub const WH: Rights = + Rights(SideColor(Color::White, Side::H).bit_offset() as u8); + pub const WA: Rights = + Rights(SideColor(Color::White, Side::A).bit_offset() as u8); + pub const BH: Rights = + Rights(SideColor(Color::Black, Side::H).bit_offset() as u8); + pub const BA: Rights = + Rights(SideColor(Color::Black, Side::A).bit_offset() as u8); + + pub fn has(self, side: SideColor) -> bool { + self.0 >> side.bit_offset() & 1 != 0 + } +} + +impl From for Rights { + fn from(color: Color) -> Self { + Rights((1 << (4 + 1)) << color as u16) + } +} + +#[allow(clippy::suspicious_arithmetic_impl)] +impl ops::Add for Rights { + type Output = Rights; + + fn add(self, rhs: Self) -> Self::Output { + Rights(self.0 | rhs.0) + } +} + +impl ops::Sub for Rights { + type Output = Rights; + + fn sub(self, rhs: Self) -> Self::Output { + Rights(self.0 & !rhs.0) + } +} + +impl ops::Add for Rights { + type Output = Rights; + + fn add(self, rhs: SideColor) -> Self::Output { + Rights(self.0 | 1 << rhs.bit_offset()) + } +} + +impl ops::Sub for Rights { + type Output = Rights; + + fn sub(self, rhs: SideColor) -> Self::Output { + Rights(self.0 & !(1 << rhs.bit_offset())) + } +} + +#[allow(clippy::suspicious_arithmetic_impl)] +impl ops::Add for Rights { + type Output = Rights; + + fn add(self, rhs: Color) -> Self::Output { + Rights(self.0 | Rights::from(rhs).0) + } +} + +impl ops::Sub for Rights { + type Output = Rights; + + fn sub(self, rhs: Color) -> Self::Output { + Rights(self.0 & !Rights::from(rhs).0) + } +} + +#[derive(Copy, Clone, PartialEq, Eq)] +pub struct SideColor(pub Color, pub Side); + +impl SideColor { + pub const N: usize = 4; + + pub fn from_sqs(king_sq: Square, rook_sq: Square) -> SideColor { + let color: Color = if king_sq.rank() == Rank::First { + Color::White + } else { + Color::Black + }; + + SideColor(color, Side::from_sqs(king_sq, rook_sq)) + } + + pub fn get_targets(self) -> (Square, Square) { + match self { + SideColor(Color::White, Side::H) => (Square::G1, Square::F1), + SideColor(Color::White, Side::A) => (Square::C1, Square::D1), + SideColor(Color::Black, Side::H) => (Square::G8, Square::F8), + SideColor(Color::Black, Side::A) => (Square::C8, Square::D8), + } + } + + const fn bit_offset(self) -> usize { + let SideColor(color, side) = self; + color as usize * Color::N + side as usize + } +} + +#[derive(Copy, Clone, PartialEq, Eq)] +#[rustfmt::skip] +pub enum Side { + H, A, +} + +impl Side { + pub fn from_sqs(king_sq: Square, rook_sq: Square) -> Side { + if (king_sq as u8) < rook_sq as u8 { + Side::H + } else { + Side::A + } + } +} + +#[derive(Clone)] +pub struct Info { + pub rights: Rights, + rooks: [Square; SideColor::N], + paths: [BitBoard; SideColor::N], + rights_masks: [Rights; Square::N], +} + +impl Info { + //pub fn from_pos_and_str() -> Info {} + + #[rustfmt::skip] + pub fn from_squares( + w_king: Square, w_rook_h: File, w_rook_a: File, + b_king: Square, b_rook_h: File, b_rook_a: File, + ) -> Info { + let mut info = Info { + rights: Rights(0), + rooks: [Square::A1; SideColor::N], + paths: [BitBoard::EMPTY; SideColor::N], + rights_masks: [Rights::default(); Square::N], + }; + + // Get the bit offsets/indexes of each side-color. + let wh = SideColor(Color::White, Side::H).bit_offset(); + let wa = SideColor(Color::White, Side::A).bit_offset(); + let bh = SideColor(Color::Black, Side::H).bit_offset(); + let ba = SideColor(Color::Black, Side::A).bit_offset(); + + // Initialize the rook square table. + info.rooks[wh] = Square::new(w_rook_h, Rank::First); + info.rooks[wa] = Square::new(w_rook_a, Rank::First); + info.rooks[bh] = Square::new(b_rook_h, Rank::Eighth); + info.rooks[ba] = Square::new(b_rook_a, Rank::Eighth); + + // Initialize the castling path table. + info.paths[wh] = BitBoard::between(w_king, info.rooks[wh]) | BitBoard::from(w_king); + info.paths[wa] = BitBoard::between(w_king, info.rooks[wa]) | BitBoard::from(w_king); + info.paths[bh] = BitBoard::between(b_king, info.rooks[bh]) | BitBoard::from(b_king); + info.paths[ba] = BitBoard::between(b_king, info.rooks[ba]) | BitBoard::from(b_king); + + // Initialize the rights update for the king's squares. + info.rights_masks[w_king as usize] = Rights::WH + Rights::WA; + info.rights_masks[b_king as usize] = Rights::BH + Rights::BA; + + // Initialize the rights update for the rook's squares. + info.rights_masks[w_rook_h as usize] = Rights::WH; + info.rights_masks[w_rook_a as usize] = Rights::WA; + info.rights_masks[b_rook_h as usize] = Rights::BH; + info.rights_masks[b_rook_a as usize] = Rights::BA; + + info + } + + pub fn get_updates(&self, square: Square) -> Rights { + self.rights_masks[square as usize] + } + + pub fn rook(&self, side: SideColor) -> Square { + self.rooks[side.bit_offset()] + } + + pub fn path(&self, side: SideColor) -> BitBoard { + self.paths[side.bit_offset()] + } +} diff --git a/games/src/chess/color.rs b/games/src/chess/color.rs new file mode 100644 index 0000000..8ac3100 --- /dev/null +++ b/games/src/chess/color.rs @@ -0,0 +1,89 @@ +// Copyright © 2024 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::fmt; +use std::ops; + +use crate::interface::representable_type; +use crate::interface::ColoredPieceType; +use crate::interface::RepresentableType; + +representable_type!( + /// Color represents all the possible colors that an ataxx piece can have, + /// specifically, Black and White. + enum Color: u8 { White "w", Black "b", } +); + +impl ops::Not for Color { + type Output = Color; + + /// not implements the not unary operator (!) which switches the current Color + /// to its opposite, i.e. [`Color::Black`] to [`Color::White`] and vice versa. + fn not(self) -> Self::Output { + unsafe { Color::unsafe_from(self as usize ^ 1) } + } +} + +representable_type!( + /// Piece represents the types of pieces in ataxx, namely Piece and Block. + enum Piece: u8 { + Pawn "p", Knight "n", Bishop "b", Rook "r", Queen "q", King "k", + } +); + +representable_type!( + /// Piece represents all the possible ataxx pieces. + enum ColoredPiece: u8 { + WhitePawn "P", WhiteKnight "N", WhiteBishop "B", + WhiteRook "R", WhiteQueen "Q", WhiteKing "K", + BlackPawn "p", BlackKnight "n", BlackBishop "b", + BlackRook "r", BlackQueen "q", BlackKing "k", + } +); + +impl ColoredPieceType for ColoredPiece { + type Piece = Piece; + type Color = Color; + + fn piece(self) -> Piece { + match self { + ColoredPiece::BlackPawn | ColoredPiece::WhitePawn => Piece::Pawn, + ColoredPiece::BlackKnight | ColoredPiece::WhiteKnight => { + Piece::Knight + } + ColoredPiece::BlackBishop | ColoredPiece::WhiteBishop => { + Piece::Bishop + } + ColoredPiece::BlackRook | ColoredPiece::WhiteRook => Piece::Rook, + ColoredPiece::BlackQueen | ColoredPiece::WhiteQueen => Piece::Queen, + ColoredPiece::BlackKing | ColoredPiece::WhiteKing => Piece::King, + } + } + + fn color(self) -> Color { + match self { + ColoredPiece::WhitePawn + | ColoredPiece::WhiteKnight + | ColoredPiece::WhiteBishop + | ColoredPiece::WhiteRook + | ColoredPiece::WhiteQueen + | ColoredPiece::WhiteKing => Color::White, + ColoredPiece::BlackPawn + | ColoredPiece::BlackKnight + | ColoredPiece::BlackBishop + | ColoredPiece::BlackRook + | ColoredPiece::BlackQueen + | ColoredPiece::BlackKing => Color::Black, + } + } +} diff --git a/games/src/chess/mod.rs b/games/src/chess/mod.rs new file mode 100644 index 0000000..b3ccb68 --- /dev/null +++ b/games/src/chess/mod.rs @@ -0,0 +1,20 @@ +// Namespaced modules. +pub mod castling; +pub mod moves; +pub mod zobrist; + +// Non-namespaced modules. +mod bitboard; +mod color; +mod r#move; +mod position; +mod square; + +// Make the contents of the non-namespaced +// modules public, so they can be accessed +// without their parent namespace. +pub use self::bitboard::*; +pub use self::color::*; +pub use self::position::*; +pub use self::r#move::*; +pub use self::square::*; diff --git a/games/src/chess/move.rs b/games/src/chess/move.rs new file mode 100644 index 0000000..aed1c35 --- /dev/null +++ b/games/src/chess/move.rs @@ -0,0 +1,144 @@ +// Copyright © 2023 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::{fmt, str::FromStr}; + +use crate::{ + chess, + interface::{representable_type, MoveType, RepresentableType}, +}; + +#[derive(Copy, Clone, PartialEq, Default)] +pub struct Move(u16); + +impl MoveType for Move { + const NULL: Move = Move(0); + const MAX_IN_GAME: usize = 256; + const MAX_IN_POSITION: usize = 256; +} + +impl From for Move { + fn from(value: u16) -> Self { + Move(value) + } +} + +impl From for u16 { + fn from(value: Move) -> Self { + value.0 + } +} + +impl FromStr for Move { + type Err = (); + fn from_str(_s: &str) -> Result { + Ok(Self::NULL) + } +} + +impl Move { + // Bit-widths of fields. + const SOURCE_WIDTH: u16 = 6; + const TARGET_WIDTH: u16 = 6; + const PROMOT_WIDTH: u16 = 2; + const MVFLAG_WIDTH: u16 = 2; + + // Bit-masks of fields. + const SOURCE_MASK: u16 = (1 << Move::SOURCE_WIDTH) - 1; + const TARGET_MASK: u16 = (1 << Move::TARGET_WIDTH) - 1; + const PROMOT_MASK: u16 = (1 << Move::PROMOT_WIDTH) - 1; + const MVFLAG_MASK: u16 = (1 << Move::MVFLAG_WIDTH) - 1; + + // Bit-offsets of fields. + const SOURCE_OFFSET: u16 = 0; + const TARGET_OFFSET: u16 = Move::SOURCE_OFFSET + Move::SOURCE_WIDTH; + const PROMOT_OFFSET: u16 = Move::TARGET_OFFSET + Move::TARGET_WIDTH; + const MVFLAG_OFFSET: u16 = Move::PROMOT_OFFSET + Move::PROMOT_WIDTH; + + #[inline(always)] + pub fn new( + source: chess::Square, + target: chess::Square, + mvflag: MoveFlag, + ) -> Move { + Move( + (mvflag as u16) << Move::MVFLAG_OFFSET + | (source as u16) << Move::SOURCE_OFFSET + | (target as u16) << Move::TARGET_OFFSET, + ) + } + + #[inline(always)] + pub fn new_with_promotion( + source: chess::Square, + target: chess::Square, + promotion: chess::Piece, + ) -> Move { + Move( + (promotion as u16 - 1) << Move::PROMOT_OFFSET + | (MoveFlag::Promotion as u16) << Move::MVFLAG_OFFSET + | (source as u16) << Move::SOURCE_OFFSET + | (target as u16) << Move::TARGET_OFFSET, + ) + } + + #[inline(always)] + pub fn source(self) -> chess::Square { + unsafe { + chess::Square::unsafe_from( + (self.0 >> Move::SOURCE_OFFSET) & Move::SOURCE_MASK, + ) + } + } + + #[inline(always)] + pub fn target(self) -> chess::Square { + unsafe { + chess::Square::unsafe_from( + (self.0 >> Move::TARGET_OFFSET) & Move::TARGET_MASK, + ) + } + } + + #[inline(always)] + pub fn promot(self) -> chess::Piece { + // +1 to account for the fact that move encodes + // Piece::Knight as 0, while actually it is 1. + unsafe { + chess::Piece::unsafe_from( + ((self.0 >> Move::PROMOT_OFFSET) & Move::PROMOT_MASK) + 1, + ) + } + } + + #[inline(always)] + pub fn flags(self) -> MoveFlag { + unsafe { + MoveFlag::unsafe_from( + ((self.0 >> Move::MVFLAG_OFFSET) & Move::MVFLAG_MASK) as u8, + ) + } + } +} + +representable_type! { + enum MoveFlag: u8 { + Normal "n", Castle "c", Promotion "p", EnPassant "e", + } +} + +impl fmt::Display for Move { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}{}", self.source(), self.target()) + } +} diff --git a/games/src/chess/moves.rs b/games/src/chess/moves.rs new file mode 100644 index 0000000..e6449ea --- /dev/null +++ b/games/src/chess/moves.rs @@ -0,0 +1,144 @@ +// Copyright © 2023 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::chess::{BitBoard, Color, Square}; + +use crate::interface::RepresentableType; + +pub fn pawn_attacks(square: Square, color: Color) -> BitBoard { + BitBoard::new(PAWN_ATTACKS_TABLE[color as usize][square as usize]) +} + +pub fn knight(square: Square) -> BitBoard { + BitBoard::new(KNIGHT_MOVES_TABLE[square as usize]) +} + +// #[rustfmt::skip] +// #[inline(always)] +// pub fn bishop(square: Square, blockers: BitBoard) -> BitBoard { +// hyperbola(square, blockers, BitBoard::diagonal(square.diagonal())) | +// hyperbola(square, blockers, BitBoard::anti_diagonal(square.anti_diagonal())) +// } + +// #[rustfmt::skip] +// #[inline(always)] +// pub fn rook(square: Square, blockers: BitBoard) -> BitBoard { +// hyperbola(square, blockers, BitBoard::file(square.file())) | +// hyperbola(square, blockers, BitBoard::rank(square.rank())) +// } + +// #[inline(always)] +// pub fn queen(square: Square, blockers: BitBoard) -> BitBoard { +// bishop(square, blockers) | rook(square, blockers) +// } + +pub fn king(square: Square) -> BitBoard { + BitBoard::new(KING_MOVES_TABLE[square as usize]) +} + +#[allow(dead_code)] +fn hyperbola(square: Square, blockers: BitBoard, mask: BitBoard) -> BitBoard { + let mask = mask.0; + let square = BitBoard::from(square).0; + let rev_sq = square.reverse_bits(); + let blockers = blockers.0; + + let mut ray = blockers & mask; + let mut rev = ray.reverse_bits(); + ray = ray.wrapping_sub(square.wrapping_mul(2)); + rev = rev.wrapping_sub(rev_sq.wrapping_mul(2)); + ray ^= rev.reverse_bits(); + ray &= mask; + + BitBoard(ray) +} + +#[rustfmt::skip] +const KING_MOVES_TABLE: [u64; Square::N] = [ + 0x0000000000000302, 0x0000000000000705, 0x0000000000000e0a, 0x0000000000001c14, + 0x0000000000003828, 0x0000000000007050, 0x000000000000e0a0, 0x000000000000c040, + 0x0000000000030203, 0x0000000000070507, 0x00000000000e0a0e, 0x00000000001c141c, + 0x0000000000382838, 0x0000000000705070, 0x0000000000e0a0e0, 0x0000000000c040c0, + 0x0000000003020300, 0x0000000007050700, 0x000000000e0a0e00, 0x000000001c141c00, + 0x0000000038283800, 0x0000000070507000, 0x00000000e0a0e000, 0x00000000c040c000, + 0x0000000302030000, 0x0000000705070000, 0x0000000e0a0e0000, 0x0000001c141c0000, + 0x0000003828380000, 0x0000007050700000, 0x000000e0a0e00000, 0x000000c040c00000, + 0x0000030203000000, 0x0000070507000000, 0x00000e0a0e000000, 0x00001c141c000000, + 0x0000382838000000, 0x0000705070000000, 0x0000e0a0e0000000, 0x0000c040c0000000, + 0x0003020300000000, 0x0007050700000000, 0x000e0a0e00000000, 0x001c141c00000000, + 0x0038283800000000, 0x0070507000000000, 0x00e0a0e000000000, 0x00c040c000000000, + 0x0302030000000000, 0x0705070000000000, 0x0e0a0e0000000000, 0x1c141c0000000000, + 0x3828380000000000, 0x7050700000000000, 0xe0a0e00000000000, 0xc040c00000000000, + 0x0203000000000000, 0x0507000000000000, 0x0a0e000000000000, 0x141c000000000000, + 0x2838000000000000, 0x5070000000000000, 0xa0e0000000000000, 0x40c0000000000000, +]; + +#[rustfmt::skip] +const KNIGHT_MOVES_TABLE: [u64; Square::N] = [ + 0x0000000000020400, 0x0000000000050800, 0x00000000000a1100, 0x0000000000142200, + 0x0000000000284400, 0x0000000000508800, 0x0000000000a01000, 0x0000000000402000, + 0x0000000002040004, 0x0000000005080008, 0x000000000a110011, 0x0000000014220022, + 0x0000000028440044, 0x0000000050880088, 0x00000000a0100010, 0x0000000040200020, + 0x0000000204000402, 0x0000000508000805, 0x0000000a1100110a, 0x0000001422002214, + 0x0000002844004428, 0x0000005088008850, 0x000000a0100010a0, 0x0000004020002040, + 0x0000020400040200, 0x0000050800080500, 0x00000a1100110a00, 0x0000142200221400, + 0x0000284400442800, 0x0000508800885000, 0x0000a0100010a000, 0x0000402000204000, + 0x0002040004020000, 0x0005080008050000, 0x000a1100110a0000, 0x0014220022140000, + 0x0028440044280000, 0x0050880088500000, 0x00a0100010a00000, 0x0040200020400000, + 0x0204000402000000, 0x0508000805000000, 0x0a1100110a000000, 0x1422002214000000, + 0x2844004428000000, 0x5088008850000000, 0xa0100010a0000000, 0x4020002040000000, + 0x0400040200000000, 0x0800080500000000, 0x1100110a00000000, 0x2200221400000000, + 0x4400442800000000, 0x8800885000000000, 0x100010a000000000, 0x2000204000000000, + 0x0004020000000000, 0x0008050000000000, 0x00110a0000000000, 0x0022140000000000, + 0x0044280000000000, 0x0088500000000000, 0x0010a00000000000, 0x0020400000000000, +]; + +#[rustfmt::skip] +const PAWN_ATTACKS_TABLE: [[u64; Square::N]; Color::N] = [ + [ + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000002, 0x0000000000000005, 0x000000000000000a, 0x0000000000000014, + 0x0000000000000028, 0x0000000000000050, 0x00000000000000a0, 0x0000000000000040, + 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, + 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, + 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, + 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, + 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, + 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, + 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, + 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, + 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, + 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, + 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, + 0x0028000000000000, 0x0050000000000000, 0x00a0000000000000, 0x0040000000000000, + ], + [ + 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, + 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, + 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, + 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, + 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, + 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, + 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, + 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, + 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, + 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, + 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, + 0x0028000000000000, 0x0050000000000000, 0x00a0000000000000, 0x0040000000000000, + 0x0200000000000000, 0x0500000000000000, 0x0a00000000000000, 0x1400000000000000, + 0x2800000000000000, 0x5000000000000000, 0xa000000000000000, 0x4000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + ], +]; diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs new file mode 100644 index 0000000..2cfb5a3 --- /dev/null +++ b/games/src/chess/position.rs @@ -0,0 +1,217 @@ +// Copyright © 2024 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::fmt; +use std::num::ParseIntError; +use std::str::FromStr; + +use strum::IntoEnumIterator; + +use crate::interface; +use crate::interface::ColoredPieceType; +use crate::interface::PiecePlacementParseError; +use crate::interface::PositionType; +use crate::interface::TypeParseError; +use crate::interface::{BitBoardType, Hash, RepresentableType, SquareType}; + +use thiserror::Error; + +#[rustfmt::skip] +use crate::chess::{ + BitBoard, ColoredPiece, File, Move, + Rank, Square, Color, Piece, castling +}; +use crate::interface::MoveStore; + +/// Position represents the snapshot of an Ataxx Board, the state of the an +/// ataxx game at a single point in time. It also provides all of the methods +/// necessary to manipulate such a snapshot. +#[derive(Clone)] +pub struct Position { + // BitBoard board representation. + pub color_bbs: [BitBoard; Color::N], + pub piece_bbs: [BitBoard; Piece::N], + + // Position metadata. + side_to_move: Color, + ply_count: u16, + half_move_clock: u8, + + #[allow(dead_code)] + en_passant_target: Option, + + // Game metadata. + #[allow(dead_code)] + is_fischer_random: bool, + #[allow(dead_code)] + castling_square_info: castling::Info, + checksum: Hash, +} + +impl PositionType for Position { + type BitBoard = BitBoard; + type ColoredPiece = ColoredPiece; + type Move = Move; + + fn insert(&mut self, sq: Square, piece: ColoredPiece) { + self.piece_bbs[piece.piece() as usize].insert(sq); + self.color_bbs[piece.color() as usize].insert(sq); + } + + fn remove(&mut self, sq: Square) -> Option { + match self.at(sq) { + Some(piece) => { + self.piece_bbs[piece.piece() as usize].remove(sq); + self.color_bbs[piece.color() as usize].remove(sq); + Some(piece) + } + None => None, + } + } + + fn at(&self, sq: Square) -> Option { + ColoredPiece::iter() + .find(|piece| self.colored_piece_bb(*piece).contains(sq)) + } + + fn piece_bb(&self, piece: Piece) -> BitBoard { + self.piece_bbs[piece as usize] + } + + fn color_bb(&self, color: Color) -> BitBoard { + self.color_bbs[color as usize] + } + + fn colored_piece_bb(&self, piece: ColoredPiece) -> BitBoard { + self.piece_bb(piece.piece()) & self.color_bb(piece.color()) + } + + fn hash(&self) -> Hash { + self.checksum + } + + fn is_game_over(&self) -> bool { + false + } + + fn winner(&self) -> Option { + None + } + + fn after_move(&self, _m: Move) -> Position { + self.clone() + } + + fn generate_moves_into< + const ALLOW_ILLEGAL: bool, + const QUIET: bool, + const NOISY: bool, + T: MoveStore, + >( + &self, + _movelist: &mut T, + ) { + } +} + +/// PositionParseErr represents an error encountered while parsing +/// the given FEN position field into a valid Position. +#[derive(Error, Debug)] +pub enum PositionParseError { + #[error("expected 3 fields, found {0}")] + TooManyFields(usize), + + #[error("parsing piece placement: {0}")] + BadPiecePlacement(#[from] PiecePlacementParseError), + + #[error("parsing side to move: {0}")] + BadSideToMove(#[from] TypeParseError), + #[error("parsing half-move clock: {0}")] + BadHalfMoveClock(#[from] ParseIntError), +} + +// FromStr implements parsing of the position field in a FEN. +impl FromStr for Position { + type Err = PositionParseError; + + fn from_str(s: &str) -> Result { + let parts = s.split(' ').collect::>(); + + if parts.len() != 4 { + return Err(PositionParseError::TooManyFields(parts.len())); + } + + let pos = parts[0]; + let stm = parts[1]; + let hmc = parts[2]; + let fmc = parts[3]; + + let mut position = Position { + color_bbs: [BitBoard::EMPTY; Color::N], + piece_bbs: [BitBoard::EMPTY; Piece::N], + checksum: Default::default(), + side_to_move: Color::Black, + ply_count: 0, + half_move_clock: 0, + en_passant_target: None, + is_fischer_random: false, + castling_square_info: castling::Info::from_squares( + Square::E1, + File::H, + File::A, + Square::E8, + File::H, + File::A, + ), + }; + + interface::parse_piece_placement(&mut position, pos)?; + + position.side_to_move = Color::from_str(stm)?; + position.half_move_clock = hmc.parse::()?; + position.ply_count = fmc.parse::()? * 2 - 1; + if position.side_to_move == Color::Black { + position.ply_count -= 1; + } + + Ok(position) + } +} + +// Display implements displaying a Position using ASCII art. +impl fmt::Display for Position { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let board = self; + let mut string_rep = String::from(" "); + + for rank in Rank::iter().rev() { + for file in File::iter() { + let square = Square::new(file, rank); + let square_str = match board.at(square) { + Some(piece) => format!("{} ", piece), + None => ". ".to_string(), + }; + string_rep += &square_str; + } + + // Append the rank marker. + string_rep += &format!(" {} \n ", rank); + } + + // Append the file markers. + string_rep += "a b c d e f g\n"; + + writeln!(f, "{}", string_rep).unwrap(); + writeln!(f, "Side To Move: {}", self.side_to_move) + } +} diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs new file mode 100644 index 0000000..9ec80b4 --- /dev/null +++ b/games/src/chess/square.rs @@ -0,0 +1,51 @@ +// Copyright © 2024 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::fmt; + +use crate::interface::{representable_type, RepresentableType, SquareType}; + +representable_type!( + /// Square represents all the squares present on an Ataxx Board. + /// The index of each Square is equal to `rank-index * 8 + file-index`. + enum Square: u8 { + A1 "a1", B1 "b1", C1 "c1", D1 "d1", E1 "e1", F1 "f1", G1 "g1", H1 "h1", + A2 "a2", B2 "b2", C2 "c2", D2 "d2", E2 "e2", F2 "f2", G2 "g2", H2 "h2", + A3 "a3", B3 "b3", C3 "c3", D3 "d3", E3 "e3", F3 "f3", G3 "g3", H3 "h3", + A4 "a4", B4 "b4", C4 "c4", D4 "d4", E4 "e4", F4 "f4", G4 "g4", H4 "h4", + A5 "a5", B5 "b5", C5 "c5", D5 "d5", E5 "e5", F5 "f5", G5 "g5", H5 "h5", + A6 "a6", B6 "b6", C6 "c6", D6 "d6", E6 "e6", F6 "f6", G6 "g6", H6 "h6", + A7 "a7", B7 "b7", C7 "c7", D7 "d7", E7 "e7", F7 "f7", G7 "g7", H7 "h7", + A8 "a8", B8 "b8", C8 "c8", D8 "d8", E8 "e8", F8 "f8", G8 "g8", H8 "h8", + } +); + +impl SquareType for Square { + type File = File; + type Rank = Rank; +} + +representable_type!( + /// File represents a file on the Chess Board. Each vertical column of Squares + /// on an Chess Board is known as a File. There are 7 of them in total. + enum File: u8 { A "a", B "b", C "c", D "d", E "e", F "f", G "g", H "h", } +); + +representable_type!( + /// Rank represents a rank on the Chess Board. Each horizontal row of Squares + /// on an Chess Board is known as a Rank. There are 7 of them in total. + enum Rank: u8 { + First "1", Second "2", Third "3", Fourth "4", + Fifth "5", Sixth "6", Seventh "7", Eighth "8", + } +); diff --git a/games/src/chess/zobrist.rs b/games/src/chess/zobrist.rs new file mode 100644 index 0000000..d80a743 --- /dev/null +++ b/games/src/chess/zobrist.rs @@ -0,0 +1,83 @@ +// Copyright © 2023 Rak Laptudirm +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::chess::{ColoredPiece, File, Square}; +use crate::interface::{Hash, RepresentableType, SquareType}; + +use super::castling; + +#[rustfmt::skip] +const PIECE_SQUARE_KEYS: [[u64; Square::N]; ColoredPiece::N] = [ + [0x083610fb1cd7c6a5, 0xa37f944be9dfc323, 0xf6abbe2515a93cbb, 0x014d5ce796d3ea21, 0x46762749c86b2be7, 0xaf8f7e5e5ed8dab6, 0x650f5e0808e360fa, 0x92392e42419e33d7, 0x3f00957bf619fabd, 0x277059f962b2ad51, 0xd5e6b582d55f02f8, 0x6a8fc1e493122621, 0xb93875281e1a9e10, 0xfdccfe46fd5c65b6, 0x8fe7670648261096, 0xfaf02033d4a8e4be, 0x4cdbf1c399a0d591, 0x15ab0047084d6a72, 0x04c803b639b31ccf, 0xafc8b6cdc9cd9178, 0x9f6489ce28d8e4df, 0x6e0f22474ea92533, 0xc67d7cfe40573fbc, 0xc6e2de374960b2d3, 0x3dd9ff4b4cb20377, 0x2732a77574a34c97, 0x90109f006eb02f00, 0xd1d6984031b00ea1, 0x2222761e1ff24f3c, 0x3046e312f5926dd8, 0x2ee49120253af727, 0x868f3eb27661d798, 0xb5c64ce3d8887ca5, 0xe7eb41a397897ef8, 0x8be01949fc53c6e3, 0xc431f31919856a9b, 0x427fea13e941741b, 0x545ac69f3d1c6634, 0x5330e8f007f7a79c, 0xe1017ea38e3edacc, 0x3fd71ac257d29c3a, 0x211161dd93d52f71, 0x4b828af57d3a4472, 0xb757239537eb85e1, 0x70594501903e1f99, 0xb29c35ab5d55ca77, 0xfee1f0e1793f9ae3, 0x1493c090bdf0e21d, 0xff558a38b78e694e, 0xb2f1501e42d8c37f, 0x52e51685a29c6033, 0xdf11a0bcc1c921d3, 0xa4517cced14456a7, 0xe8e7e7b5f94817a8, 0xe5e60a7e4c3153a6, 0x699fc03bfc3ad0b3, 0x3c07bb3c37d3d153, 0x6251bd8731c30cb2, 0xc3dea9c62c4edca8, 0x607c06832e583a9e, 0xa2574452c4b0dd15, 0xdd1b4c11b5a1ad7d, 0x04a2634682c1aaad, 0x8c165c27b93899a1], + [0x7adfd3d554658027, 0xfd774b1530cf1356, 0xfbebe15b01385c83, 0x062d679429588cb4, 0x6752115c2c5326e8, 0x51b42635f0cdc9aa, 0xae93c5295995b5f8, 0xd7b0bcd44364a6c6, 0x3b5ff8aaa4b255a9, 0x6c7f1261a536649a, 0xe8aa5791cc441371, 0xd86b5875c7dcb86d, 0x9a46cfd78ed9b762, 0xa0e117135d96df38, 0x9478ea3e9293fb5a, 0x03a733f03155429c, 0xd693ff9c09f873e8, 0x2a3d8dad465630ca, 0x0edafa049fd439b0, 0x090729732b690837, 0x5279c76801154a6a, 0x005d1b1daadc0167, 0xe8460df1498fcf95, 0xc1f9c15076df65f5, 0x0e99df998d80d424, 0x82c9e119ed321b0a, 0xa8dba34133a2004c, 0x3bb2efc57cd90111, 0xf0ec0e4129421d3c, 0xc0782c93ad3142c5, 0xdd61e5b15ff6b122, 0x455dd5d93aed39d5, 0x43e84734883942a1, 0xf3e1b7621ac2f5f5, 0x2179dcc18a2e0bc3, 0xe53a1c459f32878b, 0xeba0a229f4d45afb, 0x7a8cfe54e35fc5e7, 0x036543ee6e22fe10, 0x95e5fffd0af43e20, 0xbbcb0800930bfb77, 0x9217dc6bb35ca3e6, 0xf2cb1ab44210a347, 0xc51cbb72992489db, 0xbef5df21c347a8e1, 0x11ab10dbdfb93abe, 0x2bc604b273b84e04, 0xb115232b2e73a311, 0x163477644bd47fb5, 0x4b254d8161f32805, 0x63ef3c964052f0f8, 0x98dff249223f96ca, 0x6b07106fd6bceddc, 0x768ff02e843aad10, 0xb577f171389c94bb, 0x366fbe11e18cee44, 0x26968ac24a683664, 0x5cf0f35aa2aa6bbf, 0xbb13cca6b6051c0a, 0xa8f18e41930fd83f, 0x2dd3abe39d4af1e3, 0xe5ef7fe684965153, 0xcf8485194d6cb250, 0xe4665a4568064f04], + [0x28dfad0a205b2e9c, 0x3465686005390915, 0x3b90f6e1f6c56840, 0xe4109f19e9fa7f95, 0x11d46f28d3dace84, 0xfe2bb5b257be494f, 0x7c2967e1b1ed0b95, 0xe43b4a381a3a37cf, 0x695059d5ffe6fbbf, 0xb2f9e81b811a7170, 0xcf46e879c65fe0ad, 0xb9f97cd8a4d78595, 0xc02a516db8ae144f, 0xad435686fb04e9ec, 0xf82bbb6f352a3960, 0xe6e42dc57d2df3e0, 0xd187aa3cdbedd5b0, 0xf4aec79145d15fae, 0xae9c3fca7088fe8f, 0xf873076c70c5e238, 0x8e94cbcfbe2f8eb5, 0xa69dbbe1e61f1481, 0x57c6ac4cd8547a67, 0xee976d8cb38ecb47, 0x82c4c4591e6a3619, 0x2c17d11bfbfd153f, 0xd023af78940fafde, 0x09cb7b8b3635c0f8, 0x9d339b95075e5f21, 0x618d55829c196453, 0x99872d72aa4b5bb1, 0x28411a439cfab02f, 0x0447c4980dd18c0b, 0x0a727dd8203971a7, 0x4d64017ea28444f8, 0x7933f58f03881b90, 0x0408e8373ef716fa, 0x7cccc649e930bbad, 0x90af3b4043e9899c, 0x4c3d73f5fb212cb9, 0xaeb57acbe523727b, 0xce31b1ba42dfa5ec, 0xbb49d484582c2b00, 0x605e3e628c10baf6, 0x375b37391ac9f3e3, 0xcd9c35bf28764550, 0xf7fa103085c18847, 0x7515338408400c09, 0x68db9f000c9ae26d, 0x7ee7c64e4a40bac1, 0x5e4bfb864335d91b, 0x54460f903f65383c, 0x97d82484d05f13ba, 0xc2e48b075cc5ee40, 0x740dffe55366710c, 0xf625ead458cb5363, 0x25edad6808412086, 0x3c5f9a8f6b509e77, 0x0f45f0963da28643, 0xf1e7394e16dbad3d, 0x67aaffa8538ae041, 0xb9c83a569c2b2064, 0x623d092e66653e08, 0xaadd09b034e21dfe], + [0x351b3cb6fa0afb17, 0xf3fa5057957e9f1f, 0x3caf5f931167c3a4, 0x0049d1915fd8ec1f, 0x8415b4cdb479775d, 0xe8c4292086c4105c, 0xa8bce7aee1239b7d, 0xfe39b02a48d2a9e0, 0xc739fe5dcd4457d3, 0x1403db8fb3519890, 0xe8b28db23ff09313, 0xbb5d403967d07997, 0xac490676033eff75, 0x16a04fa30d1bf9d3, 0x997217e09587296c, 0xf3117e27351004e4, 0x5d7f1450e6c84a24, 0x2bcdae26c841d5b9, 0x664feffb28482b8c, 0x493ecf1831366263, 0xe59b7e560c61528a, 0xc845abe4a1cba795, 0x002648c6bf4c69a8, 0xd3700303c87b0929, 0xb12fb9bb17affa29, 0x126230fb4c36768a, 0x2ff7d2f543443003, 0x7f9ea0aa559d889c, 0x937c4397b0a311d9, 0x624e3386c8bd3630, 0xcc7b2837959caa4a, 0x7a9895b2c073f315, 0x29269f35e4ff07c1, 0xb1724d353a0949d0, 0x5854240d00156398, 0xaac30e66022f4cd2, 0x3d573340cdc49599, 0xb61a17cc1d88375e, 0x2dbbb30344a74700, 0xe5961efe2fa46058, 0xbda64ec9369c19b5, 0x31c2ac9cf0309bc9, 0xccd07315b51b25dc, 0x4b8da2176d7ddf91, 0x564a16a24ca73266, 0x69b573ecad4ff466, 0x1e33e2e504f2aac3, 0x13ec566100843602, 0xf85ff42af43ab8e3, 0xf1e5f9f5acaec2ff, 0xc0268b39c159fe69, 0x2fa2016c847c3298, 0x23245f3213a20bf0, 0xa194b3e61730337e, 0xbcd2d5538f951936, 0x8af394651b992396, 0x4d8b850410bc371e, 0xfc6d20ee872a1778, 0x4e3bc79cace5ce19, 0x419dd7b26ff5cf91, 0xb86542be5df66369, 0x759ff91e508a169a, 0x2699351e889f4ea2, 0x9271485845fae691], + [0xc3e6cbc2d58d54e2, 0x0c9d65764e662a03, 0x35398cf17f55e546, 0x36298d8994ef782f, 0x74a1686641906112, 0x932e26c31e2a841c, 0x742e57797e804b64, 0x8cd96f04c93bcd46, 0x8eaa7a1fb167256e, 0xb2b979d48293ced2, 0x148afc7b1ad4a2e2, 0xd6011dba4f25674b, 0xde9b1153c122b489, 0x971f14a615bea388, 0x634b1f6b0b3afb58, 0xd4aabc1364bb0003, 0x7e9b907828fde17f, 0xfc46a281078eb9fb, 0xc16d1a9dd6133f13, 0x5629856b3076ce38, 0xf712384f29bc651d, 0x715c38e6c60edae5, 0x41e21c89f20dec3d, 0x7016e3fabc4678d5, 0x01e0e17095413176, 0xbe802cac9b27004a, 0xe494c0ee82c3c208, 0x36beeaaf24f54f9d, 0x5566d05a46fb6521, 0xf36e57a275276137, 0x0b86532e3399794b, 0x4f36092bbcd8cf44, 0xe8657cf6ea841919, 0xc042d797999a1028, 0x955ed6e192c63428, 0x07567e07cd7066ad, 0x1096cbac96dc14dd, 0xdf0e1ae46713d10e, 0x829db5d6ee0fb300, 0xc5c539dfefb9bd54, 0x2f0fa6f16182da44, 0x9c97fbba009e51b8, 0x1735053fa6caab1a, 0x1d904c80cc2a0dcf, 0xfe2053329db48023, 0x0d866ad29a19b204, 0x463cb247f64d3b66, 0x2b64d2b61f3fb47a, 0x0808900fd4708fff, 0x3469cfbdd1bf9ee7, 0xc5418c0abbe1a5d6, 0x4de827479c338e12, 0x543c0d8641fc84b4, 0x7b6c8fb0111ebd02, 0xd3a2bb2a34ce1d44, 0xfb15c47f676ab7d7, 0x9e1f46ce9296ba13, 0x70aed462117ba0a4, 0xbf0b1eb5c6478634, 0x627c1d570c1527f5, 0x6783c93750818a46, 0x51d88b5799738381, 0x39c3ea29e83c603a, 0x231482df2f8d560d], + [0xeff5eeb2a2b20b32, 0x48bb703400db90c5, 0xadee028408e7e3e8, 0x659a2e1b59c31f32, 0xee8881a63b2d62b5, 0xbd6d5581989bdd88, 0x6d531bdd223994f9, 0x776495a7d3403463, 0x33c8a19c4c5cc49e, 0xc69cfcedfe47ca25, 0xe8071dfa94c0413f, 0xd91e6c71a4a8a576, 0xd484d7e096b2d4d7, 0x07bff7a4a384d89b, 0x8c45618188fa0eee, 0x030326012537c059, 0xa0c2212939bde392, 0xb1d1dee94ec0650a, 0xb1a7eef0f841580f, 0x8da02c798c8e77b4, 0xa6aa60c55d25910d, 0xa2869d0f3c7c8636, 0x0858fb0b1be4b947, 0x215c03e88f12ab8d, 0x2c345d1776316fe2, 0xe25dadf27182eb8d, 0x1dce4c56d00834cf, 0xa38b7f785b4551ef, 0x9db3fb522619706e, 0x3de4776d073c1249, 0xef3cb77613dbb07a, 0xe57165c9708e6e5b, 0xae96b0e1485d60fa, 0x7cee5fe03af00323, 0x640e188aa7b52e44, 0xd315dad8edd4e988, 0x52ad94329655d1e2, 0xdf206e5499f2fd9f, 0x676a97d8dd036dc3, 0xc5abf94469845903, 0xb0c617d45824f4c1, 0x12c3420396ac6cf8, 0x3d0017d165733446, 0xcb20cf04679762d0, 0x939f82a3dfb029d7, 0x415ced5a648dc4d2, 0xcc0da63afddae269, 0x147d1ca927afe895, 0x39178fa5df6427a1, 0x6ff05d98ce3e0973, 0x6c6122ba5673a0ea, 0x43b79aa160e2b9f2, 0x83cff8354424a170, 0xf3afe5a144fdb94f, 0xa33ff2d730d0962f, 0x8b8aa9b1aa280114, 0xb241aa1f7b293b26, 0x0497eb0e482c1777, 0x761516f375dc62ef, 0x9ac971b4bc1da3af, 0x8e14e1927ff59bb5, 0x189bf5a0bb82a62f, 0x73327c05cb3009a3, 0x9655c388016c3fe2], + [0xa38152e5792c41dd, 0x262270c3737300b1, 0x33b1082ff0c8e331, 0x8eea7c34adae9a6d, 0x95230505c46b9a3d, 0xde8f0350047fb7a6, 0xf41592ec09662620, 0x5f7daa8e72708b86, 0x07c6fe7d5a169624, 0x5bf5ae615cd3bf25, 0x250eee0284fd0950, 0x3b673e349479cbee, 0x145f4ed31313bfc4, 0x69c026f532c3d433, 0xb946085d9a96daf2, 0x8cb2f1089fe5c7bd, 0x5e2c8d1ab19db4bf, 0x379b61b49d3525e0, 0xf344242925559c19, 0x1f558fc5ea7eb9be, 0xe2e8f392da038fe8, 0xb188b13b69086ca9, 0xd659336635ed6e74, 0x352a293989b52bdd, 0xf25988bb0b15c76e, 0xd032c19a0604d849, 0xf55dce120e5b70da, 0x0508c99da18984fd, 0x245ea813e90f9f7f, 0x96f24024ea008b2c, 0xcc115c56313a9d69, 0x74294f3b06a8833d, 0xea90ac815b457e75, 0x41649127eb1c4ce9, 0x20689236e3a8871e, 0xd678cfd8f1332076, 0x53d0414c27c5be8e, 0x49fb49539f3f4011, 0x5efb7f5936d930cc, 0xd06ce79c4ee00ca3, 0x517607ed03a758c9, 0x857f0d52e12edfa0, 0x620c0fbb2d6efc58, 0xc3780c4225407b19, 0xf62c4f10f9ecd54e, 0xfd9b6353aa8e64ca, 0xde268ff6dc85969c, 0x3c0bdb4f34b27e27, 0xa24a1ef85b4edaa9, 0xdb1f35914fc30fe9, 0x785a1b1a28468f79, 0x54cac7eb27f16f29, 0x5699b8193713e404, 0xf4f41920939d2f09, 0xbd3c0939d538f5bf, 0xee67fb624d3f279a, 0x0993bafa486dbfd0, 0x0bbfb4f7f6017912, 0x9eba8ece3a5e0aed, 0x0e93cfff50edec0a, 0x91844c5094791de6, 0xb240871946900373, 0x5a15f04e16e336f3, 0xae8506b7e0178da8], + [0xcf1c140354d90d8d, 0xff011f11a27e1db5, 0x2f81119b6645bef5, 0xd3a5f1bcc336ef9a, 0xd09c41011c888ab4, 0xd6342e300e40c410, 0x577eb38e32439a91, 0xb16ffd8e6ede433f, 0x88201e51dbca9b91, 0x87c7b999dc878b73, 0xfbb96e76d739caf2, 0xffc91f5554e883f7, 0xfbdb1bb1163963e1, 0xb033e55a5bff12e9, 0x19bdbbe311bbfe5a, 0xb28c6c7c5f400188, 0xd8fecbcf3e92ee98, 0xf11abdf07f1033e4, 0x22a2fc6307fcdeb9, 0x9c180ffc0e3fb854, 0xedbca52dad4d07ed, 0x9e868776493703df, 0x1622a29ac26dc40e, 0x361f1333383764fe, 0xd6b1f3a9caa1ed2e, 0x23b335f0cb796d16, 0xc64a4d902a8f0661, 0x37fdfae72d1b30bc, 0x323ae9bd68fe607b, 0xae5e7beceb4953ff, 0x5b179e4261ab93af, 0x220eeb559046a5d2, 0x01b4229f83c1a79c, 0x39264dd39d1eea01, 0xbfdd7bfdb2a9e9ea, 0x3426f3b421450242, 0x2e77bc017c10cfa8, 0x99d60f361847d387, 0x42806cbdbbc55504, 0xe85708e048659f06, 0xbc132fd0e2e0976a, 0xfa686efea79c6da5, 0xfd058cb748ea808e, 0xee2d992c2f806e6f, 0xf9569c53380f7d24, 0x3943d426426ea766, 0x6ac6af3dd5df17f2, 0x6cde51169d69e52c, 0xd28b5d4c62d479ca, 0x4404dc78f30923eb, 0xa04c03f4a0f58b3a, 0x773c0f09934e0620, 0x5bcaa56f3bfe4271, 0xd950fbb6b80b7ce6, 0x73ab5233e3c02dbe, 0xc67fb2836190b3e3, 0xfc60852ab1bdeb2f, 0x8aee110872e49998, 0x555ed5746bbe8727, 0xdd6f1888daed759c, 0xcc5c915267ab26ba, 0x7de30f97853b00ac, 0x3b3cf0b03e3654d8, 0x348fec5cc59b0497], + [0x3011c4d28635dbdf, 0x13b174f3eefdc297, 0x41c1aa861dc79560, 0x96fff72f157413d6, 0x546e8e8ec8773076, 0xd5b58b684d1a5399, 0x8bdb03e3e6d29838, 0x421c53655bbc1521, 0x1c920a8701f626cf, 0xe172bfb282e929b1, 0xae27d629badb1b6d, 0x4738ec83a85f112a, 0xb7566e63c52f73ff, 0x6fb5e187fbd0757e, 0xc52fc3ed8ff08176, 0xd03bb85163751086, 0x258aaa40c155846d, 0x5bb09b8ea743858a, 0x7d707997049f506a, 0x88e5c579e8b8ec8f, 0x7170a24e2c0c8a00, 0xdee1d4843e7d7907, 0x4c1e766b2ee31c35, 0xacdf4cca41fd08af, 0x7bc78d0083b84854, 0xd71eff4935d3c228, 0x2d01451ad4d06582, 0x523d9682a4d37017, 0x58e39191f3cb587a, 0x026515714520fc53, 0xeffaa5630885430d, 0xbadaba2091156ac1, 0x33277e8b0439291e, 0x7aea720c476f6645, 0xd605947274c6cd23, 0x34f4d8e26e91bb5e, 0x2fa33797aee09da6, 0x0b5b426be0430939, 0x3880f1f85a0f6ab4, 0xb882fc47309805fa, 0x21aceae54062f31f, 0x8bd6386fc481372e, 0x79e7b84b6f039893, 0x299820e9679f0906, 0xdadbb60cb96722d4, 0xb4a69d5a5125f3ad, 0x3c1a02477403c485, 0x97bf24886211b282, 0x8fb9f64dd9c7e655, 0x1d1e7319dce7412f, 0xcd3eacf88a4ce2c4, 0x9c251f9570f4a41e, 0x6440d17499eba25d, 0xd0b507d56ae36045, 0xb766d402e56f0d8d, 0x144b20dca1156997, 0x4fed16b58e4b6e2b, 0x4ff60ff14a592e41, 0x1b049bdea4d05426, 0x79d6502120c6c8e1, 0x8a810ff080a3e083, 0x7d26ed2c1eb6ebc5, 0x8d371c46110d0b72, 0xf53957ac0caab20c], + [0x1c6a15e74c484818, 0x394ecc7315c776b3, 0x8b338c025467af83, 0x755df72e74e28c2c, 0x096102c2f4721596, 0xda324813d5f5165c, 0x13a72cf0f2f0c8c4, 0xfe8772410008712a, 0x3b640efbb53b4127, 0x69779f11fc633452, 0x75de90b625fda51d, 0x4b9c82ee1e1cb305, 0x6eace48f276be344, 0x32d00fceb789ec71, 0xf1faa8b8a4addd4a, 0x6b2dd36fbf2e5ec4, 0xad2bb7a46b82cab4, 0x49012620972ce6ce, 0x32dc03c3cf95b8b8, 0xa9f463724298da92, 0x9e80e8729b9e098e, 0x94a5f1293de1972c, 0x0577e33a55f297eb, 0x16f3b7b1b2c800d4, 0x934d62300037b090, 0x30ba5035eaa9f1d3, 0xcdca15d562592c40, 0xb0aae4af24edd99d, 0x7eb866dc206dfa52, 0x91602ec574b77474, 0xa98abd14dde57859, 0xaef082e17aae0e3d, 0x00c39cb0f82e24a1, 0x4ea8d7b26183d512, 0x49d058a520fcfcfc, 0x50a8f5a501b860ff, 0xac97a5b426ab824a, 0x9efc8ac042139f45, 0xf0d84b3d42b5cb99, 0xb1e8c0adab3d57d7, 0x1c7a0fba85a8aaeb, 0x87565f24bdc3ee7a, 0x77552ed09b8b4101, 0x95ee84237775535c, 0xf148623c65791a53, 0x306f04eadff39f55, 0xcfb27c101bfc3dae, 0x25b1bc975e125ba6, 0xbe2e97660e85f62b, 0x55350c3c99bb7a26, 0xa72aba5099663783, 0x5198c5e6a82368d3, 0xfe68bbdf927faa6e, 0x7338bf90c9ed7039, 0x2e5078e9d6b3b8e5, 0x40684cd6b9c6cac0, 0xf3979178e731c738, 0xd392f50ab651e966, 0x0c7916677a67f9aa, 0xbac5b81b53946b68, 0xf47d692e0a0ae20e, 0xaf98a3b93ac483fd, 0x36c3343929a28281, 0x01177bbc613bdfd7], + [0x68085e26dbe3ad56, 0x9a9d46582a40120b, 0x8aa6abbd2cad7d96, 0x5527a24035773ed8, 0xc79805af15fa519c, 0xa9a03e8fb9f60885, 0x82f999d825db04e0, 0x49db5f367e106034, 0x83fbfc6a4aa8f161, 0xc1daedbaa5d01451, 0x7d938e607492dfe8, 0x622135de5b37f9c1, 0x6946d729ce3a1019, 0xb19a3dfdd10d34a8, 0xbff22fd4f4268351, 0xc329a8b2c951b7ff, 0x63da62e7e591dcec, 0xbf007b12ec4307ac, 0x792444890a0570c6, 0x72318d01e4ccf0a4, 0x50e0d2417bdb719b, 0x1565a2897030890e, 0xf9d5d18956242293, 0x64104ef221973e5a, 0x5dd2fda8c41eb447, 0x175ed04f5cba8520, 0x4b41274dc059c1de, 0x52c6a011722f7525, 0xdeb942504bc8e782, 0xb458d3594d6cae08, 0x1eac4cb3fa22358e, 0xb8b970f1500a1119, 0x3c74e78cc4a6420f, 0x978ef947dd452dce, 0x3e2e951e6b2f0efe, 0xa56f9e5d36f3a00b, 0xf77371e0e30687d4, 0xf530ae19bf5498e5, 0x772163240b406f47, 0x8bf14ec5102856f2, 0xd29afaf89fbc4012, 0x2f37b6297c95b3f0, 0xf99323223fa8d818, 0xbd33ffd00a14c9aa, 0xfc8af274e35822fe, 0x635a69eaa68adee7, 0x57d645d580e935f0, 0x3fc98238def97d41, 0x1ac557171e66091b, 0x28d6dd4d2a8e542c, 0xf47a8200e4b78fa8, 0xcb27461f07dcaeda, 0x0344565cd7c80558, 0xd6f32dd8e7a4c265, 0xc963e291da80d2ff, 0x441d93cafd5df3df, 0x6f0df8634290aa45, 0x0556b564010e6b21, 0x3d3e34e8eff6e213, 0xdf37a92c959fc1b8, 0x6c7c380625981e73, 0x9fe365590db2e003, 0x9391b03d2f536994, 0x6188e8d1db75331d], + [0xabab879cd5585f2f, 0xfdb8a69bc4052dd5, 0xa097af8b98ae5653, 0xa7262be7fa75d97b, 0xda8f8ae4c5526fba, 0xac8d445dc93990b3, 0x311e44664ea37966, 0x72358b3b76d6e28b, 0xfd84b139d74da2ad, 0xfbad215ccd898848, 0x8c7a00a136a05ffd, 0x7709e685c945ee73, 0xeb32efd0627aecc1, 0x3e6f41983f953cd8, 0x46ebf3bd647cc189, 0x21e91003e0e722b7, 0x5ff78aee36f5e7df, 0x7f0b0b2514024f0f, 0x31a7b80fad47192f, 0xd48ca8c3be089ea4, 0x6220c3ea0477a100, 0xcda3d82077f85837, 0x29a7477b3274955b, 0xb46b8fa6c96a547c, 0xc76e82f848d82a29, 0x9912a9640c62023d, 0xc59e8a1a77cabde7, 0x82ac3fd8bb87ecff, 0x5c7fb3bfff378cbb, 0xb0a9a087ea30e56f, 0x01c4f4855092269f, 0x53e0dc61631cfd20, 0xb482604ea6d2a918, 0xc0be737023dcdef6, 0xbbdb426b8e95919e, 0xe4e54404356b9992, 0x1d8fd20388787282, 0x4a85dc29bf8e1109, 0x450eb0cb187bcafb, 0xf51e953f2053516a, 0x8d7a82dfecd6f2f0, 0x82ee9c1328eaf825, 0x80b8a490de34e58c, 0xc199c2cf6fa3c4a0, 0x404f57fd165644eb, 0xf335001fc9324ab4, 0xb1109adca3c18129, 0x2b65dc52c43442c5, 0x36f814c72a173952, 0xce5c402e9cf3bc46, 0x043c3cba93773393, 0x397305568e833188, 0x03c8b53be7ebb8f4, 0xd8c9ea4dbbe0caba, 0xe4c12637188a7f2f, 0xb3c39c29782b86c8, 0x9430009ef3092669, 0xfa7d3f1cc2dae40e, 0x6ead2df26cbef22b, 0x92060073bd794085, 0xaef2c95bd9ad5886, 0xc13f07c270b5cace, 0x5b21dd821267ea79, 0x2fe9a4d5aa8d43f6], +]; + +const EN_PASSANT_KEYS: [u64; File::N] = [ + 0x14c6099d731723b7, + 0x1cec25e490795dfb, + 0xa2c8015acdd7305f, + 0xc65d7c2700f3aade, + 0xe0fe6bcd9c147fb1, + 0x593b8aea38433907, + 0x2fe646b777886e9f, + 0xc045c1dde772ac79, +]; + +#[inline(always)] +pub fn piece_square_key(piece: ColoredPiece, square: Square) -> Hash { + Hash::new(PIECE_SQUARE_KEYS[piece as usize][square as usize]) +} + +#[inline(always)] +pub fn en_passant_key(ep_square: Square) -> Hash { + Hash::new(EN_PASSANT_KEYS[ep_square.file() as usize]) +} + +#[inline(always)] +pub fn castling_rights_key(rights: castling::Rights) -> Hash { + Hash::new(CASTLING_RIGHTS_KEYS[rights.0 as usize]) +} + +const CASTLE_WH: u64 = 0x4d28598573750b10; +const CASTLE_WA: u64 = 0xdfe34de8892603ad; +const CASTLE_BH: u64 = 0x177ab8314c2b200e; +const CASTLE_BA: u64 = 0xc07e0a697776ea93; + +const CASTLING_RIGHTS_KEYS: [u64; castling::Rights::N] = [ + 0, + CASTLE_WH, + CASTLE_WA, + CASTLE_WA ^ CASTLE_WH, + CASTLE_BH, + CASTLE_BH ^ CASTLE_WH, + CASTLE_BH ^ CASTLE_WA, + CASTLE_BH ^ CASTLE_WA ^ CASTLE_WH, + CASTLE_BA, + CASTLE_BA ^ CASTLE_WH, + CASTLE_BA ^ CASTLE_WA, + CASTLE_BA ^ CASTLE_WA ^ CASTLE_WH, + CASTLE_BA ^ CASTLE_BH, + CASTLE_BA ^ CASTLE_BH ^ CASTLE_WH, + CASTLE_BA ^ CASTLE_BH ^ CASTLE_WA, + CASTLE_BA ^ CASTLE_BH ^ CASTLE_WA ^ CASTLE_WH, +]; diff --git a/games/src/interface/hash.rs b/games/src/interface/hash.rs index 172cf82..b11105d 100644 --- a/games/src/interface/hash.rs +++ b/games/src/interface/hash.rs @@ -11,13 +11,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +use derive_more::{BitXor, BitXorAssign}; use std::{fmt, ops}; /// Hash represents the semi-unique checksum of a Position used to efficiently /// check for Position equality. Some properties that a Hash should possess /// include determinism, uniform distribution, avalanche effect, and collision /// resistance. -#[derive(Clone, Copy, Default, PartialEq, Eq)] +#[derive(Clone, Copy, Default, PartialEq, Eq, BitXor, BitXorAssign)] pub struct Hash(u64); impl Hash { diff --git a/games/src/interface/mod.rs b/games/src/interface/mod.rs index 67ed34e..463de2b 100644 --- a/games/src/interface/mod.rs +++ b/games/src/interface/mod.rs @@ -107,7 +107,7 @@ macro_rules! representable_type { } } - impl FromStr for $type { + impl std::str::FromStr for $type { type Err = $crate::interface::TypeParseError; fn from_str(s: &str) -> Result { @@ -200,12 +200,12 @@ macro_rules! bitboard_type { let lsb = if self.is_empty() { None } else { - let sq = ::Base>>::into( + let sq = ::Base>>::into( *self, ) .trailing_zeros() as usize; Some(unsafe { - ::Square::unsafe_from(sq) + ::Square::unsafe_from(sq) }) }; diff --git a/games/src/lib.rs b/games/src/lib.rs index d063b3f..57518c9 100644 --- a/games/src/lib.rs +++ b/games/src/lib.rs @@ -1,4 +1,6 @@ pub mod ataxx; +pub mod chess; + pub mod interface; use interface::PositionType; From 852935f99f5a5f95cf3a582fc6597c9097cfb0a4 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Thu, 12 Sep 2024 18:10:05 +0530 Subject: [PATCH 02/27] chore: better chess move encoding --- games/src/chess/move.rs | 44 ++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/games/src/chess/move.rs b/games/src/chess/move.rs index aed1c35..084713f 100644 --- a/games/src/chess/move.rs +++ b/games/src/chess/move.rs @@ -18,6 +18,8 @@ use crate::{ interface::{representable_type, MoveType, RepresentableType}, }; +use super::ColoredPiece; + #[derive(Copy, Clone, PartialEq, Default)] pub struct Move(u16); @@ -50,22 +52,18 @@ impl Move { // Bit-widths of fields. const SOURCE_WIDTH: u16 = 6; const TARGET_WIDTH: u16 = 6; - const PROMOT_WIDTH: u16 = 2; - const MVFLAG_WIDTH: u16 = 2; + const MVFLAG_WIDTH: u16 = 4; // Bit-masks of fields. const SOURCE_MASK: u16 = (1 << Move::SOURCE_WIDTH) - 1; const TARGET_MASK: u16 = (1 << Move::TARGET_WIDTH) - 1; - const PROMOT_MASK: u16 = (1 << Move::PROMOT_WIDTH) - 1; const MVFLAG_MASK: u16 = (1 << Move::MVFLAG_WIDTH) - 1; // Bit-offsets of fields. const SOURCE_OFFSET: u16 = 0; const TARGET_OFFSET: u16 = Move::SOURCE_OFFSET + Move::SOURCE_WIDTH; - const PROMOT_OFFSET: u16 = Move::TARGET_OFFSET + Move::TARGET_WIDTH; - const MVFLAG_OFFSET: u16 = Move::PROMOT_OFFSET + Move::PROMOT_WIDTH; + const MVFLAG_OFFSET: u16 = Move::TARGET_OFFSET + Move::TARGET_WIDTH; - #[inline(always)] pub fn new( source: chess::Square, target: chess::Square, @@ -78,21 +76,18 @@ impl Move { ) } - #[inline(always)] pub fn new_with_promotion( source: chess::Square, target: chess::Square, promotion: chess::Piece, ) -> Move { Move( - (promotion as u16 - 1) << Move::PROMOT_OFFSET - | (MoveFlag::Promotion as u16) << Move::MVFLAG_OFFSET + (promotion as u16) << Move::MVFLAG_OFFSET | (source as u16) << Move::SOURCE_OFFSET | (target as u16) << Move::TARGET_OFFSET, ) } - #[inline(always)] pub fn source(self) -> chess::Square { unsafe { chess::Square::unsafe_from( @@ -101,7 +96,6 @@ impl Move { } } - #[inline(always)] pub fn target(self) -> chess::Square { unsafe { chess::Square::unsafe_from( @@ -110,19 +104,7 @@ impl Move { } } - #[inline(always)] - pub fn promot(self) -> chess::Piece { - // +1 to account for the fact that move encodes - // Piece::Knight as 0, while actually it is 1. - unsafe { - chess::Piece::unsafe_from( - ((self.0 >> Move::PROMOT_OFFSET) & Move::PROMOT_MASK) + 1, - ) - } - } - - #[inline(always)] - pub fn flags(self) -> MoveFlag { + pub fn flag(self) -> MoveFlag { unsafe { MoveFlag::unsafe_from( ((self.0 >> Move::MVFLAG_OFFSET) & Move::MVFLAG_MASK) as u8, @@ -133,7 +115,19 @@ impl Move { representable_type! { enum MoveFlag: u8 { - Normal "n", Castle "c", Promotion "p", EnPassant "e", + Normal "N", + NPromotion "n", BPromotion "b", RPromotion "r", QPromotion "q", + EnPassant "e", DoublePush "d", + CastleHSide "h", CastleASide "a", + } +} + +impl MoveFlag { + /// # Safety + /// This function can only be called safely if `self` is one of `NPromotion`, + /// `BPromotion`, `RPromotion`, and `QPromotion`. + pub unsafe fn promoted_piece(&self) -> ColoredPiece { + ColoredPiece::unsafe_from(*self as usize) } } From cd38ce3032e80d2e3a57ff51e9a56955e2d6fd14 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 13 Sep 2024 18:22:01 +0530 Subject: [PATCH 03/27] chore: some fixes --- games/src/chess/bitboard.rs | 44 +++++++++++++++++++++++++++++++++++++ games/src/chess/moves.rs | 34 ++++++++++++++-------------- games/src/chess/square.rs | 10 +++++++++ 3 files changed, 71 insertions(+), 17 deletions(-) diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index cbc95bb..9d4b46d 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -39,6 +39,50 @@ impl BitBoard { } impl BitBoard { + pub fn diagonal(diagonal: usize) -> BitBoard { + BitBoard(BitBoard::DIAGONAL[diagonal]) + } + + pub fn anti_diagonal(anti_diagonal: usize) -> BitBoard { + BitBoard(BitBoard::ANTI_DIAGONAL[anti_diagonal]) + } + + const DIAGONAL: [u64; 15] = [ + 0x8000000000000000, + 0x4080000000000000, + 0x2040800000000000, + 0x1020408000000000, + 0x0810204080000000, + 0x0408102040800000, + 0x0204081020408000, + 0x0102040810204080, + 0x0001020408102040, + 0x0000010204081020, + 0x0000000102040810, + 0x0000000001020408, + 0x0000000000010204, + 0x0000000000000102, + 0x0000000000000001, + ]; + + const ANTI_DIAGONAL: [u64; 15] = [ + 0x0100000000000000, + 0x0201000000000000, + 0x0402010000000000, + 0x0804020100000000, + 0x1008040201000000, + 0x2010080402010000, + 0x4020100804020100, + 0x8040201008040201, + 0x0080402010080402, + 0x0000804020100804, + 0x0000008040201008, + 0x0000000080402010, + 0x0000000000804020, + 0x0000000000008040, + 0x0000000000000080, + ]; + pub fn between(sq_1: Square, sq_2: Square) -> BitBoard { BitBoard(BitBoard::BETWEEN[sq_1 as usize][sq_2 as usize]) } diff --git a/games/src/chess/moves.rs b/games/src/chess/moves.rs index e6449ea..415c704 100644 --- a/games/src/chess/moves.rs +++ b/games/src/chess/moves.rs @@ -13,7 +13,7 @@ use crate::chess::{BitBoard, Color, Square}; -use crate::interface::RepresentableType; +use crate::interface::{BitBoardType, RepresentableType, SquareType}; pub fn pawn_attacks(square: Square, color: Color) -> BitBoard { BitBoard::new(PAWN_ATTACKS_TABLE[color as usize][square as usize]) @@ -23,24 +23,24 @@ pub fn knight(square: Square) -> BitBoard { BitBoard::new(KNIGHT_MOVES_TABLE[square as usize]) } -// #[rustfmt::skip] -// #[inline(always)] -// pub fn bishop(square: Square, blockers: BitBoard) -> BitBoard { -// hyperbola(square, blockers, BitBoard::diagonal(square.diagonal())) | -// hyperbola(square, blockers, BitBoard::anti_diagonal(square.anti_diagonal())) -// } +#[rustfmt::skip] +#[inline(always)] +pub fn bishop(square: Square, blockers: BitBoard) -> BitBoard { + hyperbola(square, blockers, BitBoard::diagonal(square.diagonal())) | + hyperbola(square, blockers, BitBoard::anti_diagonal(square.anti_diagonal())) +} -// #[rustfmt::skip] -// #[inline(always)] -// pub fn rook(square: Square, blockers: BitBoard) -> BitBoard { -// hyperbola(square, blockers, BitBoard::file(square.file())) | -// hyperbola(square, blockers, BitBoard::rank(square.rank())) -// } +#[rustfmt::skip] +#[inline(always)] +pub fn rook(square: Square, blockers: BitBoard) -> BitBoard { + hyperbola(square, blockers, BitBoard::file(square.file())) | + hyperbola(square, blockers, BitBoard::rank(square.rank())) +} -// #[inline(always)] -// pub fn queen(square: Square, blockers: BitBoard) -> BitBoard { -// bishop(square, blockers) | rook(square, blockers) -// } +#[inline(always)] +pub fn queen(square: Square, blockers: BitBoard) -> BitBoard { + bishop(square, blockers) | rook(square, blockers) +} pub fn king(square: Square) -> BitBoard { BitBoard::new(KING_MOVES_TABLE[square as usize]) diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index 9ec80b4..8dfa50f 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -35,6 +35,16 @@ impl SquareType for Square { type Rank = Rank; } +impl Square { + pub fn diagonal(self) -> usize { + 14 - self.rank() as usize - self.file() as usize + } + + pub fn anti_diagonal(self) -> usize { + 7 - self.rank() as usize + self.file() as usize + } +} + representable_type!( /// File represents a file on the Chess Board. Each vertical column of Squares /// on an Chess Board is known as a File. There are 7 of them in total. From c08c120f5d27806de6315b8f22e8c4d77be4998e Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 13 Sep 2024 19:31:34 +0530 Subject: [PATCH 04/27] chore: hopefully working after_move --- games/src/chess/castling.rs | 6 ++++ games/src/chess/move.rs | 16 +++++++++-- games/src/chess/position.rs | 55 +++++++++++++++++++++++++++++++++++-- games/src/chess/square.rs | 16 +++++++++++ 4 files changed, 88 insertions(+), 5 deletions(-) diff --git a/games/src/chess/castling.rs b/games/src/chess/castling.rs index 5652040..aecd9c6 100644 --- a/games/src/chess/castling.rs +++ b/games/src/chess/castling.rs @@ -59,6 +59,12 @@ impl ops::Sub for Rights { } } +impl ops::SubAssign for Rights { + fn sub_assign(&mut self, rhs: Self) { + self.0 &= !rhs.0 + } +} + impl ops::Add for Rights { type Output = Rights; diff --git a/games/src/chess/move.rs b/games/src/chess/move.rs index 084713f..c1bfd89 100644 --- a/games/src/chess/move.rs +++ b/games/src/chess/move.rs @@ -18,7 +18,7 @@ use crate::{ interface::{representable_type, MoveType, RepresentableType}, }; -use super::ColoredPiece; +use super::Piece; #[derive(Copy, Clone, PartialEq, Default)] pub struct Move(u16); @@ -126,8 +126,18 @@ impl MoveFlag { /// # Safety /// This function can only be called safely if `self` is one of `NPromotion`, /// `BPromotion`, `RPromotion`, and `QPromotion`. - pub unsafe fn promoted_piece(&self) -> ColoredPiece { - ColoredPiece::unsafe_from(*self as usize) + pub unsafe fn promoted_piece(&self) -> Piece { + Piece::unsafe_from(*self as usize) + } + + pub fn is_promotion(&self) -> bool { + matches!( + self, + MoveFlag::NPromotion + | MoveFlag::BPromotion + | MoveFlag::RPromotion + | MoveFlag::QPromotion + ) } } diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index 2cfb5a3..d3e302e 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -33,6 +33,8 @@ use crate::chess::{ }; use crate::interface::MoveStore; +use super::MoveFlag; + /// Position represents the snapshot of an Ataxx Board, the state of the an /// ataxx game at a single point in time. It also provides all of the methods /// necessary to manipulate such a snapshot. @@ -108,8 +110,57 @@ impl PositionType for Position { None } - fn after_move(&self, _m: Move) -> Position { - self.clone() + fn after_move(&self, m: Move) -> Position { + let mut board = self.clone(); + + let source_pc = board.remove(m.source()); + let target_pc = board.remove(m.target()); + + let source_pc = unsafe { source_pc.unwrap_unchecked() }; + + if !m.flag().is_promotion() { + board.insert(m.target(), source_pc); + } + + board.castling_square_info.rights -= + board.castling_square_info.get_updates(m.source()) + + board.castling_square_info.get_updates(m.target()); + + if source_pc.piece() == Piece::Pawn || target_pc.is_some() { + board.half_move_clock = 0; + } + + match m.flag() { + MoveFlag::Normal => {} + MoveFlag::NPromotion + | MoveFlag::BPromotion + | MoveFlag::RPromotion + | MoveFlag::QPromotion => board.insert( + m.target(), + ColoredPiece::new( + unsafe { m.flag().promoted_piece() }, + board.side_to_move, + ), + ), + MoveFlag::EnPassant => { + board.remove(unsafe { + m.target().down(board.side_to_move).unwrap_unchecked() + }); + } + MoveFlag::DoublePush => { + board.en_passant_target = Some(unsafe { + m.target().down(board.side_to_move).unwrap_unchecked() + }) + } + MoveFlag::CastleASide => {} + MoveFlag::CastleHSide => {} + } + + board.half_move_clock += 1; + board.side_to_move = !board.side_to_move; + board.en_passant_target = None; + + board } fn generate_moves_into< diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index 8dfa50f..d7ce76c 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -15,6 +15,8 @@ use std::fmt; use crate::interface::{representable_type, RepresentableType, SquareType}; +use super::Color; + representable_type!( /// Square represents all the squares present on an Ataxx Board. /// The index of each Square is equal to `rank-index * 8 + file-index`. @@ -36,6 +38,20 @@ impl SquareType for Square { } impl Square { + pub fn up(self, stm: Color) -> Option { + match stm { + Color::White => self.north(), + Color::Black => self.south(), + } + } + + pub fn down(self, stm: Color) -> Option { + match stm { + Color::White => self.south(), + Color::Black => self.north(), + } + } + pub fn diagonal(self) -> usize { 14 - self.rank() as usize - self.file() as usize } From 6af74c7fbe3abc8d514ccbe91f6edfcc283d1173 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Sat, 14 Sep 2024 16:25:04 +0530 Subject: [PATCH 05/27] chore: some semblence of a movegen --- games/src/ataxx/position.rs | 12 ++ games/src/chess/bitboard.rs | 22 ++- games/src/chess/mod.rs | 2 + games/src/chess/movegen.rs | 334 ++++++++++++++++++++++++++++++++ games/src/chess/position.rs | 23 ++- games/src/chess/square.rs | 53 ++++- games/src/interface/position.rs | 3 + 7 files changed, 442 insertions(+), 7 deletions(-) create mode 100644 games/src/chess/movegen.rs diff --git a/games/src/ataxx/position.rs b/games/src/ataxx/position.rs index 8654f16..c821fd9 100644 --- a/games/src/ataxx/position.rs +++ b/games/src/ataxx/position.rs @@ -86,6 +86,18 @@ impl PositionType for Position { self.bitboards[piece as usize] } + fn side_to_move(&self) -> interface::Color { + self.side_to_move + } + + fn half_move_clock(&self) -> usize { + self.half_move_clock as usize + } + + fn ply_count(&self) -> usize { + self.ply_count as usize + } + fn hash(&self) -> Hash { self.checksum } diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index 9d4b46d..a379fae 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -13,7 +13,7 @@ use crate::interface::{bitboard_type, BitBoardType, RepresentableType}; -use super::Square; +use super::{Direction, Square}; bitboard_type! { /// A set of Squares implemented as a bitset where the `1 << sq.into()` bit @@ -28,7 +28,7 @@ bitboard_type! { // BitBoards containing the squares of the first file and the first rank. FirstFile = Self(0x0101010101010101); - FirstRank = Self(0xff00000000000000); + FirstRank = Self(0x00000000000000ff); } } @@ -36,6 +36,19 @@ impl BitBoard { pub fn new(raw: u64) -> BitBoard { BitBoard(raw) } + + pub fn shift(&self, dir: Direction) -> BitBoard { + match dir { + Direction::North => self.north(), + Direction::South => self.south(), + Direction::East => self.east(), + Direction::West => self.west(), + Direction::NorthEast => self.north().east(), + Direction::NorthWest => self.north().west(), + Direction::SouthEast => self.south().east(), + Direction::SouthWest => self.south().west(), + } + } } impl BitBoard { @@ -87,6 +100,11 @@ impl BitBoard { BitBoard(BitBoard::BETWEEN[sq_1 as usize][sq_2 as usize]) } + pub fn between2(sq_1: Square, sq_2: Square) -> BitBoard { + BitBoard(BitBoard::BETWEEN[sq_1 as usize][sq_2 as usize]) + | BitBoard::from(sq_2) + } + #[rustfmt::skip] const BETWEEN: [[u64; Square::N]; Square::N] = [ [ 0x0101010101010100, 0x0000000000000000, 0x0000000000000002, 0x0000000000000006, 0x000000000000000e, 0x000000000000001e, 0x000000000000003e, 0x000000000000007e, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040200, 0x0000000000000000, 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040200 ], diff --git a/games/src/chess/mod.rs b/games/src/chess/mod.rs index b3ccb68..0073cdd 100644 --- a/games/src/chess/mod.rs +++ b/games/src/chess/mod.rs @@ -3,6 +3,8 @@ pub mod castling; pub mod moves; pub mod zobrist; +mod movegen; + // Non-namespaced modules. mod bitboard; mod color; diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs new file mode 100644 index 0000000..a7697cb --- /dev/null +++ b/games/src/chess/movegen.rs @@ -0,0 +1,334 @@ +use crate::interface::{ + BitBoardType, ColoredPieceType, MoveStore, PositionType, +}; + +use super::{ + moves, BitBoard, ColoredPiece, Direction, Move, MoveFlag, Piece, Position, + Square, +}; + +pub struct MoveGenerationInfo<'a> { + position: &'a Position, + + king: Square, + + friends: BitBoard, + enemies: BitBoard, + blocker: BitBoard, + + checkers: BitBoard, + + territory: BitBoard, + + checkmask: BitBoard, + + pinmask_l: BitBoard, + pinmask_d: BitBoard, +} + +impl<'a> MoveGenerationInfo<'a> { + fn serialize>( + &self, + source: Square, + targets: BitBoard, + movelist: &mut ML, + ) { + let targets = targets & self.checkmask & self.territory; + for target in targets { + movelist.push(Move::new(source, target, MoveFlag::Normal)) + } + } + + fn serialize_towards>( + &self, + offset: Direction, + flag: MoveFlag, + targets: BitBoard, + movelist: &mut ML, + ) { + let targets = targets & self.checkmask & self.territory; + for target in targets { + movelist.push(Move::new(target.shift(-offset), target, flag)) + } + } + + fn serialize_promotions>( + &self, + offset: Direction, + targets: BitBoard, + movelist: &mut ML, + ) { + let targets = targets & self.checkmask & self.territory; + for target in targets { + movelist.push(Move::new( + target.shift(-offset), + target, + MoveFlag::NPromotion, + )); + movelist.push(Move::new( + target.shift(-offset), + target, + MoveFlag::BPromotion, + )); + movelist.push(Move::new( + target.shift(-offset), + target, + MoveFlag::RPromotion, + )); + movelist.push(Move::new( + target.shift(-offset), + target, + MoveFlag::QPromotion, + )); + } + } +} + +impl<'a> MoveGenerationInfo<'a> { + fn generate_checkers(position: &Position, king: Square) -> BitBoard { + let stm = position.side_to_move(); + let xtm = !stm; + + let friends = position.color_bb(stm); + let enemies = position.color_bb(xtm); + let blocker = friends | enemies; + + let p = position.piece_bb(Piece::Pawn); + let n = position.piece_bb(Piece::Knight); + let b = position.piece_bb(Piece::Bishop); + let r = position.piece_bb(Piece::Rook); + let q = position.piece_bb(Piece::Queen); + + let checking_p = p & moves::pawn_attacks(king, stm); + let checking_n = n & moves::knight(king); + let checking_b = (b | q) & moves::bishop(king, blocker); + let checking_r = (r | q) & moves::rook(king, blocker); + + (checking_p | checking_n | checking_b | checking_r) & enemies + } + + fn generate_checkmask( + position: &Position, + checkers: BitBoard, + king: Square, + ) -> BitBoard { + match checkers.len() { + 0 => BitBoard::UNIVERSE, + 2 => BitBoard::EMPTY, + _ => { + let checker_sq = + unsafe { checkers.clone().next().unwrap_unchecked() }; + + let checker_pc = unsafe { + position.at(checker_sq).unwrap_unchecked().piece() + }; + + if checker_pc == Piece::Pawn || checker_pc == Piece::Knight { + checkers + } else { + BitBoard::between2(king, checker_sq) + } + } + } + } + + fn generate_pinmask( + position: &Position, + pinners: BitBoard, + king: Square, + ) -> BitBoard { + let friends = position.color_bb(position.side_to_move()); + let mut pinmask = BitBoard::EMPTY; + + for possible_pinner in pinners { + let possible_pin = BitBoard::between2(king, possible_pinner); + if (friends & possible_pin).len() == 1 { + pinmask |= possible_pin; + } + } + + pinmask + } + + fn generate_pinmasks( + position: &Position, + king: Square, + ) -> (BitBoard, BitBoard) { + let enemies = position.color_bb(!position.side_to_move()); + + let b = enemies & position.piece_bb(Piece::Bishop); + let r = enemies & position.piece_bb(Piece::Rook); + let q = enemies & position.piece_bb(Piece::Queen); + + ( + Self::generate_pinmask( + position, + (r | q) & moves::rook(king, enemies), + king, + ), + Self::generate_pinmask( + position, + (b | q) & moves::bishop(king, enemies), + king, + ), + ) + } +} + +impl<'a> MoveGenerationInfo<'a> { + fn pawn_moves>(&self, movelist: &mut ML) { + let up = Direction::up(self.position.side_to_move()); + let ue = up + Direction::East; + let uw = up + Direction::West; + + let pawns = self.position.piece_bb(Piece::Pawn) & self.friends; + + { + let attackers = pawns - self.pinmask_l; + + let pinned_attackers = attackers & self.pinmask_d; + let unpinned_attackers = attackers ^ pinned_attackers; + + let pinned_attacks_east = pinned_attackers.shift(ue); + let pinned_attacks_west = pinned_attackers.shift(uw); + let unpinned_attacks_east = unpinned_attackers.shift(ue); + let unpinned_attacks_west = unpinned_attackers.shift(uw); + + let attacks_east = + (pinned_attacks_east & self.pinmask_d) | unpinned_attacks_east; + let attacks_west = + (pinned_attacks_west & self.pinmask_d) | unpinned_attacks_west; + + self.serialize_towards( + ue, + MoveFlag::Normal, + attacks_east & self.enemies, + movelist, + ); + self.serialize_towards( + uw, + MoveFlag::Normal, + attacks_west & self.enemies, + movelist, + ); + } + + { + let pushers = pawns - self.pinmask_d; + + let pinned_pushers = pushers & self.pinmask_l; + let unpinned_pushers = pushers ^ pinned_pushers; + + let pinned_single_push = pinned_pushers.shift(up) - self.blocker; + let unpinned_single_push = + unpinned_pushers.shift(up) - self.blocker; + + let single_pushes = + (pinned_single_push & self.pinmask_l) | unpinned_single_push; + + self.serialize_towards( + up, + MoveFlag::Normal, + single_pushes, + movelist, + ); + } + } + + fn knight_moves>(&self, movelist: &mut ML) { + let knights = (self.position.piece_bb(Piece::Knight) & self.friends) + - (self.pinmask_l | self.pinmask_d); + for knight in knights { + self.serialize(knight, moves::knight(knight), movelist) + } + } + + fn bishop_moves>(&self, movelist: &mut ML) { + let bishops = ((self.position.piece_bb(Piece::Bishop) + | self.position.piece_bb(Piece::Queen)) + & self.friends) + - self.pinmask_l; + + let pinned = bishops & self.pinmask_d; + for bishop in pinned { + self.serialize( + bishop, + moves::bishop(bishop, self.blocker) & self.pinmask_d, + movelist, + ) + } + + let unpinned = bishops ^ pinned; + for bishop in unpinned { + self.serialize( + bishop, + moves::bishop(bishop, self.blocker), + movelist, + ) + } + } + + fn rook_moves>(&self, movelist: &mut ML) { + let rooks = ((self.position.piece_bb(Piece::Rook) + | self.position.piece_bb(Piece::Queen)) + & self.friends) + - self.pinmask_d; + + let pinned = rooks & self.pinmask_l; + for rook in pinned { + self.serialize( + rook, + moves::rook(rook, self.blocker) & self.pinmask_l, + movelist, + ) + } + + let unpinned = rooks ^ pinned; + for rook in unpinned { + self.serialize(rook, moves::rook(rook, self.blocker), movelist) + } + } +} + +impl<'a> MoveGenerationInfo<'a> { + pub fn new(position: &'a Position) -> Self { + let king = unsafe { + position + .colored_piece_bb(ColoredPiece::new( + Piece::King, + position.side_to_move(), + )) + .next() + .unwrap_unchecked() + }; + let checkers = Self::generate_checkers(position, king); + let checkmask = Self::generate_checkmask(position, checkers, king); + let pinmasks = Self::generate_pinmasks(position, king); + + let friends = position.color_bb(position.side_to_move()); + let enemies = position.color_bb(position.side_to_move()); + let blocker = friends | enemies; + + let territory = !position.color_bb(position.side_to_move()); + + Self { + position, + king, + friends, + enemies, + blocker, + checkers, + checkmask, + territory, + pinmask_l: pinmasks.0, + pinmask_d: pinmasks.1, + } + } + + pub fn generate_moves_into>(&self, movelist: &mut ML) { + self.pawn_moves(movelist); + self.knight_moves(movelist); + self.bishop_moves(movelist); + self.rook_moves(movelist); + } +} diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index d3e302e..f701b9d 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -33,6 +33,7 @@ use crate::chess::{ }; use crate::interface::MoveStore; +use super::movegen; use super::MoveFlag; /// Position represents the snapshot of an Ataxx Board, the state of the an @@ -98,6 +99,18 @@ impl PositionType for Position { self.piece_bb(piece.piece()) & self.color_bb(piece.color()) } + fn side_to_move(&self) -> interface::Color { + self.side_to_move + } + + fn half_move_clock(&self) -> usize { + self.half_move_clock as usize + } + + fn ply_count(&self) -> usize { + self.ply_count as usize + } + fn hash(&self) -> Hash { self.checksum } @@ -170,8 +183,10 @@ impl PositionType for Position { T: MoveStore, >( &self, - _movelist: &mut T, + movelist: &mut T, ) { + let info = movegen::MoveGenerationInfo::new(self); + info.generate_moves_into(movelist); } } @@ -198,14 +213,14 @@ impl FromStr for Position { fn from_str(s: &str) -> Result { let parts = s.split(' ').collect::>(); - if parts.len() != 4 { + if parts.len() != 6 { return Err(PositionParseError::TooManyFields(parts.len())); } let pos = parts[0]; let stm = parts[1]; - let hmc = parts[2]; - let fmc = parts[3]; + let hmc = parts[4]; + let fmc = parts[5]; let mut position = Position { color_bbs: [BitBoard::EMPTY; Color::N], diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index d7ce76c..6bc4ded 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::fmt; +use std::{fmt, ops}; use crate::interface::{representable_type, RepresentableType, SquareType}; @@ -52,6 +52,10 @@ impl Square { } } + pub fn shift(self, dir: Direction) -> Square { + unsafe { Square::unsafe_from((self as i8 + dir as i8) as u8) } + } + pub fn diagonal(self) -> usize { 14 - self.rank() as usize - self.file() as usize } @@ -75,3 +79,50 @@ representable_type!( Fifth "5", Sixth "6", Seventh "7", Eighth "8", } ); + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Direction { + North = 8, + South = -8, + + East = 1, + West = -1, + + NorthEast = 8 + 1, + NorthWest = 8 - 1, + SouthEast = -8 + 1, + SouthWest = -8 - 1, +} + +impl Direction { + pub fn up(stm: Color) -> Direction { + match stm { + Color::White => Direction::North, + Color::Black => Direction::South, + } + } +} + +impl ops::Add for Direction { + type Output = Direction; + + fn add(self, rhs: Self) -> Self::Output { + unsafe { std::mem::transmute_copy(&(self as i8 + rhs as i8)) } + } +} + +impl ops::Sub for Direction { + type Output = Direction; + + fn sub(self, rhs: Self) -> Self::Output { + unsafe { std::mem::transmute_copy(&(self as i8 - rhs as i8)) } + } +} + +impl ops::Neg for Direction { + type Output = Direction; + + fn neg(self) -> Self::Output { + unsafe { std::mem::transmute_copy(&(-(self as i8))) } + } +} diff --git a/games/src/interface/position.rs b/games/src/interface/position.rs index 7cf3ca3..4e519a0 100644 --- a/games/src/interface/position.rs +++ b/games/src/interface/position.rs @@ -49,6 +49,9 @@ where #[must_use] fn colored_piece_bb(&self, piece: Self::ColoredPiece) -> Self::BitBoard; + fn side_to_move(&self) -> Color; + fn half_move_clock(&self) -> usize; + fn ply_count(&self) -> usize; /// Returns a semi-unique checksum of the current Position. #[must_use] fn hash(&self) -> Hash; From e4f077d39975f1f7ad38ac9c76e011aafa96b6c3 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Sat, 14 Sep 2024 17:07:08 +0530 Subject: [PATCH 06/27] chore: fix universe bb --- games/src/chess/bitboard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index a379fae..27cab21 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -24,7 +24,7 @@ bitboard_type! { // BitBoards representing the null and the universe sets. Empty = Self(0); - Universe = Self(0xfffffffffffff); + Universe = Self(0xfffffffffffffff); // BitBoards containing the squares of the first file and the first rank. FirstFile = Self(0x0101010101010101); From 7d447c5062da1cd35fb4f87e415b81215986ddbc Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Sat, 14 Sep 2024 17:16:00 +0530 Subject: [PATCH 07/27] AHHHHHHHH --- games/src/chess/bitboard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index 27cab21..9654034 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -24,7 +24,7 @@ bitboard_type! { // BitBoards representing the null and the universe sets. Empty = Self(0); - Universe = Self(0xfffffffffffffff); + Universe = Self(0xffffffffffffffff); // BitBoards containing the squares of the first file and the first rank. FirstFile = Self(0x0101010101010101); From a7f4b30acfd40419b1c651af8aa1946ad0821c23 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 25 Sep 2024 20:11:51 +0530 Subject: [PATCH 08/27] chore: fix a bunch of tables and shit --- games/src/chess/bitboard.rs | 192 ++++++++++++++++++------------------ games/src/chess/movegen.rs | 43 ++++++-- games/src/chess/moves.rs | 122 +++++++++++------------ games/src/chess/square.rs | 4 +- games/src/interface/mod.rs | 2 +- 5 files changed, 197 insertions(+), 166 deletions(-) diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index 9654034..f4e711c 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -60,40 +60,40 @@ impl BitBoard { BitBoard(BitBoard::ANTI_DIAGONAL[anti_diagonal]) } - const DIAGONAL: [u64; 15] = [ - 0x8000000000000000, - 0x4080000000000000, - 0x2040800000000000, - 0x1020408000000000, - 0x0810204080000000, - 0x0408102040800000, - 0x0204081020408000, - 0x0102040810204080, - 0x0001020408102040, - 0x0000010204081020, - 0x0000000102040810, - 0x0000000001020408, - 0x0000000000010204, - 0x0000000000000102, - 0x0000000000000001, + pub const DIAGONAL: [u64; 15] = [ + 0x0000000000000080, + 0x0000000000008040, + 0x0000000000804020, + 0x0000000080402010, + 0x0000008040201008, + 0x0000804020100804, + 0x0080402010080402, + 0x8040201008040201, + 0x4020100804020100, + 0x2010080402010000, + 0x1008040201000000, + 0x0804020100000000, + 0x0402010000000000, + 0x0201000000000000, + 0x0100000000000000, ]; - const ANTI_DIAGONAL: [u64; 15] = [ - 0x0100000000000000, - 0x0201000000000000, - 0x0402010000000000, - 0x0804020100000000, - 0x1008040201000000, - 0x2010080402010000, - 0x4020100804020100, - 0x8040201008040201, - 0x0080402010080402, - 0x0000804020100804, - 0x0000008040201008, - 0x0000000080402010, - 0x0000000000804020, - 0x0000000000008040, - 0x0000000000000080, + pub const ANTI_DIAGONAL: [u64; 15] = [ + 0x0000000000000001, + 0x0000000000000102, + 0x0000000000010204, + 0x0000000001020408, + 0x0000000102040810, + 0x0000010204081020, + 0x0001020408102040, + 0x0102040810204080, + 0x0204081020408000, + 0x0408102040800000, + 0x0810204080000000, + 0x1020408000000000, + 0x2040800000000000, + 0x4080000000000000, + 0x8000000000000000, ]; pub fn between(sq_1: Square, sq_2: Square) -> BitBoard { @@ -107,69 +107,69 @@ impl BitBoard { #[rustfmt::skip] const BETWEEN: [[u64; Square::N]; Square::N] = [ - [ 0x0101010101010100, 0x0000000000000000, 0x0000000000000002, 0x0000000000000006, 0x000000000000000e, 0x000000000000001e, 0x000000000000003e, 0x000000000000007e, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040200, 0x0000000000000000, 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040200 ], - [ 0x0000000000000000, 0x0202020202020200, 0x0000000000000000, 0x0000000000000004, 0x000000000000000c, 0x000000000000001c, 0x000000000000003c, 0x000000000000007c, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000002, 0x0000000000000000, 0x0404040404040400, 0x0000000000000000, 0x0000000000000008, 0x0000000000000018, 0x0000000000000038, 0x0000000000000078, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000006, 0x0000000000000004, 0x0000000000000000, 0x0808080808080800, 0x0000000000000000, 0x0000000000000010, 0x0000000000000030, 0x0000000000000070, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x000000000000000e, 0x000000000000000c, 0x0000000000000008, 0x0000000000000000, 0x1010101010101000, 0x0000000000000000, 0x0000000000000020, 0x0000000000000060, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x000000000000001e, 0x000000000000001c, 0x0000000000000018, 0x0000000000000010, 0x0000000000000000, 0x2020202020202000, 0x0000000000000000, 0x0000000000000040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x000000000000003e, 0x000000000000003c, 0x0000000000000038, 0x0000000000000030, 0x0000000000000020, 0x0000000000000000, 0x4040404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000 ], - [ 0x000000000000007e, 0x000000000000007c, 0x0000000000000078, 0x0000000000000070, 0x0000000000000060, 0x0000000000000040, 0x0000000000000000, 0x8080808080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0002040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010101010001, 0x0000000000000000, 0x0000000000000200, 0x0000000000000600, 0x0000000000000e00, 0x0000000000001e00, 0x0000000000003e00, 0x0000000000007e00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020202020002, 0x0000000000000000, 0x0000000000000400, 0x0000000000000c00, 0x0000000000001c00, 0x0000000000003c00, 0x0000000000007c00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0404040404040004, 0x0000000000000000, 0x0000000000000800, 0x0000000000001800, 0x0000000000003800, 0x0000000000007800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000600, 0x0000000000000400, 0x0000000000000000, 0x0808080808080008, 0x0000000000000000, 0x0000000000001000, 0x0000000000003000, 0x0000000000007000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000e00, 0x0000000000000c00, 0x0000000000000800, 0x0000000000000000, 0x1010101010100010, 0x0000000000000000, 0x0000000000002000, 0x0000000000006000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001e00, 0x0000000000001c00, 0x0000000000001800, 0x0000000000001000, 0x0000000000000000, 0x2020202020200020, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000003e00, 0x0000000000003c00, 0x0000000000003800, 0x0000000000003000, 0x0000000000002000, 0x0000000000000000, 0x4040404040400040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000007e00, 0x0000000000007c00, 0x0000000000007800, 0x0000000000007000, 0x0000000000006000, 0x0000000000004000, 0x0000000000000000, 0x8080808080800080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000 ], - [ 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010101000101, 0x0000000000000000, 0x0000000000020000, 0x0000000000060000, 0x00000000000e0000, 0x00000000001e0000, 0x00000000003e0000, 0x00000000007e0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020202000202, 0x0000000000000000, 0x0000000000040000, 0x00000000000c0000, 0x00000000001c0000, 0x00000000003c0000, 0x00000000007c0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000 ], - [ 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0404040404000404, 0x0000000000000000, 0x0000000000080000, 0x0000000000180000, 0x0000000000380000, 0x0000000000780000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000 ], - [ 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000060000, 0x0000000000040000, 0x0000000000000000, 0x0808080808000808, 0x0000000000000000, 0x0000000000100000, 0x0000000000300000, 0x0000000000700000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000e0000, 0x00000000000c0000, 0x0000000000080000, 0x0000000000000000, 0x1010101010001010, 0x0000000000000000, 0x0000000000200000, 0x0000000000600000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000001e0000, 0x00000000001c0000, 0x0000000000180000, 0x0000000000100000, 0x0000000000000000, 0x2020202020002020, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000003e0000, 0x00000000003c0000, 0x0000000000380000, 0x0000000000300000, 0x0000000000200000, 0x0000000000000000, 0x4040404040004040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000007e0000, 0x00000000007c0000, 0x0000000000780000, 0x0000000000700000, 0x0000000000600000, 0x0000000000400000, 0x0000000000000000, 0x8080808080008080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000 ], - [ 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010100010101, 0x0000000000000000, 0x0000000002000000, 0x0000000006000000, 0x000000000e000000, 0x000000001e000000, 0x000000003e000000, 0x000000007e000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020200020202, 0x0000000000000000, 0x0000000004000000, 0x000000000c000000, 0x000000001c000000, 0x000000003c000000, 0x000000007c000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0404040400040404, 0x0000000000000000, 0x0000000008000000, 0x0000000018000000, 0x0000000038000000, 0x0000000078000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000 ], - [ 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000006000000, 0x0000000004000000, 0x0000000000000000, 0x0808080800080808, 0x0000000000000000, 0x0000000010000000, 0x0000000030000000, 0x0000000070000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000 ], - [ 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000000e000000, 0x000000000c000000, 0x0000000008000000, 0x0000000000000000, 0x1010101000101010, 0x0000000000000000, 0x0000000020000000, 0x0000000060000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000001e000000, 0x000000001c000000, 0x0000000018000000, 0x0000000010000000, 0x0000000000000000, 0x2020202000202020, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000003e000000, 0x000000003c000000, 0x0000000038000000, 0x0000000030000000, 0x0000000020000000, 0x0000000000000000, 0x4040404000404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000007e000000, 0x000000007c000000, 0x0000000078000000, 0x0000000070000000, 0x0000000060000000, 0x0000000040000000, 0x0000000000000000, 0x8080808000808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000 ], - [ 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101010001010101, 0x0000000000000000, 0x0000000200000000, 0x0000000600000000, 0x0000000e00000000, 0x0000001e00000000, 0x0000003e00000000, 0x0000007e00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202020002020202, 0x0000000000000000, 0x0000000400000000, 0x0000000c00000000, 0x0000001c00000000, 0x0000003c00000000, 0x0000007c00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0404040004040404, 0x0000000000000000, 0x0000000800000000, 0x0000001800000000, 0x0000003800000000, 0x0000007800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000600000000, 0x0000000400000000, 0x0000000000000000, 0x0808080008080808, 0x0000000000000000, 0x0000001000000000, 0x0000003000000000, 0x0000007000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000 ], - [ 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000e00000000, 0x0000000c00000000, 0x0000000800000000, 0x0000000000000000, 0x1010100010101010, 0x0000000000000000, 0x0000002000000000, 0x0000006000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000 ], - [ 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001e00000000, 0x0000001c00000000, 0x0000001800000000, 0x0000001000000000, 0x0000000000000000, 0x2020200020202020, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000003e00000000, 0x0000003c00000000, 0x0000003800000000, 0x0000003000000000, 0x0000002000000000, 0x0000000000000000, 0x4040400040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000007e00000000, 0x0000007c00000000, 0x0000007800000000, 0x0000007000000000, 0x0000006000000000, 0x0000004000000000, 0x0000000000000000, 0x8080800080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000 ], - [ 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0101000101010101, 0x0000000000000000, 0x0000020000000000, 0x0000060000000000, 0x00000e0000000000, 0x00001e0000000000, 0x00003e0000000000, 0x00007e0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0202000202020202, 0x0000000000000000, 0x0000040000000000, 0x00000c0000000000, 0x00001c0000000000, 0x00003c0000000000, 0x00007c0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0404000404040404, 0x0000000000000000, 0x0000080000000000, 0x0000180000000000, 0x0000380000000000, 0x0000780000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000060000000000, 0x0000040000000000, 0x0000000000000000, 0x0808000808080808, 0x0000000000000000, 0x0000100000000000, 0x0000300000000000, 0x0000700000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000e0000000000, 0x00000c0000000000, 0x0000080000000000, 0x0000000000000000, 0x1010001010101010, 0x0000000000000000, 0x0000200000000000, 0x0000600000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000 ], - [ 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00001e0000000000, 0x00001c0000000000, 0x0000180000000000, 0x0000100000000000, 0x0000000000000000, 0x2020002020202020, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000 ], - [ 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00003e0000000000, 0x00003c0000000000, 0x0000380000000000, 0x0000300000000000, 0x0000200000000000, 0x0000000000000000, 0x4040004040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007e0000000000, 0x00007c0000000000, 0x0000780000000000, 0x0000700000000000, 0x0000600000000000, 0x0000400000000000, 0x0000000000000000, 0x8080008080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000 ], - [ 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0100010101010101, 0x0000000000000000, 0x0002000000000000, 0x0006000000000000, 0x000e000000000000, 0x001e000000000000, 0x003e000000000000, 0x007e000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200020202020202, 0x0000000000000000, 0x0004000000000000, 0x000c000000000000, 0x001c000000000000, 0x003c000000000000, 0x007c000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0400040404040404, 0x0000000000000000, 0x0008000000000000, 0x0018000000000000, 0x0038000000000000, 0x0078000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0006000000000000, 0x0004000000000000, 0x0000000000000000, 0x0800080808080808, 0x0000000000000000, 0x0010000000000000, 0x0030000000000000, 0x0070000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000e000000000000, 0x000c000000000000, 0x0008000000000000, 0x0000000000000000, 0x1000101010101010, 0x0000000000000000, 0x0020000000000000, 0x0060000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x001e000000000000, 0x001c000000000000, 0x0018000000000000, 0x0010000000000000, 0x0000000000000000, 0x2000202020202020, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x003e000000000000, 0x003c000000000000, 0x0038000000000000, 0x0030000000000000, 0x0020000000000000, 0x0000000000000000, 0x4000404040404040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x007e000000000000, 0x007c000000000000, 0x0078000000000000, 0x0070000000000000, 0x0060000000000000, 0x0040000000000000, 0x0000000000000000, 0x8000808080808080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 ], - [ 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810204000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010101010101, 0x0000000000000000, 0x0200000000000000, 0x0600000000000000, 0x0e00000000000000, 0x1e00000000000000, 0x3e00000000000000, 0x7e00000000000000 ], - [ 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020202, 0x0000000000000000, 0x0400000000000000, 0x0c00000000000000, 0x1c00000000000000, 0x3c00000000000000, 0x7c00000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200000000000000, 0x0000000000000000, 0x0004040404040404, 0x0000000000000000, 0x0800000000000000, 0x1800000000000000, 0x3800000000000000, 0x7800000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0600000000000000, 0x0400000000000000, 0x0000000000000000, 0x0008080808080808, 0x0000000000000000, 0x1000000000000000, 0x3000000000000000, 0x7000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0e00000000000000, 0x0c00000000000000, 0x0800000000000000, 0x0000000000000000, 0x0010101010101010, 0x0000000000000000, 0x2000000000000000, 0x6000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1e00000000000000, 0x1c00000000000000, 0x1800000000000000, 0x1000000000000000, 0x0000000000000000, 0x0020202020202020, 0x0000000000000000, 0x4000000000000000 ], - [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x3e00000000000000, 0x3c00000000000000, 0x3800000000000000, 0x3000000000000000, 0x2000000000000000, 0x0000000000000000, 0x0040404040404040, 0x0000000000000000 ], - [ 0x0040201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000, 0x0000000000000000, 0x0040201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x7e00000000000000, 0x7c00000000000000, 0x7800000000000000, 0x7000000000000000, 0x6000000000000000, 0x4000000000000000, 0x0000000000000000, 0x0080808080808080 ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000002, 0x0000000000000006, 0x000000000000000e, 0x000000000000001e, 0x000000000000003e, 0x000000000000007e, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040200, 0x0000000000000000, 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040200, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000004, 0x000000000000000c, 0x000000000000001c, 0x000000000000003c, 0x000000000000007c, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000008, 0x0000000000000018, 0x0000000000000038, 0x0000000000000078, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000006, 0x0000000000000004, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000010, 0x0000000000000030, 0x0000000000000070, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x000000000000000e, 0x000000000000000c, 0x0000000000000008, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000020, 0x0000000000000060, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x000000000000001e, 0x000000000000001c, 0x0000000000000018, 0x0000000000000010, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x000000000000003e, 0x000000000000003c, 0x0000000000000038, 0x0000000000000030, 0x0000000000000020, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000, ], + [ 0x000000000000007e, 0x000000000000007c, 0x0000000000000078, 0x0000000000000070, 0x0000000000000060, 0x0000000000000040, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0002040810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000600, 0x0000000000000e00, 0x0000000000001e00, 0x0000000000003e00, 0x0000000000007e00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000400, 0x0000000000000c00, 0x0000000000001c00, 0x0000000000003c00, 0x0000000000007c00, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008040000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000001800, 0x0000000000003800, 0x0000000000007800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000600, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000003000, 0x0000000000007000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000e00, 0x0000000000000c00, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000006000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001e00, 0x0000000000001c00, 0x0000000000001800, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000003e00, 0x0000000000003c00, 0x0000000000003800, 0x0000000000003000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000007e00, 0x0000000000007c00, 0x0000000000007800, 0x0000000000007000, 0x0000000000006000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000, ], + [ 0x0000000000000100, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000060000, 0x00000000000e0000, 0x00000000001e0000, 0x00000000003e0000, 0x00000000007e0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x00000000000c0000, 0x00000000001c0000, 0x00000000003c0000, 0x00000000007c0000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000, ], + [ 0x0000000000000200, 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000180000, 0x0000000000380000, 0x0000000000780000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000, ], + [ 0x0000000000000000, 0x0000000000000400, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000060000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000300000, 0x0000000000700000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000800, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000e0000, 0x00000000000c0000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000600000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000001000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000001e0000, 0x00000000001c0000, 0x0000000000180000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000003e0000, 0x00000000003c0000, 0x0000000000380000, 0x0000000000300000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000000000, 0x0000000000008000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000007e0000, 0x00000000007c0000, 0x0000000000780000, 0x0000000000700000, 0x0000000000600000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000, ], + [ 0x0000000000010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000020400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000010000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000006000000, 0x000000000e000000, 0x000000001e000000, 0x000000003e000000, 0x000000007e000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x000000000c000000, 0x000000001c000000, 0x000000003c000000, 0x000000007c000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000020000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000018000000, 0x0000000038000000, 0x0000000078000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000, ], + [ 0x0000000000040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000006000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000030000000, 0x0000000070000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000, ], + [ 0x0000000000000000, 0x0000000000080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000204000, 0x0000000000000000, 0x0000000000000000, 0x0000000000080000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000000e000000, 0x000000000c000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000060000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000001e000000, 0x000000001c000000, 0x0000000018000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000200000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000003e000000, 0x000000003c000000, 0x0000000038000000, 0x0000000030000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000402000, 0x0000000000000000, 0x0000000000000000, 0x0000000000808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000000000, 0x0000000000800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000000007e000000, 0x000000007c000000, 0x0000000078000000, 0x0000000070000000, 0x0000000060000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000, ], + [ 0x0000000001010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001010000, 0x0000000000000000, 0x0000000000000000, 0x0000000002040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000001000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000600000000, 0x0000000e00000000, 0x0000001e00000000, 0x0000003e00000000, 0x0000007e00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000002020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004081000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002020000, 0x0000000000000000, 0x0000000000000000, 0x0000000004080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000c00000000, 0x0000001c00000000, 0x0000003c00000000, 0x0000007c00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000004040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008102000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000004040000, 0x0000000000000000, 0x0000000000000000, 0x0000000008100000, 0x0000000000000000, 0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000001800000000, 0x0000003800000000, 0x0000007800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010204000, 0x0000000004020000, 0x0000000000000000, 0x0000000000000000, 0x0000000008080000, 0x0000000000000000, 0x0000000000000000, 0x0000000010200000, 0x0000000000000000, 0x0000000000000000, 0x0000000004000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000600000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000003000000000, 0x0000007000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000, ], + [ 0x0000000008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000020400000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000e00000000, 0x0000000c00000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000006000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000, ], + [ 0x0000000000000000, 0x0000000010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001e00000000, 0x0000001c00000000, 0x0000001800000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000020000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000003e00000000, 0x0000003c00000000, 0x0000003800000000, 0x0000003000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040201000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040200000, 0x0000000000000000, 0x0000000000000000, 0x0000000080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000007e00000000, 0x0000007c00000000, 0x0000007800000000, 0x0000007000000000, 0x0000006000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000, ], + [ 0x0000000101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204081000, 0x0000000000000000, 0x0000000000000000, 0x0000000101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000204000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000100000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000060000000000, 0x00000e0000000000, 0x00001e0000000000, 0x00003e0000000000, 0x00007e0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408102000, 0x0000000000000000, 0x0000000000000000, 0x0000000202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x00000c0000000000, 0x00001c0000000000, 0x00003c0000000000, 0x00007c0000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810204000, 0x0000000000000000, 0x0000000000000000, 0x0000000404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000200000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000180000000000, 0x0000380000000000, 0x0000780000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020400000, 0x0000000402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000808000000, 0x0000000000000000, 0x0000000000000000, 0x0000001020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000400000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000060000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000300000000000, 0x0000700000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000804000000, 0x0000000000000000, 0x0000000000000000, 0x0000001010000000, 0x0000000000000000, 0x0000000000000000, 0x0000002040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000800000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000e0000000000, 0x00000c0000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000600000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, ], + [ 0x0000001008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001008000000, 0x0000000000000000, 0x0000000000000000, 0x0000002020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000001000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00001e0000000000, 0x00001c0000000000, 0x0000180000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, ], + [ 0x0000000000000000, 0x0000002010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040404000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002010000000, 0x0000000000000000, 0x0000000000000000, 0x0000004040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000002000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00003e0000000000, 0x00003c0000000000, 0x0000380000000000, 0x0000300000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000004020100800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080808000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004020000000, 0x0000000000000000, 0x0000000000000000, 0x0000008080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000004000000000, 0x0000000000000000, 0x0000008000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007e0000000000, 0x00007c0000000000, 0x0000780000000000, 0x0000700000000000, 0x0000600000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000, ], + [ 0x0000010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408102000, 0x0000000000000000, 0x0000010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408100000, 0x0000000000000000, 0x0000000000000000, 0x0000010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020408000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000020400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0006000000000000, 0x000e000000000000, 0x001e000000000000, 0x003e000000000000, 0x007e000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810204000, 0x0000000000000000, 0x0000020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810200000, 0x0000000000000000, 0x0000000000000000, 0x0000020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040810000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x000c000000000000, 0x001c000000000000, 0x003c000000000000, 0x007c000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020400000, 0x0000000000000000, 0x0000000000000000, 0x0000040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000081020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000020000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0018000000000000, 0x0038000000000000, 0x0078000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000102040000000, 0x0000040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000040000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0006000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0030000000000000, 0x0070000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000204000000000, 0x0000000000000000, 0x0000000000000000, 0x0000080000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000e000000000000, 0x000c000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0060000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020200000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000100000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x001e000000000000, 0x001c000000000000, 0x0018000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040404000, 0x0000000000000000, 0x0000000000000000, 0x0000201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040400000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000200000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x003e000000000000, 0x003c000000000000, 0x0038000000000000, 0x0030000000000000, 0x0020000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0000000000000000, 0x0000402010080400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080808000, 0x0000000000000000, 0x0000000000000000, 0x0000402010080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080800000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000402000000000, 0x0000000000000000, 0x0000000000000000, 0x0000808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000400000000000, 0x0000000000000000, 0x0000800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x007e000000000000, 0x007c000000000000, 0x0078000000000000, 0x0070000000000000, 0x0060000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0001010101010100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810204000, 0x0001010101010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810200000, 0x0000000000000000, 0x0001010101000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040810000000, 0x0000000000000000, 0x0000000000000000, 0x0001010100000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001010000000000, 0x0000000000000000, 0x0000000000000000, 0x0002040000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0001000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200000000000000, 0x0600000000000000, 0x0e00000000000000, 0x1e00000000000000, 0x3e00000000000000, 0x7e00000000000000, ], + [ 0x0000000000000000, 0x0002020202020200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020202020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020400000, 0x0000000000000000, 0x0002020202000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081020000000, 0x0000000000000000, 0x0000000000000000, 0x0002020200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004081000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002020000000000, 0x0000000000000000, 0x0000000000000000, 0x0004080000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0400000000000000, 0x0c00000000000000, 0x1c00000000000000, 0x3c00000000000000, 0x7c00000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0004040404040400, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040404000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102040000000, 0x0000000000000000, 0x0000000000000000, 0x0004040400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008102000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0004040000000000, 0x0000000000000000, 0x0000000000000000, 0x0008100000000000, 0x0000000000000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0200000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0800000000000000, 0x1800000000000000, 0x3800000000000000, 0x7800000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808080000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080808000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010204000000000, 0x0004020000000000, 0x0000000000000000, 0x0000000000000000, 0x0008080000000000, 0x0000000000000000, 0x0000000000000000, 0x0010200000000000, 0x0000000000000000, 0x0000000000000000, 0x0004000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0600000000000000, 0x0400000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1000000000000000, 0x3000000000000000, 0x7000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010101000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101010000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010101000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0008040000000000, 0x0000000000000000, 0x0000000000000000, 0x0010100000000000, 0x0000000000000000, 0x0000000000000000, 0x0020400000000000, 0x0000000000000000, 0x0000000000000000, 0x0008000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0e00000000000000, 0x0c00000000000000, 0x0800000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x2000000000000000, 0x6000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020202000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020200000, 0x0000000000000000, 0x0000000000000000, 0x0010080402000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202020000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080400000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020202000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010080000000000, 0x0000000000000000, 0x0000000000000000, 0x0020200000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0010000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1e00000000000000, 0x1c00000000000000, 0x1800000000000000, 0x1000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x4000000000000000, ], + [ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040404000, 0x0000000000000000, 0x0020100804020000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040400000, 0x0000000000000000, 0x0000000000000000, 0x0020100804000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100800000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040404000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020100000000000, 0x0000000000000000, 0x0000000000000000, 0x0040400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0020000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x3e00000000000000, 0x3c00000000000000, 0x3800000000000000, 0x3000000000000000, 0x2000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], + [ 0x0040201008040200, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080808000, 0x0000000000000000, 0x0040201008040000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080800000, 0x0000000000000000, 0x0000000000000000, 0x0040201008000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808080000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040201000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0080808000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040200000000000, 0x0000000000000000, 0x0000000000000000, 0x0080800000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000, 0x0000000000000000, 0x0080000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x7e00000000000000, 0x7c00000000000000, 0x7800000000000000, 0x7000000000000000, 0x6000000000000000, 0x4000000000000000, 0x0000000000000000, 0x0000000000000000, ], ]; } diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index a7697cb..0e62a70 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -173,6 +173,21 @@ impl<'a> MoveGenerationInfo<'a> { ), ) } + + fn attacked(&self, sq: Square) -> bool { + let stm = self.position.side_to_move(); + + let p = self.friends & self.position.piece_bb(Piece::Pawn); + let n = self.friends & self.position.piece_bb(Piece::Knight); + let b = self.friends & self.position.piece_bb(Piece::Bishop); + let r = self.friends & self.position.piece_bb(Piece::Rook); + let q = self.friends & self.position.piece_bb(Piece::Queen); + + !(p.is_disjoint(moves::pawn_attacks(sq, !stm)) + && n.is_disjoint(moves::knight(sq)) + && (b | q).is_disjoint(moves::bishop(sq, self.blocker)) + && (r | q).is_disjoint(moves::rook(sq, self.blocker))) + } } impl<'a> MoveGenerationInfo<'a> { @@ -288,6 +303,16 @@ impl<'a> MoveGenerationInfo<'a> { self.serialize(rook, moves::rook(rook, self.blocker), movelist) } } + + fn king_moves>(&self, movelist: &mut ML) { + let targets = moves::king(self.king) & self.territory; + + for target in targets { + if !self.attacked(target) { + movelist.push(Move::new(self.king, target, MoveFlag::Normal)) + } + } + } } impl<'a> MoveGenerationInfo<'a> { @@ -299,7 +324,7 @@ impl<'a> MoveGenerationInfo<'a> { position.side_to_move(), )) .next() - .unwrap_unchecked() + .unwrap_or_else(|| panic!("{}", position)) }; let checkers = Self::generate_checkers(position, king); let checkmask = Self::generate_checkmask(position, checkers, king); @@ -309,7 +334,7 @@ impl<'a> MoveGenerationInfo<'a> { let enemies = position.color_bb(position.side_to_move()); let blocker = friends | enemies; - let territory = !position.color_bb(position.side_to_move()); + let territory = !friends; Self { position, @@ -326,9 +351,15 @@ impl<'a> MoveGenerationInfo<'a> { } pub fn generate_moves_into>(&self, movelist: &mut ML) { - self.pawn_moves(movelist); - self.knight_moves(movelist); - self.bishop_moves(movelist); - self.rook_moves(movelist); + let checker_num = self.checkers.len(); + + self.king_moves(movelist); + + if checker_num < 2 { + self.pawn_moves(movelist); + self.knight_moves(movelist); + self.bishop_moves(movelist); + self.rook_moves(movelist); + } } } diff --git a/games/src/chess/moves.rs b/games/src/chess/moves.rs index 415c704..9d3fd15 100644 --- a/games/src/chess/moves.rs +++ b/games/src/chess/moves.rs @@ -65,80 +65,80 @@ fn hyperbola(square: Square, blockers: BitBoard, mask: BitBoard) -> BitBoard { #[rustfmt::skip] const KING_MOVES_TABLE: [u64; Square::N] = [ - 0x0000000000000302, 0x0000000000000705, 0x0000000000000e0a, 0x0000000000001c14, + 0x0000000000000302, 0x0000000000000705, 0x0000000000000e0a, 0x0000000000001c14, 0x0000000000003828, 0x0000000000007050, 0x000000000000e0a0, 0x000000000000c040, - 0x0000000000030203, 0x0000000000070507, 0x00000000000e0a0e, 0x00000000001c141c, - 0x0000000000382838, 0x0000000000705070, 0x0000000000e0a0e0, 0x0000000000c040c0, - 0x0000000003020300, 0x0000000007050700, 0x000000000e0a0e00, 0x000000001c141c00, - 0x0000000038283800, 0x0000000070507000, 0x00000000e0a0e000, 0x00000000c040c000, - 0x0000000302030000, 0x0000000705070000, 0x0000000e0a0e0000, 0x0000001c141c0000, - 0x0000003828380000, 0x0000007050700000, 0x000000e0a0e00000, 0x000000c040c00000, - 0x0000030203000000, 0x0000070507000000, 0x00000e0a0e000000, 0x00001c141c000000, - 0x0000382838000000, 0x0000705070000000, 0x0000e0a0e0000000, 0x0000c040c0000000, - 0x0003020300000000, 0x0007050700000000, 0x000e0a0e00000000, 0x001c141c00000000, - 0x0038283800000000, 0x0070507000000000, 0x00e0a0e000000000, 0x00c040c000000000, - 0x0302030000000000, 0x0705070000000000, 0x0e0a0e0000000000, 0x1c141c0000000000, - 0x3828380000000000, 0x7050700000000000, 0xe0a0e00000000000, 0xc040c00000000000, - 0x0203000000000000, 0x0507000000000000, 0x0a0e000000000000, 0x141c000000000000, + 0x0000000000030203, 0x0000000000070507, 0x00000000000e0a0e, 0x00000000001c141c, + 0x0000000000382838, 0x0000000000705070, 0x0000000000e0a0e0, 0x0000000000c040c0, + 0x0000000003020300, 0x0000000007050700, 0x000000000e0a0e00, 0x000000001c141c00, + 0x0000000038283800, 0x0000000070507000, 0x00000000e0a0e000, 0x00000000c040c000, + 0x0000000302030000, 0x0000000705070000, 0x0000000e0a0e0000, 0x0000001c141c0000, + 0x0000003828380000, 0x0000007050700000, 0x000000e0a0e00000, 0x000000c040c00000, + 0x0000030203000000, 0x0000070507000000, 0x00000e0a0e000000, 0x00001c141c000000, + 0x0000382838000000, 0x0000705070000000, 0x0000e0a0e0000000, 0x0000c040c0000000, + 0x0003020300000000, 0x0007050700000000, 0x000e0a0e00000000, 0x001c141c00000000, + 0x0038283800000000, 0x0070507000000000, 0x00e0a0e000000000, 0x00c040c000000000, + 0x0302030000000000, 0x0705070000000000, 0x0e0a0e0000000000, 0x1c141c0000000000, + 0x3828380000000000, 0x7050700000000000, 0xe0a0e00000000000, 0xc040c00000000000, + 0x0203000000000000, 0x0507000000000000, 0x0a0e000000000000, 0x141c000000000000, 0x2838000000000000, 0x5070000000000000, 0xa0e0000000000000, 0x40c0000000000000, ]; #[rustfmt::skip] const KNIGHT_MOVES_TABLE: [u64; Square::N] = [ - 0x0000000000020400, 0x0000000000050800, 0x00000000000a1100, 0x0000000000142200, - 0x0000000000284400, 0x0000000000508800, 0x0000000000a01000, 0x0000000000402000, - 0x0000000002040004, 0x0000000005080008, 0x000000000a110011, 0x0000000014220022, - 0x0000000028440044, 0x0000000050880088, 0x00000000a0100010, 0x0000000040200020, - 0x0000000204000402, 0x0000000508000805, 0x0000000a1100110a, 0x0000001422002214, - 0x0000002844004428, 0x0000005088008850, 0x000000a0100010a0, 0x0000004020002040, - 0x0000020400040200, 0x0000050800080500, 0x00000a1100110a00, 0x0000142200221400, - 0x0000284400442800, 0x0000508800885000, 0x0000a0100010a000, 0x0000402000204000, - 0x0002040004020000, 0x0005080008050000, 0x000a1100110a0000, 0x0014220022140000, - 0x0028440044280000, 0x0050880088500000, 0x00a0100010a00000, 0x0040200020400000, - 0x0204000402000000, 0x0508000805000000, 0x0a1100110a000000, 0x1422002214000000, - 0x2844004428000000, 0x5088008850000000, 0xa0100010a0000000, 0x4020002040000000, - 0x0400040200000000, 0x0800080500000000, 0x1100110a00000000, 0x2200221400000000, - 0x4400442800000000, 0x8800885000000000, 0x100010a000000000, 0x2000204000000000, - 0x0004020000000000, 0x0008050000000000, 0x00110a0000000000, 0x0022140000000000, - 0x0044280000000000, 0x0088500000000000, 0x0010a00000000000, 0x0020400000000000, + 0x0000000000020400, 0x0000000000050800, 0x00000000000a1100, 0x0000000000142200, + 0x0000000000284400, 0x0000000000508800, 0x0000000000a01000, 0x0000000000402000, + 0x0000000002040004, 0x0000000005080008, 0x000000000a110011, 0x0000000014220022, + 0x0000000028440044, 0x0000000050880088, 0x00000000a0100010, 0x0000000040200020, + 0x0000000204000402, 0x0000000508000805, 0x0000000a1100110a, 0x0000001422002214, + 0x0000002844004428, 0x0000005088008850, 0x000000a0100010a0, 0x0000004020002040, + 0x0000020400040200, 0x0000050800080500, 0x00000a1100110a00, 0x0000142200221400, + 0x0000284400442800, 0x0000508800885000, 0x0000a0100010a000, 0x0000402000204000, + 0x0002040004020000, 0x0005080008050000, 0x000a1100110a0000, 0x0014220022140000, + 0x0028440044280000, 0x0050880088500000, 0x00a0100010a00000, 0x0040200020400000, + 0x0204000402000000, 0x0508000805000000, 0x0a1100110a000000, 0x1422002214000000, + 0x2844004428000000, 0x5088008850000000, 0xa0100010a0000000, 0x4020002040000000, + 0x0400040200000000, 0x0800080500000000, 0x1100110a00000000, 0x2200221400000000, + 0x4400442800000000, 0x8800885000000000, 0x100010a000000000, 0x2000204000000000, + 0x0004020000000000, 0x0008050000000000, 0x00110a0000000000, 0x0022140000000000, + 0x0044280000000000, 0x0088500000000000, 0x0010a00000000000, 0x0020400000000000, ]; #[rustfmt::skip] const PAWN_ATTACKS_TABLE: [[u64; Square::N]; Color::N] = [ [ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000002, 0x0000000000000005, 0x000000000000000a, 0x0000000000000014, - 0x0000000000000028, 0x0000000000000050, 0x00000000000000a0, 0x0000000000000040, - 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, - 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, - 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, - 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, - 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, - 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, - 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, - 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, - 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, - 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, - 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, - 0x0028000000000000, 0x0050000000000000, 0x00a0000000000000, 0x0040000000000000, + 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, + 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, + 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, + 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, + 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, + 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, + 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, + 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, + 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, + 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, + 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, + 0x0028000000000000, 0x0050000000000000, 0x00a0000000000000, 0x0040000000000000, + 0x0200000000000000, 0x0500000000000000, 0x0a00000000000000, 0x1400000000000000, + 0x2800000000000000, 0x5000000000000000, 0xa000000000000000, 0x4000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], [ - 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, - 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, - 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, - 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, - 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, - 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, - 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, - 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, - 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, - 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, - 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000002, 0x0000000000000005, 0x000000000000000a, 0x0000000000000014, + 0x0000000000000028, 0x0000000000000050, 0x00000000000000a0, 0x0000000000000040, + 0x0000000000000200, 0x0000000000000500, 0x0000000000000a00, 0x0000000000001400, + 0x0000000000002800, 0x0000000000005000, 0x000000000000a000, 0x0000000000004000, + 0x0000000000020000, 0x0000000000050000, 0x00000000000a0000, 0x0000000000140000, + 0x0000000000280000, 0x0000000000500000, 0x0000000000a00000, 0x0000000000400000, + 0x0000000002000000, 0x0000000005000000, 0x000000000a000000, 0x0000000014000000, + 0x0000000028000000, 0x0000000050000000, 0x00000000a0000000, 0x0000000040000000, + 0x0000000200000000, 0x0000000500000000, 0x0000000a00000000, 0x0000001400000000, + 0x0000002800000000, 0x0000005000000000, 0x000000a000000000, 0x0000004000000000, + 0x0000020000000000, 0x0000050000000000, 0x00000a0000000000, 0x0000140000000000, + 0x0000280000000000, 0x0000500000000000, 0x0000a00000000000, 0x0000400000000000, + 0x0002000000000000, 0x0005000000000000, 0x000a000000000000, 0x0014000000000000, 0x0028000000000000, 0x0050000000000000, 0x00a0000000000000, 0x0040000000000000, - 0x0200000000000000, 0x0500000000000000, 0x0a00000000000000, 0x1400000000000000, - 0x2800000000000000, 0x5000000000000000, 0xa000000000000000, 0x4000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], ]; diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index 6bc4ded..5d64839 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -57,11 +57,11 @@ impl Square { } pub fn diagonal(self) -> usize { - 14 - self.rank() as usize - self.file() as usize + 7 + self.rank() as usize - self.file() as usize } pub fn anti_diagonal(self) -> usize { - 7 - self.rank() as usize + self.file() as usize + self.rank() as usize + self.file() as usize } } diff --git a/games/src/interface/mod.rs b/games/src/interface/mod.rs index 463de2b..af09e3d 100644 --- a/games/src/interface/mod.rs +++ b/games/src/interface/mod.rs @@ -244,7 +244,7 @@ macro_rules! bitboard_type { impl From<$sq> for $name { #[must_use] fn from(square: $sq) -> Self { - Self(1 << square as u64) + Self($typ::from(1u8) << $typ::from(u8::from(square))) } } From 6cf043d32244c0571cb028995c7bddbcfb6c161e Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 27 Nov 2024 18:07:32 +0530 Subject: [PATCH 09/27] a bunch of fixes; finally perft without crashes --- games/src/chess/movegen.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 0e62a70..4857cb8 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -177,16 +177,22 @@ impl<'a> MoveGenerationInfo<'a> { fn attacked(&self, sq: Square) -> bool { let stm = self.position.side_to_move(); - let p = self.friends & self.position.piece_bb(Piece::Pawn); - let n = self.friends & self.position.piece_bb(Piece::Knight); - let b = self.friends & self.position.piece_bb(Piece::Bishop); - let r = self.friends & self.position.piece_bb(Piece::Rook); - let q = self.friends & self.position.piece_bb(Piece::Queen); + let p = self.enemies & self.position.piece_bb(Piece::Pawn); + let n = self.enemies & self.position.piece_bb(Piece::Knight); + let b = self.enemies & self.position.piece_bb(Piece::Bishop); + let r = self.enemies & self.position.piece_bb(Piece::Rook); + let q = self.enemies & self.position.piece_bb(Piece::Queen); - !(p.is_disjoint(moves::pawn_attacks(sq, !stm)) + !(p.is_disjoint(moves::pawn_attacks(sq, stm)) && n.is_disjoint(moves::knight(sq)) - && (b | q).is_disjoint(moves::bishop(sq, self.blocker)) - && (r | q).is_disjoint(moves::rook(sq, self.blocker))) + && (b | q).is_disjoint(moves::bishop( + sq, + self.blocker ^ BitBoard::from(self.king), + )) + && (r | q).is_disjoint(moves::rook( + sq, + self.blocker ^ BitBoard::from(self.king), + ))) } } @@ -275,6 +281,8 @@ impl<'a> MoveGenerationInfo<'a> { let unpinned = bishops ^ pinned; for bishop in unpinned { + // println!("{}", self.blocker); + // println!("{}\n{}", bishop, moves::bishop(bishop, self.blocker)); self.serialize( bishop, moves::bishop(bishop, self.blocker), @@ -331,7 +339,7 @@ impl<'a> MoveGenerationInfo<'a> { let pinmasks = Self::generate_pinmasks(position, king); let friends = position.color_bb(position.side_to_move()); - let enemies = position.color_bb(position.side_to_move()); + let enemies = position.color_bb(!position.side_to_move()); let blocker = friends | enemies; let territory = !friends; From da330461153762ae6f1f0e877fd6016e6145eb79 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 27 Nov 2024 18:20:45 +0530 Subject: [PATCH 10/27] chore: add double push support --- games/src/chess/bitboard.rs | 2 ++ games/src/chess/movegen.rs | 20 ++++++++++++++++---- games/src/chess/square.rs | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/games/src/chess/bitboard.rs b/games/src/chess/bitboard.rs index f4e711c..d01d9c1 100644 --- a/games/src/chess/bitboard.rs +++ b/games/src/chess/bitboard.rs @@ -41,6 +41,8 @@ impl BitBoard { match dir { Direction::North => self.north(), Direction::South => self.south(), + Direction::NorthNorth => self.north().north(), + Direction::SouthSouth => self.south().south(), Direction::East => self.east(), Direction::West => self.west(), Direction::NorthEast => self.north().east(), diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 4857cb8..7307aff 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -1,10 +1,10 @@ use crate::interface::{ - BitBoardType, ColoredPieceType, MoveStore, PositionType, + BitBoardType, Color, ColoredPieceType, MoveStore, PositionType, }; use super::{ moves, BitBoard, ColoredPiece, Direction, Move, MoveFlag, Piece, Position, - Square, + Rank, Square, }; pub struct MoveGenerationInfo<'a> { @@ -202,6 +202,11 @@ impl<'a> MoveGenerationInfo<'a> { let ue = up + Direction::East; let uw = up + Direction::West; + let third_rank = match self.position.side_to_move() { + Color::::White => BitBoard::rank(Rank::Third), + Color::::Black => BitBoard::rank(Rank::Sixth), + }; + let pawns = self.position.piece_bb(Piece::Pawn) & self.friends; { @@ -246,6 +251,8 @@ impl<'a> MoveGenerationInfo<'a> { let single_pushes = (pinned_single_push & self.pinmask_l) | unpinned_single_push; + let double_pushes = + (single_pushes & third_rank).shift(up) - self.blocker; self.serialize_towards( up, @@ -253,6 +260,13 @@ impl<'a> MoveGenerationInfo<'a> { single_pushes, movelist, ); + + self.serialize_towards( + up + up, + MoveFlag::DoublePush, + double_pushes, + movelist, + ); } } @@ -281,8 +295,6 @@ impl<'a> MoveGenerationInfo<'a> { let unpinned = bishops ^ pinned; for bishop in unpinned { - // println!("{}", self.blocker); - // println!("{}\n{}", bishop, moves::bishop(bishop, self.blocker)); self.serialize( bishop, moves::bishop(bishop, self.blocker), diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index 5d64839..e5b6dd8 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -85,6 +85,9 @@ pub enum Direction { North = 8, South = -8, + NorthNorth = 8 + 8, + SouthSouth = -8 - 8, + East = 1, West = -1, From ff4515558fdc700190fae5cbf5deaf4e8ec708f4 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 27 Nov 2024 18:28:46 +0530 Subject: [PATCH 11/27] chore: movegen promotions --- games/src/chess/movegen.rs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 7307aff..317f4e5 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -52,14 +52,29 @@ impl<'a> MoveGenerationInfo<'a> { } } - fn serialize_promotions>( + fn serialize_pawn_moves>( &self, offset: Direction, targets: BitBoard, movelist: &mut ML, ) { + let last_rank = match self.position.side_to_move() { + Color::::White => BitBoard::rank(Rank::Eighth), + Color::::Black => BitBoard::rank(Rank::First), + }; + let targets = targets & self.checkmask & self.territory; - for target in targets { + + let non_promotions = targets - last_rank; + self.serialize_towards( + offset, + MoveFlag::Normal, + non_promotions, + movelist, + ); + + let promotions = targets & last_rank; + for target in promotions { movelist.push(Move::new( target.shift(-offset), target, @@ -225,15 +240,13 @@ impl<'a> MoveGenerationInfo<'a> { let attacks_west = (pinned_attacks_west & self.pinmask_d) | unpinned_attacks_west; - self.serialize_towards( + self.serialize_pawn_moves( ue, - MoveFlag::Normal, attacks_east & self.enemies, movelist, ); - self.serialize_towards( + self.serialize_pawn_moves( uw, - MoveFlag::Normal, attacks_west & self.enemies, movelist, ); @@ -254,12 +267,7 @@ impl<'a> MoveGenerationInfo<'a> { let double_pushes = (single_pushes & third_rank).shift(up) - self.blocker; - self.serialize_towards( - up, - MoveFlag::Normal, - single_pushes, - movelist, - ); + self.serialize_pawn_moves(up, single_pushes, movelist); self.serialize_towards( up + up, From e6f2b44779ca4e747f85ee21f3b2cf719811a82b Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Wed, 27 Nov 2024 18:29:30 +0530 Subject: [PATCH 12/27] chore: remove some debug stuff --- games/src/chess/movegen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 317f4e5..b4b79d6 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -352,7 +352,7 @@ impl<'a> MoveGenerationInfo<'a> { position.side_to_move(), )) .next() - .unwrap_or_else(|| panic!("{}", position)) + .unwrap_unchecked() }; let checkers = Self::generate_checkers(position, king); let checkmask = Self::generate_checkmask(position, checkers, king); From 2c3169d977d76843d8a521cb40d50d84b31ad3ec Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 6 Dec 2024 20:54:38 +0530 Subject: [PATCH 13/27] chore: macros for creating Set types --- games/src/ataxx/piece.rs | 1 - games/src/ataxx/position.rs | 2 +- games/src/ataxx/square.rs | 2 - games/src/chess/castling.rs | 195 ++++++++++++++------------------ games/src/chess/color.rs | 1 - games/src/chess/move.rs | 17 ++- games/src/chess/movegen.rs | 48 +++++++- games/src/chess/position.rs | 11 +- games/src/chess/square.rs | 2 +- games/src/chess/zobrist.rs | 2 +- games/src/interface/bitboard.rs | 95 +--------------- games/src/interface/mod.rs | 68 ++++++----- games/src/interface/set.rs | 98 ++++++++++++++++ 13 files changed, 294 insertions(+), 248 deletions(-) create mode 100644 games/src/interface/set.rs diff --git a/games/src/ataxx/piece.rs b/games/src/ataxx/piece.rs index 99b6098..5209e54 100644 --- a/games/src/ataxx/piece.rs +++ b/games/src/ataxx/piece.rs @@ -11,7 +11,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::fmt; use std::ops; use crate::interface::representable_type; diff --git a/games/src/ataxx/position.rs b/games/src/ataxx/position.rs index c821fd9..602ddb9 100644 --- a/games/src/ataxx/position.rs +++ b/games/src/ataxx/position.rs @@ -22,7 +22,7 @@ use crate::interface; use crate::interface::PiecePlacementParseError; use crate::interface::PositionType; use crate::interface::TypeParseError; -use crate::interface::{BitBoardType, Hash, RepresentableType, SquareType}; +use crate::interface::{Hash, RepresentableType, SetType, SquareType}; use thiserror::Error; diff --git a/games/src/ataxx/square.rs b/games/src/ataxx/square.rs index 80b97c0..38b75d3 100644 --- a/games/src/ataxx/square.rs +++ b/games/src/ataxx/square.rs @@ -11,8 +11,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::fmt; - use crate::interface::{representable_type, RepresentableType, SquareType}; representable_type!( diff --git a/games/src/chess/castling.rs b/games/src/chess/castling.rs index aecd9c6..6723544 100644 --- a/games/src/chess/castling.rs +++ b/games/src/chess/castling.rs @@ -10,123 +10,69 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - -use crate::interface::{BitBoardType, RepresentableType, SquareType}; +use crate::interface::{ + representable_type, set_type, RepresentableType, SetType, SquareType, +}; use super::{BitBoard, Color, File, Rank, Square}; -use std::ops; -#[derive(Copy, Clone, PartialEq, Eq, Default)] -pub struct Rights(pub u8); +set_type!(Rights: u8); impl Rights { - pub const N: usize = 16; - - pub const WH: Rights = - Rights(SideColor(Color::White, Side::H).bit_offset() as u8); - pub const WA: Rights = - Rights(SideColor(Color::White, Side::A).bit_offset() as u8); - pub const BH: Rights = - Rights(SideColor(Color::Black, Side::H).bit_offset() as u8); - pub const BA: Rights = - Rights(SideColor(Color::Black, Side::A).bit_offset() as u8); - - pub fn has(self, side: SideColor) -> bool { - self.0 >> side.bit_offset() & 1 != 0 - } -} - -impl From for Rights { - fn from(color: Color) -> Self { - Rights((1 << (4 + 1)) << color as u16) - } -} - -#[allow(clippy::suspicious_arithmetic_impl)] -impl ops::Add for Rights { - type Output = Rights; - - fn add(self, rhs: Self) -> Self::Output { - Rights(self.0 | rhs.0) - } -} - -impl ops::Sub for Rights { - type Output = Rights; - - fn sub(self, rhs: Self) -> Self::Output { - Rights(self.0 & !rhs.0) - } + pub const WH: Rights = Rights(Dimension::WhiteH as u8); + pub const WA: Rights = Rights(Dimension::WhiteA as u8); + pub const BH: Rights = Rights(Dimension::BlackH as u8); + pub const BA: Rights = Rights(Dimension::BlackA as u8); } -impl ops::SubAssign for Rights { - fn sub_assign(&mut self, rhs: Self) { - self.0 &= !rhs.0 +representable_type!( + enum Dimension: u8 { + WhiteH "H", WhiteA "A", + BlackH "h", BlackA "a", } -} +); -impl ops::Add for Rights { - type Output = Rights; - - fn add(self, rhs: SideColor) -> Self::Output { - Rights(self.0 | 1 << rhs.bit_offset()) - } -} - -impl ops::Sub for Rights { - type Output = Rights; +impl Dimension { + pub const N: usize = 4; - fn sub(self, rhs: SideColor) -> Self::Output { - Rights(self.0 & !(1 << rhs.bit_offset())) + pub fn from(color: Color, side: Side) -> Dimension { + unsafe { + Dimension::unsafe_from(color as usize * Color::N + side as usize) + } } -} - -#[allow(clippy::suspicious_arithmetic_impl)] -impl ops::Add for Rights { - type Output = Rights; - fn add(self, rhs: Color) -> Self::Output { - Rights(self.0 | Rights::from(rhs).0) + pub const fn color(self) -> Color { + match self { + Dimension::WhiteH | Dimension::WhiteA => Color::White, + Dimension::BlackH | Dimension::BlackA => Color::Black, + } } -} -impl ops::Sub for Rights { - type Output = Rights; - - fn sub(self, rhs: Color) -> Self::Output { - Rights(self.0 & !Rights::from(rhs).0) + pub const fn side(self) -> Side { + match self { + Dimension::WhiteH | Dimension::BlackH => Side::H, + Dimension::WhiteA | Dimension::BlackA => Side::A, + } } -} - -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct SideColor(pub Color, pub Side); - -impl SideColor { - pub const N: usize = 4; - pub fn from_sqs(king_sq: Square, rook_sq: Square) -> SideColor { + pub fn from_sqs(king_sq: Square, rook_sq: Square) -> Dimension { let color: Color = if king_sq.rank() == Rank::First { Color::White } else { Color::Black }; - SideColor(color, Side::from_sqs(king_sq, rook_sq)) + Dimension::from(color, Side::from_sqs(king_sq, rook_sq)) } pub fn get_targets(self) -> (Square, Square) { match self { - SideColor(Color::White, Side::H) => (Square::G1, Square::F1), - SideColor(Color::White, Side::A) => (Square::C1, Square::D1), - SideColor(Color::Black, Side::H) => (Square::G8, Square::F8), - SideColor(Color::Black, Side::A) => (Square::C8, Square::D8), + Dimension::WhiteH => (Square::G1, Square::F1), + Dimension::WhiteA => (Square::C1, Square::D1), + Dimension::BlackH => (Square::G8, Square::F8), + Dimension::BlackA => (Square::C8, Square::D8), } } - - const fn bit_offset(self) -> usize { - let SideColor(color, side) = self; - color as usize * Color::N + side as usize - } } #[derive(Copy, Clone, PartialEq, Eq)] @@ -148,31 +94,45 @@ impl Side { #[derive(Clone)] pub struct Info { pub rights: Rights, - rooks: [Square; SideColor::N], - paths: [BitBoard; SideColor::N], + rooks: [Square; Dimension::N], + attacks_mask: [BitBoard; Dimension::N], + blocker_mask: [BitBoard; Dimension::N], rights_masks: [Rights; Square::N], } -impl Info { - //pub fn from_pos_and_str() -> Info {} +mod ends { + use super::Square; + + pub const WHITE_KING_H: Square = Square::G1; + pub const WHITE_KING_A: Square = Square::C1; + pub const BLACK_KING_H: Square = Square::G8; + pub const BLACK_KING_A: Square = Square::C8; + + pub const WHITE_ROOK_H: Square = Square::F1; + pub const WHITE_ROOK_A: Square = Square::D1; + pub const BLACK_ROOK_H: Square = Square::F8; + pub const BLACK_ROOK_A: Square = Square::D8; +} +impl Info { #[rustfmt::skip] pub fn from_squares( w_king: Square, w_rook_h: File, w_rook_a: File, b_king: Square, b_rook_h: File, b_rook_a: File, ) -> Info { let mut info = Info { - rights: Rights(0), - rooks: [Square::A1; SideColor::N], - paths: [BitBoard::EMPTY; SideColor::N], - rights_masks: [Rights::default(); Square::N], + rights: Rights::WH, + rooks: [Square::A1; Dimension::N], + attacks_mask: [BitBoard::EMPTY; Dimension::N], + blocker_mask: [BitBoard::EMPTY; Dimension::N], + rights_masks: [Rights::new(); Square::N], }; // Get the bit offsets/indexes of each side-color. - let wh = SideColor(Color::White, Side::H).bit_offset(); - let wa = SideColor(Color::White, Side::A).bit_offset(); - let bh = SideColor(Color::Black, Side::H).bit_offset(); - let ba = SideColor(Color::Black, Side::A).bit_offset(); + let wh = Dimension::WhiteH as usize; + let wa = Dimension::WhiteA as usize; + let bh = Dimension::BlackH as usize; + let ba = Dimension::BlackA as usize; // Initialize the rook square table. info.rooks[wh] = Square::new(w_rook_h, Rank::First); @@ -181,14 +141,23 @@ impl Info { info.rooks[ba] = Square::new(b_rook_a, Rank::Eighth); // Initialize the castling path table. - info.paths[wh] = BitBoard::between(w_king, info.rooks[wh]) | BitBoard::from(w_king); - info.paths[wa] = BitBoard::between(w_king, info.rooks[wa]) | BitBoard::from(w_king); - info.paths[bh] = BitBoard::between(b_king, info.rooks[bh]) | BitBoard::from(b_king); - info.paths[ba] = BitBoard::between(b_king, info.rooks[ba]) | BitBoard::from(b_king); + info.attacks_mask[wh] = blocker_mask(w_king, info.rooks[wh], ends::WHITE_KING_H, ends::WHITE_ROOK_H); + info.attacks_mask[wa] = blocker_mask(w_king, info.rooks[wa], ends::WHITE_KING_A, ends::WHITE_ROOK_A); + info.attacks_mask[bh] = blocker_mask(b_king, info.rooks[bh], ends::BLACK_KING_H, ends::BLACK_ROOK_H); + info.attacks_mask[ba] = blocker_mask(b_king, info.rooks[ba], ends::BLACK_KING_A, ends::BLACK_ROOK_A); + + info.blocker_mask[wh] = BitBoard::between2(w_king, ends::WHITE_KING_H); + info.blocker_mask[wa] = BitBoard::between2(w_king, ends::WHITE_KING_A); + info.blocker_mask[bh] = BitBoard::between2(b_king, ends::BLACK_KING_H); + info.blocker_mask[ba] = BitBoard::between2(b_king, ends::BLACK_KING_A); + + fn blocker_mask(king: Square, rook: Square, king_end: Square, rook_end: Square) -> BitBoard { + (BitBoard::between2(king, king_end) | BitBoard::between2(rook, rook_end)) - (BitBoard::from(king) | BitBoard::from(rook)) + } // Initialize the rights update for the king's squares. - info.rights_masks[w_king as usize] = Rights::WH + Rights::WA; - info.rights_masks[b_king as usize] = Rights::BH + Rights::BA; + info.rights_masks[w_king as usize] = Rights::WH | Rights::WA; + info.rights_masks[b_king as usize] = Rights::BH | Rights::BA; // Initialize the rights update for the rook's squares. info.rights_masks[w_rook_h as usize] = Rights::WH; @@ -203,11 +172,15 @@ impl Info { self.rights_masks[square as usize] } - pub fn rook(&self, side: SideColor) -> Square { - self.rooks[side.bit_offset()] + pub fn rook(&self, side: Dimension) -> Square { + self.rooks[side as usize] + } + + pub fn attack_mask(&self, side: Dimension) -> BitBoard { + self.attacks_mask[side as usize] } - pub fn path(&self, side: SideColor) -> BitBoard { - self.paths[side.bit_offset()] + pub fn blocker_mask(&self, side: Dimension) -> BitBoard { + self.blocker_mask[side as usize] } } diff --git a/games/src/chess/color.rs b/games/src/chess/color.rs index 8ac3100..e0ad075 100644 --- a/games/src/chess/color.rs +++ b/games/src/chess/color.rs @@ -11,7 +11,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::fmt; use std::ops; use crate::interface::representable_type; diff --git a/games/src/chess/move.rs b/games/src/chess/move.rs index c1bfd89..818f147 100644 --- a/games/src/chess/move.rs +++ b/games/src/chess/move.rs @@ -18,7 +18,7 @@ use crate::{ interface::{representable_type, MoveType, RepresentableType}, }; -use super::Piece; +use super::{castling, Piece}; #[derive(Copy, Clone, PartialEq, Default)] pub struct Move(u16); @@ -76,6 +76,21 @@ impl Move { ) } + pub fn new_castling( + king: chess::Square, + rook: chess::Square, + side: castling::Side, + ) -> Move { + Self::new( + king, + rook, + match side { + castling::Side::H => MoveFlag::CastleHSide, + castling::Side::A => MoveFlag::CastleASide, + }, + ) + } + pub fn new_with_promotion( source: chess::Square, target: chess::Square, diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index b4b79d6..30b17ce 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -1,10 +1,10 @@ use crate::interface::{ - BitBoardType, Color, ColoredPieceType, MoveStore, PositionType, + BitBoardType, Color, ColoredPieceType, MoveStore, PositionType, SetType, }; use super::{ - moves, BitBoard, ColoredPiece, Direction, Move, MoveFlag, Piece, Position, - Rank, Square, + castling, moves, BitBoard, ColoredPiece, Direction, Move, MoveFlag, Piece, + Position, Rank, Square, }; pub struct MoveGenerationInfo<'a> { @@ -209,6 +209,16 @@ impl<'a> MoveGenerationInfo<'a> { self.blocker ^ BitBoard::from(self.king), ))) } + + fn any_attacked(&self, bb: BitBoard) -> bool { + for target in bb { + if self.attacked(target) { + return true; + } + } + + false + } } impl<'a> MoveGenerationInfo<'a> { @@ -341,6 +351,33 @@ impl<'a> MoveGenerationInfo<'a> { } } } + + fn castling_move>( + &self, + side: castling::Side, + movelist: &mut ML, + ) { + let dimension = + castling::Dimension::from(self.position.side_to_move(), side); + println!( + "Has rights: {}", + self.position.castling.rights.contains(dimension) + ); + + let rook = self.position.castling.rook(dimension); + + if self.position.castling.rights.contains(dimension) + &&!self.pinmask_l.contains(rook) + // Castling path blockers + && self + .blocker + .is_disjoint(self.position.castling.blocker_mask(dimension)) + // Castling path attackers + && !self.any_attacked(self.position.castling.attack_mask(dimension)) + { + movelist.push(Move::new_castling(self.king, rook, side)) + } + } } impl<'a> MoveGenerationInfo<'a> { @@ -388,6 +425,11 @@ impl<'a> MoveGenerationInfo<'a> { self.knight_moves(movelist); self.bishop_moves(movelist); self.rook_moves(movelist); + + if checker_num == 0 { + self.castling_move(castling::Side::H, movelist); + self.castling_move(castling::Side::A, movelist); + } } } } diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index f701b9d..a893f2b 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -22,7 +22,7 @@ use crate::interface::ColoredPieceType; use crate::interface::PiecePlacementParseError; use crate::interface::PositionType; use crate::interface::TypeParseError; -use crate::interface::{BitBoardType, Hash, RepresentableType, SquareType}; +use crate::interface::{Hash, RepresentableType, SetType, SquareType}; use thiserror::Error; @@ -57,7 +57,7 @@ pub struct Position { #[allow(dead_code)] is_fischer_random: bool, #[allow(dead_code)] - castling_square_info: castling::Info, + pub castling: castling::Info, checksum: Hash, } @@ -135,9 +135,8 @@ impl PositionType for Position { board.insert(m.target(), source_pc); } - board.castling_square_info.rights -= - board.castling_square_info.get_updates(m.source()) - + board.castling_square_info.get_updates(m.target()); + board.castling.rights -= board.castling.get_updates(m.source()) + | board.castling.get_updates(m.target()); if source_pc.piece() == Piece::Pawn || target_pc.is_some() { board.half_move_clock = 0; @@ -231,7 +230,7 @@ impl FromStr for Position { half_move_clock: 0, en_passant_target: None, is_fischer_random: false, - castling_square_info: castling::Info::from_squares( + castling: castling::Info::from_squares( Square::E1, File::H, File::A, diff --git a/games/src/chess/square.rs b/games/src/chess/square.rs index e5b6dd8..fc5c06d 100644 --- a/games/src/chess/square.rs +++ b/games/src/chess/square.rs @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{fmt, ops}; +use std::ops; use crate::interface::{representable_type, RepresentableType, SquareType}; diff --git a/games/src/chess/zobrist.rs b/games/src/chess/zobrist.rs index d80a743..a379130 100644 --- a/games/src/chess/zobrist.rs +++ b/games/src/chess/zobrist.rs @@ -63,7 +63,7 @@ const CASTLE_WA: u64 = 0xdfe34de8892603ad; const CASTLE_BH: u64 = 0x177ab8314c2b200e; const CASTLE_BA: u64 = 0xc07e0a697776ea93; -const CASTLING_RIGHTS_KEYS: [u64; castling::Rights::N] = [ +const CASTLING_RIGHTS_KEYS: [u64; 1 << castling::Dimension::N] = [ 0, CASTLE_WH, CASTLE_WA, diff --git a/games/src/interface/bitboard.rs b/games/src/interface/bitboard.rs index f48e25f..30f8482 100644 --- a/games/src/interface/bitboard.rs +++ b/games/src/interface/bitboard.rs @@ -1,25 +1,11 @@ use num_traits::int::PrimInt; -use std::ops::{BitAnd, BitOr, BitXor, Not, Shl, Shr, Sub}; -use super::{RepresentableType, SquareType}; +use super::{RepresentableType, SetType, SquareType}; /// BitBoardType is a generalized interface implemented by BitBoards of /// arbitrary size. This allows programs to handle BitBoards of any size with /// generic functions using this common interface. -pub trait BitBoardType: - Sized - + Copy - + Eq - + Into - + From - + Not - + Sub - + Shr - + Shl - + BitOr - + BitAnd - + BitXor - + Iterator +pub trait BitBoardType: SetType where Self::Base: PrimInt, Self::Square: SquareType, @@ -29,61 +15,11 @@ where /// The type of the Squares in the BitBoard. type Square; - /// The null/empty set containing no squares. - const EMPTY: Self; - - /// The universal set containing all squares. - const UNIVERSE: Self; - /// The BitBoard containing Squares in the first File. const FIRST_FILE: Self; /// The BitBoard containing Squares in the first Rank. const FIRST_RANK: Self; - /// Makes a new, empty `BitBoard`. - fn new() -> Self { - Self::EMPTY - } - - /// Returns `true` if `self` has no elements in `common` with other. This is - /// equivalent to checking for an empty intersection. - #[must_use] - fn is_disjoint(self, other: Self) -> bool { - (self & other).is_empty() - } - - /// Returns true if the BitBoard is a subset of another, i.e., `other` - /// contains at least all the values in `self`. - #[must_use] - fn is_subset(self, other: Self) -> bool { - (other & !self).is_empty() - } - - /// Returns true if the BitBoard is a superset of another, i.e., `self` - /// contains at least all the values in `other`. - #[must_use] - fn is_superset(self, other: Self) -> bool { - other.is_subset(self) - } - - /// Returns `true` if the BitBoard contains no elements. - #[must_use] - fn is_empty(self) -> bool { - self == Self::EMPTY - } - - /// Returns the number of elements in the BitBoard. - #[must_use] - fn len(self) -> usize { - self.into().count_ones() as usize - } - - /// Returns `true` if the BitBoard contains a value. - #[must_use] - fn contains(self, square: Self::Square) -> bool { - !(self & Self::from(square)).is_empty() - } - /// north returns a new Self with all the squares shifted to the north. #[must_use] fn north(self) -> Self { @@ -120,33 +56,6 @@ where }) } - /// Adds `square` to the BitBoard. - fn insert(&mut self, square: Self::Square) { - *self = *self | Self::from(square) - } - - /// Removes `square` from the BitBoard. - fn remove(&mut self, square: Self::Square) { - *self = *self & !Self::from(square) - } - - /// Clears the BitBoard, removing all elements. - fn clear(&mut self) { - *self = Self::EMPTY - } - - /// Retains only the elements specified by the predicate. - /// - /// In other words, remove all elements `s` for which `f(s)` returns `false`. - /// The elements are visited in ascending order. - fn retain bool>(&mut self, mut f: F) { - for sq in *self { - if !f(sq) { - self.remove(sq) - } - } - } - /// Returns a BitBoard containing all the squares from the given `File`. #[must_use] fn file(file: ::File) -> Self { diff --git a/games/src/interface/mod.rs b/games/src/interface/mod.rs index af09e3d..81e7343 100644 --- a/games/src/interface/mod.rs +++ b/games/src/interface/mod.rs @@ -16,6 +16,7 @@ mod hash; mod r#move; mod piece; mod position; +mod set; mod square; pub use bitboard::*; @@ -23,6 +24,7 @@ pub use hash::*; pub use piece::*; pub use position::*; pub use r#move::*; +pub use set::*; pub use square::*; pub type BitBoard

=

::BitBoard; @@ -122,8 +124,8 @@ macro_rules! representable_type { } } - impl fmt::Display for $type { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { + impl std::fmt::Display for $type { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match *self { $(Self::$variant => write!(f, "{}", $repr),)* } @@ -153,14 +155,8 @@ pub(crate) use representable_type; /// } /// } /// ``` -macro_rules! bitboard_type { - ($(#[doc = $doc:expr])* struct $name:tt : $typ:tt { - Square = $sq:tt; - Empty = $empty:expr; - Universe = $universe:expr; - FirstFile = $first_file:expr; - FirstRank = $first_rank:expr; - } ) => { +macro_rules! set_type { + ($(#[doc = $doc:expr])* $name:tt<$sq:tt>: $typ:tt) => { $(#[doc = $doc])* #[derive( Copy, @@ -182,14 +178,12 @@ macro_rules! bitboard_type { )] pub struct $name(pub $typ); - impl crate::interface::BitBoardType for $name { - type Base = $typ; - type Square = $sq; - - const EMPTY: Self = $empty; - const UNIVERSE: Self = $universe; - const FIRST_FILE: Self = $first_file; - const FIRST_RANK: Self = $first_rank; + impl crate::interface::SetType<$typ, $sq> for $name { + const EMPTY: Self = Self(0); + const UNIVERSE: Self = Self(match (1 as $typ).checked_shl(<$sq as $crate::interface::RepresentableType<_>>::N as u32) { + Some(universe) => universe, + None => (-1i8) as $typ, + }); } impl Iterator for $name { @@ -197,19 +191,19 @@ macro_rules! bitboard_type { /// next pops the next Square from the BitBoard and returns it. fn next(&mut self) -> Option { - let lsb = if self.is_empty() { + let lsb = if crate::interface::SetType::<$typ, $sq>::is_empty(*self) { None } else { - let sq = ::Base>>::into( + let sq = >::into( *self, ) .trailing_zeros() as usize; Some(unsafe { - ::Square::unsafe_from(sq) + $sq::unsafe_from(sq) }) }; - if !self.is_empty() { + if !crate::interface::SetType::<$typ, $sq>::is_empty(*self) { let copy = *self; *self = copy & (copy - 1); } @@ -223,7 +217,7 @@ macro_rules! bitboard_type { #[must_use] fn sub(self, rhs: usize) -> Self::Output { - Self(self.0 - rhs as u64) + Self(self.0 - rhs as $typ) } } @@ -256,7 +250,7 @@ macro_rules! bitboard_type { fn not(self) -> Self::Output { // ! will set the unused bits so remove them with an &. Self(!self.0) - & ::UNIVERSE + & >::UNIVERSE } } @@ -291,6 +285,28 @@ macro_rules! bitboard_type { self & !Self::from(rhs) } } + }; +} + +pub(crate) use set_type; + +macro_rules! bitboard_type { + ($(#[doc = $doc:expr])* struct $name:tt : $typ:tt { + Square = $sq:tt; + Empty = $empty:expr; + Universe = $universe:expr; + FirstFile = $first_file:expr; + FirstRank = $first_rank:expr; + }) => { + crate::interface::set_type!($name<$sq>: $typ); + + impl crate::interface::BitBoardType for $name { + type Base = $typ; + type Square = $sq; + + const FIRST_FILE: Self = $first_file; + const FIRST_RANK: Self = $first_rank; + } // Display a bitboard as ASCII art with 0s and 1s. impl std::fmt::Display for $name { @@ -310,8 +326,7 @@ macro_rules! bitboard_type { { let square = <$sq as crate::interface::SquareType> ::new(file, rank); - string_rep += if crate::interface::BitBoardType - ::contains(*self, square) { + string_rep += if crate::interface::SetType::<$typ, $sq>::contains(*self, square) { "1 " } else { "0 " @@ -332,7 +347,6 @@ macro_rules! bitboard_type { } }; } - pub(crate) use bitboard_type; /// PositionParseErr represents an error encountered while parsing diff --git a/games/src/interface/set.rs b/games/src/interface/set.rs new file mode 100644 index 0000000..771ea0c --- /dev/null +++ b/games/src/interface/set.rs @@ -0,0 +1,98 @@ +use std::ops::{BitAnd, BitOr, BitXor, Not, Shl, Shr, Sub}; + +use super::RepresentableType; + +use num_traits::PrimInt; + +pub trait SetType>: + Sized + + Copy + + Eq + + Into + + From + + Not + + Sub + + Shr + + Shl + + BitOr + + BitAnd + + BitXor + + Iterator +{ + /// The null/empty set containing no elements. + const EMPTY: Self; + + /// The universal set containing all elements. + const UNIVERSE: Self; + + /// Makes a new, empty `BitBoard`. + fn new() -> Self { + Self::EMPTY + } + + /// Returns `true` if `self` has no elements in `common` with other. This is + /// equivalent to checking for an empty intersection. + #[must_use] + fn is_disjoint(self, other: Self) -> bool { + (self & other).is_empty() + } + + /// Returns true if the BitBoard is a subset of another, i.e., `other` + /// contains at least all the values in `self`. + #[must_use] + fn is_subset(self, other: Self) -> bool { + (other & !self).is_empty() + } + + /// Returns true if the BitBoard is a superset of another, i.e., `self` + /// contains at least all the values in `other`. + #[must_use] + fn is_superset(self, other: Self) -> bool { + other.is_subset(self) + } + + /// Returns `true` if the BitBoard contains no elements. + #[must_use] + fn is_empty(self) -> bool { + self == Self::EMPTY + } + + /// Returns the number of elements in the BitBoard. + #[must_use] + fn len(self) -> usize { + self.into().count_ones() as usize + } + + /// Returns `true` if the BitBoard contains a value. + #[must_use] + fn contains(self, square: E) -> bool { + !(self & Self::from(square)).is_empty() + } + + /// Adds `square` to the BitBoard. + fn insert(&mut self, square: E) { + *self = *self | Self::from(square) + } + + /// Removes `square` from the BitBoard. + fn remove(&mut self, square: E) { + *self = *self & !Self::from(square) + } + + /// Clears the BitBoard, removing all elements. + fn clear(&mut self) { + *self = Self::EMPTY + } + + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all elements `s` for which `f(s)` returns `false`. + /// The elements are visited in ascending order. + fn retain bool>(&mut self, mut f: F) { + for sq in *self { + if !f(sq) { + self.remove(sq) + } + } + } +} From 9808ee5d57b1cd8fe592a9018c8983c087c3b08e Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 6 Dec 2024 21:05:41 +0530 Subject: [PATCH 14/27] chore: fix some warnings --- games/src/chess/movegen.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 30b17ce..8f899d8 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -26,7 +26,7 @@ pub struct MoveGenerationInfo<'a> { pinmask_d: BitBoard, } -impl<'a> MoveGenerationInfo<'a> { +impl MoveGenerationInfo<'_> { fn serialize>( &self, source: Square, @@ -99,7 +99,7 @@ impl<'a> MoveGenerationInfo<'a> { } } -impl<'a> MoveGenerationInfo<'a> { +impl MoveGenerationInfo<'_> { fn generate_checkers(position: &Position, king: Square) -> BitBoard { let stm = position.side_to_move(); let xtm = !stm; @@ -221,7 +221,7 @@ impl<'a> MoveGenerationInfo<'a> { } } -impl<'a> MoveGenerationInfo<'a> { +impl MoveGenerationInfo<'_> { fn pawn_moves>(&self, movelist: &mut ML) { let up = Direction::up(self.position.side_to_move()); let ue = up + Direction::East; From fc11a2a294cc00e98f9c7aee0eed0678af02db68 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 6 Dec 2024 21:13:14 +0530 Subject: [PATCH 15/27] news: rak the idiot strikes again --- games/src/interface/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/interface/mod.rs b/games/src/interface/mod.rs index 81e7343..d3f4f90 100644 --- a/games/src/interface/mod.rs +++ b/games/src/interface/mod.rs @@ -181,7 +181,7 @@ macro_rules! set_type { impl crate::interface::SetType<$typ, $sq> for $name { const EMPTY: Self = Self(0); const UNIVERSE: Self = Self(match (1 as $typ).checked_shl(<$sq as $crate::interface::RepresentableType<_>>::N as u32) { - Some(universe) => universe, + Some(universe) => universe.wrapping_sub(1), None => (-1i8) as $typ, }); } From 8c0d5aae0206f7f050064cd48299166e62b17ec2 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 6 Dec 2024 21:35:58 +0530 Subject: [PATCH 16/27] chore: remove some debug stuff --- games/src/chess/movegen.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index 8f899d8..f86e552 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -359,21 +359,16 @@ impl MoveGenerationInfo<'_> { ) { let dimension = castling::Dimension::from(self.position.side_to_move(), side); - println!( - "Has rights: {}", - self.position.castling.rights.contains(dimension) - ); - let rook = self.position.castling.rook(dimension); if self.position.castling.rights.contains(dimension) - &&!self.pinmask_l.contains(rook) // Castling path blockers && self .blocker .is_disjoint(self.position.castling.blocker_mask(dimension)) // Castling path attackers && !self.any_attacked(self.position.castling.attack_mask(dimension)) + &&!self.pinmask_l.contains(rook) { movelist.push(Move::new_castling(self.king, rook, side)) } From 25ab5cd378ad251fa6949d206c7bfa7520bbbe77 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Fri, 6 Dec 2024 21:36:59 +0530 Subject: [PATCH 17/27] chore: start with all the rights --- games/src/chess/castling.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/chess/castling.rs b/games/src/chess/castling.rs index 6723544..819836c 100644 --- a/games/src/chess/castling.rs +++ b/games/src/chess/castling.rs @@ -121,7 +121,7 @@ impl Info { b_king: Square, b_rook_h: File, b_rook_a: File, ) -> Info { let mut info = Info { - rights: Rights::WH, + rights: Rights::UNIVERSE, rooks: [Square::A1; Dimension::N], attacks_mask: [BitBoard::EMPTY; Dimension::N], blocker_mask: [BitBoard::EMPTY; Dimension::N], From fdceb8b433a5e12be7d2c9e049144920fcc963d3 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Sun, 8 Dec 2024 23:21:39 +0530 Subject: [PATCH 18/27] chore: don't bulk count if the split flag is set --- games/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/src/lib.rs b/games/src/lib.rs index 57518c9..7779198 100644 --- a/games/src/lib.rs +++ b/games/src/lib.rs @@ -23,7 +23,7 @@ pub fn perft( ) -> u64 { // Bulk counting if enabled. Instead of calling make move and perft for each // move at depth 1, just return the number of legal moves, which is equivalent. - if BULK && depth == 1 { + if BULK && !SPLIT && depth == 1 { return position.count_moves::() as u64; } From 7edceed809cae0b1699caa181e51196496e77f16 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Sun, 8 Dec 2024 23:22:20 +0530 Subject: [PATCH 19/27] chore: almost complete en passant movegen --- games/src/chess/movegen.rs | 29 +++++++++++++++++++++++++++++ games/src/chess/position.rs | 13 ++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index f86e552..d9f75c3 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -260,6 +260,35 @@ impl MoveGenerationInfo<'_> { attacks_west & self.enemies, movelist, ); + + if let Some(target) = self.position.en_passant_target { + let mut passanters = attackers + & moves::pawn_attacks( + target, + !self.position.side_to_move(), + ); + + match passanters.len() { + 0 => {} + 1 => { + movelist.push(Move::new( + unsafe { passanters.next().unwrap_unchecked() }, + target, + MoveFlag::EnPassant, + )); + } + 2 => { + for passanter in passanters { + movelist.push(Move::new( + passanter, + target, + MoveFlag::EnPassant, + )); + } + } + _ => unreachable!(), + } + } } { diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index a893f2b..f053176 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -51,7 +51,7 @@ pub struct Position { half_move_clock: u8, #[allow(dead_code)] - en_passant_target: Option, + pub en_passant_target: Option, // Game metadata. #[allow(dead_code)] @@ -142,6 +142,8 @@ impl PositionType for Position { board.half_move_clock = 0; } + board.en_passant_target = None; + match m.flag() { MoveFlag::Normal => {} MoveFlag::NPromotion @@ -162,7 +164,7 @@ impl PositionType for Position { MoveFlag::DoublePush => { board.en_passant_target = Some(unsafe { m.target().down(board.side_to_move).unwrap_unchecked() - }) + }); } MoveFlag::CastleASide => {} MoveFlag::CastleHSide => {} @@ -170,7 +172,6 @@ impl PositionType for Position { board.half_move_clock += 1; board.side_to_move = !board.side_to_move; - board.en_passant_target = None; board } @@ -218,6 +219,7 @@ impl FromStr for Position { let pos = parts[0]; let stm = parts[1]; + let ept = parts[3]; let hmc = parts[4]; let fmc = parts[5]; @@ -243,6 +245,11 @@ impl FromStr for Position { interface::parse_piece_placement(&mut position, pos)?; position.side_to_move = Color::from_str(stm)?; + position.en_passant_target = if ept == "-" { + None + } else { + Some(Square::from_str(ept)?) + }; position.half_move_clock = hmc.parse::()?; position.ply_count = fmc.parse::()? * 2 - 1; if position.side_to_move == Color::Black { From 344f430b5fdbd8a9f367bbf01ec12e8100ccd17b Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Mon, 9 Dec 2024 00:23:53 +0530 Subject: [PATCH 20/27] chore: detect attacks from kings --- games/src/chess/movegen.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index d9f75c3..ab64320 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -197,6 +197,7 @@ impl MoveGenerationInfo<'_> { let b = self.enemies & self.position.piece_bb(Piece::Bishop); let r = self.enemies & self.position.piece_bb(Piece::Rook); let q = self.enemies & self.position.piece_bb(Piece::Queen); + let k = self.enemies & self.position.piece_bb(Piece::King); !(p.is_disjoint(moves::pawn_attacks(sq, stm)) && n.is_disjoint(moves::knight(sq)) @@ -207,7 +208,8 @@ impl MoveGenerationInfo<'_> { && (r | q).is_disjoint(moves::rook( sq, self.blocker ^ BitBoard::from(self.king), - ))) + )) + && k.is_disjoint(moves::king(sq))) } fn any_attacked(&self, bb: BitBoard) -> bool { From 3a00ecd6d6fe5ff7576ee6ca33ad5eaf0b8e6d7b Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Tue, 10 Dec 2024 13:43:24 +0530 Subject: [PATCH 21/27] chore: parse castling rights from fen --- games/src/chess/castling.rs | 127 +++- games/src/chess/mod.rs | 3 + games/src/chess/move.rs | 4 + games/src/chess/position.rs | 51 +- games/src/chess/tests/mod.rs | 1114 ++++++++++++++++++++++++++++++++++ games/src/interface/mod.rs | 9 +- 6 files changed, 1282 insertions(+), 26 deletions(-) create mode 100644 games/src/chess/tests/mod.rs diff --git a/games/src/chess/castling.rs b/games/src/chess/castling.rs index 819836c..f72edb3 100644 --- a/games/src/chess/castling.rs +++ b/games/src/chess/castling.rs @@ -10,21 +10,20 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + +use std::str::FromStr; + use crate::interface::{ representable_type, set_type, RepresentableType, SetType, SquareType, + TypeParseError, }; +use thiserror::Error; + use super::{BitBoard, Color, File, Rank, Square}; set_type!(Rights: u8); -impl Rights { - pub const WH: Rights = Rights(Dimension::WhiteH as u8); - pub const WA: Rights = Rights(Dimension::WhiteA as u8); - pub const BH: Rights = Rights(Dimension::BlackH as u8); - pub const BA: Rights = Rights(Dimension::BlackA as u8); -} - representable_type!( enum Dimension: u8 { WhiteH "H", WhiteA "A", @@ -114,14 +113,98 @@ mod ends { pub const BLACK_ROOK_A: Square = Square::D8; } +#[derive(Error, Debug)] +pub enum CastlingRightsParseError { + #[error("error parsing file string \"{0}\"")] + FileParseError(#[from] TypeParseError), + #[error("found invalid castling rights \"{0}\"")] + Invalid(String), +} + impl Info { + pub fn from_str( + s: &str, + white_king: Square, + black_king: Square, + ) -> Result { + if s == "-" { + return Ok(Info::from_squares( + Square::E1, + File::H, + File::A, + Square::E8, + File::H, + File::A, + Rights::new(), + )); + } + + if s.is_empty() || s.len() > 4 { + return Err(CastlingRightsParseError::Invalid(s.to_string())); + } + + let frc = !matches!( + unsafe { s.chars().next().unwrap_unchecked() }, + 'K' | 'Q' | 'k' | 'q' + ); + + let mut rights = Rights::new(); + + let mut white_h = File::H; + let mut white_a = File::A; + let mut black_h = File::H; + let mut black_a = File::A; + + for right in s.chars() { + if frc { + if right.is_uppercase() { + let file = + File::from_str(&right.to_lowercase().to_string())?; + if file as usize > white_king.file() as usize { + white_h = file; + rights = rights | Dimension::WhiteH; + } else { + white_a = file; + rights = rights | Dimension::WhiteA; + } + } else { + let file = File::from_str(&right.to_string())?; + if file as usize > black_king.file() as usize { + black_h = file; + rights = rights | Dimension::BlackH; + } else { + black_a = file; + rights = rights | Dimension::BlackA; + } + } + } else { + match right { + 'K' => rights = rights | Dimension::WhiteH, + 'Q' => rights = rights | Dimension::WhiteA, + 'k' => rights = rights | Dimension::BlackH, + 'q' => rights = rights | Dimension::BlackA, + _ => { + return Err(CastlingRightsParseError::Invalid( + right.to_string(), + )) + } + } + } + } + + Ok(Info::from_squares( + white_king, white_h, white_a, black_king, black_h, black_a, rights, + )) + } + #[rustfmt::skip] pub fn from_squares( w_king: Square, w_rook_h: File, w_rook_a: File, b_king: Square, b_rook_h: File, b_rook_a: File, + rights: Rights, ) -> Info { let mut info = Info { - rights: Rights::UNIVERSE, + rights, rooks: [Square::A1; Dimension::N], attacks_mask: [BitBoard::EMPTY; Dimension::N], blocker_mask: [BitBoard::EMPTY; Dimension::N], @@ -141,29 +224,29 @@ impl Info { info.rooks[ba] = Square::new(b_rook_a, Rank::Eighth); // Initialize the castling path table. - info.attacks_mask[wh] = blocker_mask(w_king, info.rooks[wh], ends::WHITE_KING_H, ends::WHITE_ROOK_H); - info.attacks_mask[wa] = blocker_mask(w_king, info.rooks[wa], ends::WHITE_KING_A, ends::WHITE_ROOK_A); - info.attacks_mask[bh] = blocker_mask(b_king, info.rooks[bh], ends::BLACK_KING_H, ends::BLACK_ROOK_H); - info.attacks_mask[ba] = blocker_mask(b_king, info.rooks[ba], ends::BLACK_KING_A, ends::BLACK_ROOK_A); + info.blocker_mask[wh] = blocker_mask(w_king, info.rooks[wh], ends::WHITE_KING_H, ends::WHITE_ROOK_H); + info.blocker_mask[wa] = blocker_mask(w_king, info.rooks[wa], ends::WHITE_KING_A, ends::WHITE_ROOK_A); + info.blocker_mask[bh] = blocker_mask(b_king, info.rooks[bh], ends::BLACK_KING_H, ends::BLACK_ROOK_H); + info.blocker_mask[ba] = blocker_mask(b_king, info.rooks[ba], ends::BLACK_KING_A, ends::BLACK_ROOK_A); - info.blocker_mask[wh] = BitBoard::between2(w_king, ends::WHITE_KING_H); - info.blocker_mask[wa] = BitBoard::between2(w_king, ends::WHITE_KING_A); - info.blocker_mask[bh] = BitBoard::between2(b_king, ends::BLACK_KING_H); - info.blocker_mask[ba] = BitBoard::between2(b_king, ends::BLACK_KING_A); + info.attacks_mask[wh] = BitBoard::between2(w_king, ends::WHITE_KING_H); + info.attacks_mask[wa] = BitBoard::between2(w_king, ends::WHITE_KING_A); + info.attacks_mask[bh] = BitBoard::between2(b_king, ends::BLACK_KING_H); + info.attacks_mask[ba] = BitBoard::between2(b_king, ends::BLACK_KING_A); fn blocker_mask(king: Square, rook: Square, king_end: Square, rook_end: Square) -> BitBoard { (BitBoard::between2(king, king_end) | BitBoard::between2(rook, rook_end)) - (BitBoard::from(king) | BitBoard::from(rook)) } // Initialize the rights update for the king's squares. - info.rights_masks[w_king as usize] = Rights::WH | Rights::WA; - info.rights_masks[b_king as usize] = Rights::BH | Rights::BA; + info.rights_masks[w_king as usize] = Rights::new() | Dimension::WhiteH | Dimension::WhiteA; + info.rights_masks[b_king as usize] = Rights::new() | Dimension::BlackH | Dimension::BlackA; // Initialize the rights update for the rook's squares. - info.rights_masks[w_rook_h as usize] = Rights::WH; - info.rights_masks[w_rook_a as usize] = Rights::WA; - info.rights_masks[b_rook_h as usize] = Rights::BH; - info.rights_masks[b_rook_a as usize] = Rights::BA; + info.rights_masks[info.rooks[wh] as usize] = Rights::new() | Dimension::WhiteH; + info.rights_masks[info.rooks[wa] as usize] = Rights::new() | Dimension::WhiteA; + info.rights_masks[info.rooks[bh] as usize] = Rights::new() | Dimension::BlackH; + info.rights_masks[info.rooks[ba] as usize] = Rights::new() | Dimension::BlackA; info } diff --git a/games/src/chess/mod.rs b/games/src/chess/mod.rs index 0073cdd..e18f6e8 100644 --- a/games/src/chess/mod.rs +++ b/games/src/chess/mod.rs @@ -20,3 +20,6 @@ pub use self::color::*; pub use self::position::*; pub use self::r#move::*; pub use self::square::*; + +#[cfg(test)] +mod tests; diff --git a/games/src/chess/move.rs b/games/src/chess/move.rs index 818f147..24fb2d8 100644 --- a/games/src/chess/move.rs +++ b/games/src/chess/move.rs @@ -154,6 +154,10 @@ impl MoveFlag { | MoveFlag::QPromotion ) } + + pub fn is_castling(&self) -> bool { + matches!(self, MoveFlag::CastleHSide | MoveFlag::CastleASide) + } } impl fmt::Display for Move { diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index f053176..f1b9879 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -33,6 +33,9 @@ use crate::chess::{ }; use crate::interface::MoveStore; +use super::castling::CastlingRightsParseError; +use super::castling::Dimension; +use super::castling::Rights; use super::movegen; use super::MoveFlag; @@ -131,7 +134,7 @@ impl PositionType for Position { let source_pc = unsafe { source_pc.unwrap_unchecked() }; - if !m.flag().is_promotion() { + if !m.flag().is_promotion() && !m.flag().is_castling() { board.insert(m.target(), source_pc); } @@ -166,8 +169,32 @@ impl PositionType for Position { m.target().down(board.side_to_move).unwrap_unchecked() }); } - MoveFlag::CastleASide => {} - MoveFlag::CastleHSide => {} + MoveFlag::CastleASide => { + let (king, rook) = + Dimension::from(board.side_to_move, castling::Side::A) + .get_targets(); + board.insert( + king, + ColoredPiece::new(Piece::King, board.side_to_move), + ); + board.insert( + rook, + ColoredPiece::new(Piece::Rook, board.side_to_move), + ); + } + MoveFlag::CastleHSide => { + let (king, rook) = + Dimension::from(board.side_to_move, castling::Side::H) + .get_targets(); + board.insert( + king, + ColoredPiece::new(Piece::King, board.side_to_move), + ); + board.insert( + rook, + ColoredPiece::new(Piece::Rook, board.side_to_move), + ); + } } board.half_move_clock += 1; @@ -200,8 +227,13 @@ pub enum PositionParseError { #[error("parsing piece placement: {0}")] BadPiecePlacement(#[from] PiecePlacementParseError), + #[error("position missing a king")] + MissingKing, + #[error("parsing side to move: {0}")] BadSideToMove(#[from] TypeParseError), + #[error("parsing castling rights: {0}")] + BadCastlingRights(#[from] CastlingRightsParseError), #[error("parsing half-move clock: {0}")] BadHalfMoveClock(#[from] ParseIntError), } @@ -219,6 +251,7 @@ impl FromStr for Position { let pos = parts[0]; let stm = parts[1]; + let rig = parts[2]; let ept = parts[3]; let hmc = parts[4]; let fmc = parts[5]; @@ -239,11 +272,23 @@ impl FromStr for Position { Square::E8, File::H, File::A, + Rights::new(), ), }; interface::parse_piece_placement(&mut position, pos)?; + let kings = position.piece_bb(Piece::King); + let white_king = (kings & position.color_bb(Color::White)).next(); + let black_king = (kings & position.color_bb(Color::Black)).next(); + + if let (Some(white_king), Some(black_king)) = (white_king, black_king) { + position.castling = + castling::Info::from_str(rig, white_king, black_king)?; + } else { + return Err(PositionParseError::MissingKing); + } + position.side_to_move = Color::from_str(stm)?; position.en_passant_target = if ept == "-" { None diff --git a/games/src/chess/tests/mod.rs b/games/src/chess/tests/mod.rs new file mode 100644 index 0000000..2aede40 --- /dev/null +++ b/games/src/chess/tests/mod.rs @@ -0,0 +1,1114 @@ +use crate::chess::Position; +use crate::perft; +use std::str::FromStr; + +macro_rules! perft_test { + ($name:ident $pos:literal $depth:literal $nodes:literal) => { + #[test] + fn $name() { + println!("cargo run -r {} {}", $depth, $pos); + match Position::from_str($pos) { + Ok(position) => { + println!("{}", u8::from(position.castling.rights)); + assert_eq!(perft::(position, $depth), $nodes) + } + Err(err) => { + println!("{}", err); + assert_eq!(true, false); + } + } + } + }; +} + +// Tests taken from Ethereal +perft_test!(position_1 "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" 5 4865609); +perft_test!(position_2 "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1" 5 193690690); +perft_test!(position_3 "4k3/8/8/8/8/8/8/4K2R w K - 0 1" 5 133987); +perft_test!(position_4 "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1" 5 145232); +perft_test!(position_5 "4k2r/8/8/8/8/8/8/4K3 w k - 0 1" 5 47635); +perft_test!(position_6 "r3k3/8/8/8/8/8/8/4K3 w q - 0 1" 5 52710); +perft_test!(position_7 "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1" 5 532933); +perft_test!(position_8 "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1" 5 118882); +perft_test!(position_9 "8/8/8/8/8/8/6k1/4K2R w K - 0 1" 5 37735); +perft_test!(position_10 "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1" 5 80619); +perft_test!(position_11 "4k2r/6K1/8/8/8/8/8/8 w k - 0 1" 5 10485); +perft_test!(position_12 "r3k3/1K6/8/8/8/8/8/8 w q - 0 1" 5 20780); +perft_test!(position_13 "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1" 5 7594526); +perft_test!(position_14 "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1" 5 8153719); +perft_test!(position_15 "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1" 5 7736373); +perft_test!(position_16 "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1" 5 7878456); +perft_test!(position_17 "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 5 8198901); +perft_test!(position_18 "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 5 7710115); +perft_test!(position_19 "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1" 5 7848606); +perft_test!(position_20 "4k3/8/8/8/8/8/8/4K2R b K - 0 1" 5 47635); +perft_test!(position_21 "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1" 5 52710); +perft_test!(position_22 "4k2r/8/8/8/8/8/8/4K3 b k - 0 1" 5 133987); +perft_test!(position_23 "r3k3/8/8/8/8/8/8/4K3 b q - 0 1" 5 145232); +perft_test!(position_24 "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1" 5 118882); +perft_test!(position_25 "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1" 5 532933); +perft_test!(position_26 "8/8/8/8/8/8/6k1/4K2R b K - 0 1" 5 10485); +perft_test!(position_27 "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1" 5 20780); +perft_test!(position_28 "4k2r/6K1/8/8/8/8/8/8 b k - 0 1" 5 37735); +perft_test!(position_29 "r3k3/1K6/8/8/8/8/8/8 b q - 0 1" 5 80619); +perft_test!(position_30 "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1" 5 7594526); +perft_test!(position_31 "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1" 5 8198901); +perft_test!(position_32 "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1" 5 7710115); +perft_test!(position_33 "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1" 5 7848606); +perft_test!(position_34 "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 5 8153719); +perft_test!(position_35 "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 5 7736373); +perft_test!(position_36 "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1" 5 7878456); +perft_test!(position_37 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1" 5 570726); +perft_test!(position_38 "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1" 5 223507); +perft_test!(position_39 "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1" 5 1198299); +perft_test!(position_40 "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1" 5 38348); +perft_test!(position_41 "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1" 5 92250); +perft_test!(position_42 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1" 5 582642); +perft_test!(position_43 "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1" 5 288141); +perft_test!(position_44 "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1" 5 281190); +perft_test!(position_45 "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1" 5 92250); +perft_test!(position_46 "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1" 5 38348); +perft_test!(position_47 "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1" 5 1320507); +perft_test!(position_48 "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1" 5 1713368); +perft_test!(position_49 "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1" 5 787524); +perft_test!(position_50 "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1" 5 310862); +perft_test!(position_51 "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1" 5 530585); +perft_test!(position_52 "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1" 5 1591064); +perft_test!(position_53 "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1" 5 310862); +perft_test!(position_54 "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1" 5 787524); +perft_test!(position_55 "7k/RR6/8/8/8/8/rr6/7K w - - 0 1" 5 2161211); +perft_test!(position_56 "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1" 5 20506480); +perft_test!(position_57 "7k/RR6/8/8/8/8/rr6/7K b - - 0 1" 5 2161211); +perft_test!(position_58 "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1" 5 20521342); +perft_test!(position_59 "6kq/8/8/8/8/8/8/7K w - - 0 1" 5 14893); +perft_test!(position_60 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 5 14893); +perft_test!(position_61 "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1" 5 166741); +perft_test!(position_62 "6qk/8/8/8/8/8/8/7K b - - 0 1" 5 105749); +perft_test!(position_63 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 5 14893); +perft_test!(position_64 "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1" 5 166741); +perft_test!(position_65 "8/8/8/8/8/K7/P7/k7 w - - 0 1" 5 1347); +perft_test!(position_66 "8/8/8/8/8/7K/7P/7k w - - 0 1" 5 1347); +perft_test!(position_67 "K7/p7/k7/8/8/8/8/8 w - - 0 1" 5 342); +perft_test!(position_68 "7K/7p/7k/8/8/8/8/8 w - - 0 1" 5 342); +perft_test!(position_69 "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1" 5 7028); +perft_test!(position_70 "8/8/8/8/8/K7/P7/k7 b - - 0 1" 5 342); +perft_test!(position_71 "8/8/8/8/8/7K/7P/7k b - - 0 1" 5 342); +perft_test!(position_72 "K7/p7/k7/8/8/8/8/8 b - - 0 1" 5 1347); +perft_test!(position_73 "7K/7p/7k/8/8/8/8/8 b - - 0 1" 5 1347); +perft_test!(position_74 "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1" 5 5408); +perft_test!(position_75 "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1" 5 1814); +perft_test!(position_76 "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1" 5 1814); +perft_test!(position_77 "8/8/7k/7p/7P/7K/8/8 w - - 0 1" 5 1969); +perft_test!(position_78 "8/8/k7/p7/P7/K7/8/8 w - - 0 1" 5 1969); +perft_test!(position_79 "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1" 5 8296); +perft_test!(position_80 "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1" 5 23599); +perft_test!(position_81 "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1" 5 21637); +perft_test!(position_82 "k7/8/3p4/8/3P4/8/8/7K w - - 0 1" 5 3450); +perft_test!(position_83 "8/8/7k/7p/7P/7K/8/8 b - - 0 1" 5 1969); +perft_test!(position_84 "8/8/k7/p7/P7/K7/8/8 b - - 0 1" 5 1969); +perft_test!(position_85 "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1" 5 8296); +perft_test!(position_86 "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1" 5 21637); +perft_test!(position_87 "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1" 5 23599); +perft_test!(position_88 "k7/8/3p4/8/3P4/8/8/7K b - - 0 1" 5 3309); +perft_test!(position_89 "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1" 5 4661); +perft_test!(position_90 "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1" 5 4786); +perft_test!(position_91 "k7/8/8/7p/6P1/8/8/K7 w - - 0 1" 5 6112); +perft_test!(position_92 "k7/8/7p/8/8/6P1/8/K7 w - - 0 1" 5 4354); +perft_test!(position_93 "k7/8/8/6p1/7P/8/8/K7 w - - 0 1" 5 6112); +perft_test!(position_94 "k7/8/6p1/8/8/7P/8/K7 w - - 0 1" 5 4354); +perft_test!(position_95 "k7/8/8/3p4/4p3/8/8/7K w - - 0 1" 5 3013); +perft_test!(position_96 "k7/8/3p4/8/8/4P3/8/7K w - - 0 1" 5 4271); +perft_test!(position_97 "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1" 5 5014); +perft_test!(position_98 "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1" 5 4658); +perft_test!(position_99 "k7/8/8/7p/6P1/8/8/K7 b - - 0 1" 5 6112); +perft_test!(position_100 "k7/8/7p/8/8/6P1/8/K7 b - - 0 1" 5 4354); +perft_test!(position_101 "k7/8/8/6p1/7P/8/8/K7 b - - 0 1" 5 6112); +perft_test!(position_102 "k7/8/6p1/8/8/7P/8/K7 b - - 0 1" 5 4354); +perft_test!(position_103 "k7/8/8/3p4/4p3/8/8/7K b - - 0 1" 5 4337); +perft_test!(position_104 "k7/8/3p4/8/8/4P3/8/7K b - - 0 1" 5 4271); +perft_test!(position_105 "7k/8/8/p7/1P6/8/8/7K w - - 0 1" 5 6112); +perft_test!(position_106 "7k/8/p7/8/8/1P6/8/7K w - - 0 1" 5 4354); +perft_test!(position_107 "7k/8/8/1p6/P7/8/8/7K w - - 0 1" 5 6112); +perft_test!(position_108 "7k/8/1p6/8/8/P7/8/7K w - - 0 1" 5 4354); +perft_test!(position_109 "k7/7p/8/8/8/8/6P1/K7 w - - 0 1" 5 7574); +perft_test!(position_110 "k7/6p1/8/8/8/8/7P/K7 w - - 0 1" 5 7574); +perft_test!(position_111 "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1" 5 24122); +perft_test!(position_112 "7k/8/8/p7/1P6/8/8/7K b - - 0 1" 5 6112); +perft_test!(position_113 "7k/8/p7/8/8/1P6/8/7K b - - 0 1" 5 4354); +perft_test!(position_114 "7k/8/8/1p6/P7/8/8/7K b - - 0 1" 5 6112); +perft_test!(position_115 "7k/8/1p6/8/8/P7/8/7K b - - 0 1" 5 4354); +perft_test!(position_116 "k7/7p/8/8/8/8/6P1/K7 b - - 0 1" 5 7574); +perft_test!(position_117 "k7/6p1/8/8/8/8/7P/K7 b - - 0 1" 5 7574); +perft_test!(position_118 "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1" 5 24122); +perft_test!(position_119 "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1" 5 90606); +perft_test!(position_120 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1" 5 2193768); +perft_test!(position_121 "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1" 5 1533145); +perft_test!(position_122 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1" 5 3605103); +perft_test!(position_123 "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1" 5 90606); +perft_test!(position_124 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1" 5 2193768); +perft_test!(position_125 "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1" 5 1533145); +perft_test!(position_126 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1" 5 3605103); +// TODO: en passant double pin +// perft_test!(position_127 "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1" 5 674624); +perft_test!(position_128 "rnbqkb1r/ppppp1pp/7n/4Pp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3" 5 11139762); + +perft_test!(position_frc_1 "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9" 5 8146062); +perft_test!(position_frc_2 "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9" 5 16253601); +perft_test!(position_frc_3 "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9" 5 6417013); +perft_test!(position_frc_4 "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9" 5 9183776); +perft_test!(position_frc_5 "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9" 5 34030312); +perft_test!(position_frc_6 "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9" 5 24851983); +perft_test!(position_frc_7 "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9" 5 21093346); +perft_test!(position_frc_8 "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9" 5 13203304); +perft_test!(position_frc_9 "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9" 5 11110203); +perft_test!(position_frc_10 "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9" 5 19836606); +perft_test!(position_frc_11 "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9" 5 23114629); +perft_test!(position_frc_12 "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9" 5 21796206); +perft_test!(position_frc_13 "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9" 5 17819770); +perft_test!(position_frc_14 "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9" 5 29370838); +perft_test!(position_frc_15 "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9" 5 9482310); +perft_test!(position_frc_16 "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9" 5 24219627); +perft_test!(position_frc_17 "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9" 5 23701014); +perft_test!(position_frc_18 "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9" 5 29032175); +perft_test!(position_frc_19 "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9" 5 6718715); +perft_test!(position_frc_20 "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9" 5 14481581); +perft_test!(position_frc_21 "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9" 5 14226907); +perft_test!(position_frc_22 "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9" 5 13780398); +perft_test!(position_frc_23 "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9" 5 10815324); +perft_test!(position_frc_24 "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9" 5 12719546); +perft_test!(position_frc_25 "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9" 5 7697880); +perft_test!(position_frc_26 "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9" 5 13454573); +perft_test!(position_frc_27 "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9" 5 6194124); +perft_test!(position_frc_28 "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9" 5 8047916); +perft_test!(position_frc_29 "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9" 5 4708975); +perft_test!(position_frc_30 "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9" 5 17647882); +perft_test!(position_frc_31 "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9" 5 13055173); +perft_test!(position_frc_32 "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9" 5 17454857); +perft_test!(position_frc_33 "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9" 5 29742670); +perft_test!(position_frc_34 "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9" 5 32898113); +perft_test!(position_frc_35 "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9" 5 11735969); +perft_test!(position_frc_36 "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9" 5 15621236); +perft_test!(position_frc_37 "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9" 5 8088751); +perft_test!(position_frc_38 "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9" 5 13755384); +perft_test!(position_frc_39 "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9" 5 36218182); +perft_test!(position_frc_40 "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9" 5 8697700); +perft_test!(position_frc_41 "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9" 5 15338230); +perft_test!(position_frc_42 "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9" 5 17166700); +perft_test!(position_frc_43 "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9" 5 18162741); +perft_test!(position_frc_44 "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9" 5 10630667); +perft_test!(position_frc_45 "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9" 5 10356818); +perft_test!(position_frc_46 "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9" 5 16819085); +perft_test!(position_frc_47 "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9" 5 11594634); +perft_test!(position_frc_48 "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9" 5 14496370); +perft_test!(position_frc_49 "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9" 5 14284338); +perft_test!(position_frc_50 "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9" 5 18486027); +perft_test!(position_frc_51 "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9" 5 31801525); +perft_test!(position_frc_52 "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9" 5 11394778); +perft_test!(position_frc_53 "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9" 5 8846766); +perft_test!(position_frc_54 "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9" 5 7103549); +perft_test!(position_frc_55 "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9" 5 24714401); +perft_test!(position_frc_56 "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9" 5 15964771); +perft_test!(position_frc_57 "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9" 5 10911545); +perft_test!(position_frc_58 "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9" 5 7419372); +perft_test!(position_frc_59 "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9" 5 14233587); +perft_test!(position_frc_60 "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9" 5 22318948); +perft_test!(position_frc_61 "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9" 5 13189156); +perft_test!(position_frc_62 "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9" 5 16420659); +perft_test!(position_frc_63 "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9" 5 17342527); +perft_test!(position_frc_64 "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9" 5 15373803); +perft_test!(position_frc_65 "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9" 5 22562080); +perft_test!(position_frc_66 "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9" 5 19153245); +perft_test!(position_frc_67 "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9" 5 11906515); +perft_test!(position_frc_68 "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9" 5 10817378); +perft_test!(position_frc_69 "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9" 5 13242252); +perft_test!(position_frc_70 "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9" 5 29436320); +perft_test!(position_frc_71 "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9" 5 24321197); +perft_test!(position_frc_72 "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9" 5 37143354); +perft_test!(position_frc_73 "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9" 5 16836636); +perft_test!(position_frc_74 "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9" 5 13342771); +perft_test!(position_frc_75 "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9" 5 18761475); +perft_test!(position_frc_76 "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9" 5 12815016); +perft_test!(position_frc_77 "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9" 5 4266410); +perft_test!(position_frc_78 "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9" 5 14708490); +perft_test!(position_frc_79 "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9" 5 11993332); +perft_test!(position_frc_80 "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9" 5 8427161); +perft_test!(position_frc_81 "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9" 5 28286576); +perft_test!(position_frc_82 "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9" 5 14333034); +perft_test!(position_frc_83 "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9" 5 7545536); +perft_test!(position_frc_84 "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9" 5 23443854); +perft_test!(position_frc_85 "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9" 5 6131124); +perft_test!(position_frc_86 "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9" 5 8084701); +perft_test!(position_frc_87 "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9" 5 14529434); +perft_test!(position_frc_88 "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9" 5 20120565); +perft_test!(position_frc_89 "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9" 5 19979594); +perft_test!(position_frc_90 "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9" 5 16838099); +perft_test!(position_frc_91 "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9" 5 11343507); +perft_test!(position_frc_92 "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9" 5 23555139); +perft_test!(position_frc_93 "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9" 5 22027695); +perft_test!(position_frc_94 "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9" 5 16473376); +perft_test!(position_frc_95 "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9" 5 11420973); +perft_test!(position_frc_96 "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9" 5 28127620); +perft_test!(position_frc_97 "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9" 5 9359618); +perft_test!(position_frc_98 "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9" 5 14692779); +perft_test!(position_frc_99 "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9" 5 43256823); +perft_test!(position_frc_100 "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9" 5 16492398); +perft_test!(position_frc_101 "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9" 5 11767038); +perft_test!(position_frc_102 "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9" 5 36048727); +perft_test!(position_frc_103 "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9" 5 23143989); +perft_test!(position_frc_104 "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9" 5 19555214); +perft_test!(position_frc_105 "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9" 5 21694330); +perft_test!(position_frc_106 "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9" 5 31204371); +perft_test!(position_frc_107 "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9" 5 11856964); +perft_test!(position_frc_108 "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9" 5 21855658); +perft_test!(position_frc_109 "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9" 5 24415089); +perft_test!(position_frc_110 "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9" 5 17477825); +perft_test!(position_frc_111 "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9" 5 25251641); +perft_test!(position_frc_112 "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9" 5 16693640); +perft_test!(position_frc_113 "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9" 5 22197063); +perft_test!(position_frc_114 "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9" 5 8601011); +perft_test!(position_frc_115 "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9" 5 15583376); +perft_test!(position_frc_116 "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9" 5 19478789); +perft_test!(position_frc_117 "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9" 5 9002073); +perft_test!(position_frc_118 "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9" 5 24703467); +perft_test!(position_frc_119 "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9" 5 15556806); +perft_test!(position_frc_120 "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9" 5 88557078); +perft_test!(position_frc_121 "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9" 5 19866918); +perft_test!(position_frc_122 "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9" 5 28053260); +perft_test!(position_frc_123 "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9" 5 12681936); +perft_test!(position_frc_124 "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9" 5 22616076); +perft_test!(position_frc_125 "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9" 5 9698432); +perft_test!(position_frc_126 "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9" 5 34914919); +perft_test!(position_frc_127 "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9" 5 21141738); +perft_test!(position_frc_128 "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9" 5 14343443); +perft_test!(position_frc_129 "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9" 5 30026687); +perft_test!(position_frc_130 "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9" 5 11099382); +perft_test!(position_frc_131 "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9" 5 11208688); +perft_test!(position_frc_132 "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9" 5 9919113); +perft_test!(position_frc_133 "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9" 5 31059587); +perft_test!(position_frc_134 "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9" 5 7809837); +perft_test!(position_frc_135 "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9" 5 21981567); +perft_test!(position_frc_136 "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9" 5 22076141); +perft_test!(position_frc_137 "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9" 5 23239122); +perft_test!(position_frc_138 "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9" 5 15236287); +perft_test!(position_frc_139 "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9" 5 21284835); +perft_test!(position_frc_140 "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9" 5 56588117); +perft_test!(position_frc_141 "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9" 5 21427496); +perft_test!(position_frc_142 "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9" 5 11872805); +perft_test!(position_frc_143 "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9" 5 28520172); +perft_test!(position_frc_144 "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9" 5 21581178); +perft_test!(position_frc_145 "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9" 5 9537260); +perft_test!(position_frc_146 "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9" 5 14216070); +perft_test!(position_frc_147 "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9" 5 18547476); +perft_test!(position_frc_148 "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9" 5 16555068); +perft_test!(position_frc_149 "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9" 5 9863080); +perft_test!(position_frc_150 "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9" 5 12044358); +perft_test!(position_frc_151 "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9" 5 11806808); +perft_test!(position_frc_152 "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9" 5 42201531); +perft_test!(position_frc_153 "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9" 5 11582539); +perft_test!(position_frc_154 "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9" 5 13287051); +perft_test!(position_frc_155 "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9" 5 9968830); +perft_test!(position_frc_156 "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9" 5 13378840); +perft_test!(position_frc_157 "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9" 5 12525939); +perft_test!(position_frc_158 "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9" 5 15952533); +perft_test!(position_frc_159 "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9" 5 15865528); +perft_test!(position_frc_160 "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9" 5 14375839); +perft_test!(position_frc_161 "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9" 5 13514201); +perft_test!(position_frc_162 "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9" 5 16125924); +perft_test!(position_frc_163 "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9" 5 27792175); +perft_test!(position_frc_164 "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9" 5 26998966); +perft_test!(position_frc_165 "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9" 5 35627310); +perft_test!(position_frc_166 "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9" 5 10658989); +perft_test!(position_frc_167 "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9" 5 23957242); +perft_test!(position_frc_168 "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9" 5 9627826); +perft_test!(position_frc_169 "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9" 5 27229468); +perft_test!(position_frc_170 "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9" 5 21952444); +perft_test!(position_frc_171 "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9" 5 9244693); +perft_test!(position_frc_172 "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9" 5 9692630); +perft_test!(position_frc_173 "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9" 5 9305533); +perft_test!(position_frc_174 "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9" 5 18103280); +perft_test!(position_frc_175 "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9" 5 23868737); +perft_test!(position_frc_176 "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9" 5 54843403); +perft_test!(position_frc_177 "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9" 5 28784300); +perft_test!(position_frc_178 "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9" 5 11965544); +perft_test!(position_frc_179 "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9" 5 15966934); +perft_test!(position_frc_180 "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9" 5 6629293); +perft_test!(position_frc_181 "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9" 5 9227883); +perft_test!(position_frc_182 "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9" 5 21019301); +perft_test!(position_frc_183 "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9" 5 5760165); +perft_test!(position_frc_184 "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9" 5 22667987); +perft_test!(position_frc_185 "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9" 5 11489727); +perft_test!(position_frc_186 "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9" 5 12069159); +perft_test!(position_frc_187 "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9" 5 12167153); +perft_test!(position_frc_188 "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9" 5 35738410); +perft_test!(position_frc_189 "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9" 5 11920087); +perft_test!(position_frc_190 "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9" 5 31703749); +perft_test!(position_frc_191 "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9" 5 11371067); +perft_test!(position_frc_192 "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9" 5 24085223); +perft_test!(position_frc_193 "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9" 5 13157826); +perft_test!(position_frc_194 "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9" 5 21341087); +perft_test!(position_frc_195 "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9" 5 16391601); +perft_test!(position_frc_196 "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9" 5 32649943); +perft_test!(position_frc_197 "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9" 5 11562434); +perft_test!(position_frc_198 "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9" 5 32597704); +perft_test!(position_frc_199 "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9" 5 17761431); +perft_test!(position_frc_200 "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9" 5 32523099); +perft_test!(position_frc_201 "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9" 5 5846781); +perft_test!(position_frc_202 "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9" 5 7994547); +perft_test!(position_frc_203 "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9" 5 10845146); +perft_test!(position_frc_204 "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9" 5 38511307); +perft_test!(position_frc_205 "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9" 5 7403327); +perft_test!(position_frc_206 "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9" 5 9396521); +perft_test!(position_frc_207 "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9" 5 27463479); +perft_test!(position_frc_208 "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9" 5 18024195); +perft_test!(position_frc_209 "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9" 5 20290974); +perft_test!(position_frc_210 "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9" 5 13133439); +perft_test!(position_frc_211 "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9" 5 27610213); +perft_test!(position_frc_212 "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9" 5 30894863); +perft_test!(position_frc_213 "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9" 5 7583292); +perft_test!(position_frc_214 "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9" 5 17313279); +perft_test!(position_frc_215 "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9" 5 6218644); +perft_test!(position_frc_216 "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9" 5 24138518); +perft_test!(position_frc_217 "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9" 5 21998733); +perft_test!(position_frc_218 "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9" 5 15514933); +perft_test!(position_frc_219 "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9" 5 19185851); +perft_test!(position_frc_220 "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9" 5 53033675); +perft_test!(position_frc_221 "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9" 5 18296195); +perft_test!(position_frc_222 "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9" 5 19429491); +perft_test!(position_frc_223 "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9" 5 16065378); +perft_test!(position_frc_224 "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9" 5 10697065); +perft_test!(position_frc_225 "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9" 5 23717883); +perft_test!(position_frc_226 "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9" 5 25245957); +perft_test!(position_frc_227 "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9" 5 25128076); +perft_test!(position_frc_228 "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9" 5 9153089); +perft_test!(position_frc_229 "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9" 5 15133381); +perft_test!(position_frc_230 "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9" 5 12871967); +perft_test!(position_frc_231 "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9" 5 7777833); +perft_test!(position_frc_232 "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9" 5 22305910); +perft_test!(position_frc_233 "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9" 5 35121759); +perft_test!(position_frc_234 "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9" 5 13097064); +perft_test!(position_frc_235 "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9" 5 19715083); +perft_test!(position_frc_236 "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9" 5 11026383); +perft_test!(position_frc_237 "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9" 5 16058815); +perft_test!(position_frc_238 "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9" 5 29263502); +perft_test!(position_frc_239 "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9" 5 19532077); +perft_test!(position_frc_240 "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9" 5 16661676); +perft_test!(position_frc_241 "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9" 5 15079602); +perft_test!(position_frc_242 "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9" 5 28194726); +perft_test!(position_frc_243 "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9" 5 33195397); +perft_test!(position_frc_244 "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9" 5 26970098); +perft_test!(position_frc_245 "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9" 5 9539687); +perft_test!(position_frc_246 "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9" 5 16986290); +perft_test!(position_frc_247 "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9" 5 16906409); +perft_test!(position_frc_248 "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9" 5 12879258); +perft_test!(position_frc_249 "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9" 5 20671433); +perft_test!(position_frc_250 "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9" 5 16278120); +perft_test!(position_frc_251 "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9" 5 8763742); +perft_test!(position_frc_252 "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9" 5 15394667); +perft_test!(position_frc_253 "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9" 5 7218486); +perft_test!(position_frc_254 "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9" 5 9587439); +perft_test!(position_frc_255 "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9" 5 19867117); +perft_test!(position_frc_256 "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9" 5 17734818); +perft_test!(position_frc_257 "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9" 5 10133092); +perft_test!(position_frc_258 "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9" 5 36142423); +perft_test!(position_frc_259 "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9" 5 16897544); +perft_test!(position_frc_260 "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9" 5 5822387); +perft_test!(position_frc_261 "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9" 5 15153092); +perft_test!(position_frc_262 "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9" 5 22094260); +perft_test!(position_frc_263 "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9" 5 12225742); +perft_test!(position_frc_264 "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9" 5 24965592); +perft_test!(position_frc_265 "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9" 5 12187583); +perft_test!(position_frc_266 "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9" 5 14684565); +perft_test!(position_frc_267 "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9" 5 11663330); +perft_test!(position_frc_268 "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9" 5 28899548); +perft_test!(position_frc_269 "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9" 5 15045589); +perft_test!(position_frc_270 "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9" 5 17603960); +perft_test!(position_frc_271 "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9" 5 9569590); +perft_test!(position_frc_272 "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9" 5 15301879); +perft_test!(position_frc_273 "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9" 5 31385912); +perft_test!(position_frc_274 "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9" 5 5980981); +perft_test!(position_frc_275 "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9" 5 107234294); +perft_test!(position_frc_276 "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9" 5 26083252); +perft_test!(position_frc_277 "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9" 5 18588316); +perft_test!(position_frc_278 "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9" 5 8525056); +perft_test!(position_frc_279 "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9" 5 28465693); +perft_test!(position_frc_280 "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9" 5 6124625); +perft_test!(position_frc_281 "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9" 5 6696458); +perft_test!(position_frc_282 "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9" 5 7197322); +perft_test!(position_frc_283 "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9" 5 10755190); +perft_test!(position_frc_284 "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9" 5 6230616); +perft_test!(position_frc_285 "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9" 5 3008668); +perft_test!(position_frc_286 "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9" 5 18231199); +perft_test!(position_frc_287 "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9" 5 11132758); +perft_test!(position_frc_288 "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9" 5 16764576); +perft_test!(position_frc_289 "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9" 5 16632403); +perft_test!(position_frc_290 "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9" 5 27233018); +perft_test!(position_frc_291 "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9" 5 18608857); +perft_test!(position_frc_292 "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9" 5 18476807); +perft_test!(position_frc_293 "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9" 5 10260500); +perft_test!(position_frc_294 "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9" 5 11640416); +perft_test!(position_frc_295 "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9" 5 8604788); +perft_test!(position_frc_296 "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9" 5 7939483); +perft_test!(position_frc_297 "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9" 5 24475596); +perft_test!(position_frc_298 "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9" 5 14065717); +perft_test!(position_frc_299 "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9" 5 14404324); +perft_test!(position_frc_300 "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9" 5 8516966); +perft_test!(position_frc_301 "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9" 5 12055174); +perft_test!(position_frc_302 "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9" 5 19939053); +perft_test!(position_frc_303 "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9" 5 18110831); +perft_test!(position_frc_304 "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9" 5 24984621); +perft_test!(position_frc_305 "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9" 5 20128587); +perft_test!(position_frc_306 "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9" 5 20840078); +perft_test!(position_frc_307 "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9" 5 16109522); +perft_test!(position_frc_308 "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9" 5 12173245); +perft_test!(position_frc_309 "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9" 5 7626054); +perft_test!(position_frc_310 "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9" 5 15167248); +perft_test!(position_frc_311 "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9" 5 13706856); +perft_test!(position_frc_312 "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9" 5 16613630); +perft_test!(position_frc_313 "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9" 5 10096863); +perft_test!(position_frc_314 "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9" 5 17597164); +perft_test!(position_frc_315 "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9" 5 40918952); +perft_test!(position_frc_316 "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9" 5 11911314); +perft_test!(position_frc_317 "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9" 5 612305); +perft_test!(position_frc_318 "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9" 5 13421727); +perft_test!(position_frc_319 "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9" 5 13322502); +perft_test!(position_frc_320 "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9" 5 30458921); +perft_test!(position_frc_321 "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9" 5 14154852); +perft_test!(position_frc_322 "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9" 5 6450025); +perft_test!(position_frc_323 "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9" 5 10391021); +perft_test!(position_frc_324 "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9" 5 22873901); +perft_test!(position_frc_325 "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9" 5 17199594); +perft_test!(position_frc_326 "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9" 5 13038519); +perft_test!(position_frc_327 "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9" 5 30995969); +perft_test!(position_frc_328 "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9" 5 56747878); +perft_test!(position_frc_329 "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9" 5 19506135); +perft_test!(position_frc_330 "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9" 5 8250997); +perft_test!(position_frc_331 "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9" 5 17735648); +perft_test!(position_frc_332 "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9" 5 19192982); +perft_test!(position_frc_333 "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9" 5 8652810); +perft_test!(position_frc_334 "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9" 5 6506674); +perft_test!(position_frc_335 "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9" 5 23952941); +perft_test!(position_frc_336 "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9" 5 29602610); +perft_test!(position_frc_337 "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9" 5 5356253); +perft_test!(position_frc_338 "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9" 5 32684185); +perft_test!(position_frc_339 "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9" 5 14561181); +perft_test!(position_frc_340 "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9" 5 9307003); +perft_test!(position_frc_341 "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9" 5 23091070); +perft_test!(position_frc_342 "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9" 5 8887567); +perft_test!(position_frc_343 "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9" 5 9465555); +perft_test!(position_frc_344 "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9" 5 4160034); +perft_test!(position_frc_345 "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9" 5 5862341); +perft_test!(position_frc_346 "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9" 5 11090645); +perft_test!(position_frc_347 "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9" 5 19318837); +perft_test!(position_frc_348 "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9" 5 20145765); +perft_test!(position_frc_349 "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9" 5 10295086); +perft_test!(position_frc_350 "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9" 5 2640555); +perft_test!(position_frc_351 "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9" 5 16226660); +perft_test!(position_frc_352 "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9" 5 6826249); +perft_test!(position_frc_353 "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9" 5 7371098); +perft_test!(position_frc_354 "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9" 5 28412902); +perft_test!(position_frc_355 "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9" 5 30392925); +perft_test!(position_frc_356 "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9" 5 31185844); +perft_test!(position_frc_357 "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9" 5 14006203); +perft_test!(position_frc_358 "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9" 5 11718463); +perft_test!(position_frc_359 "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9" 5 35483796); +perft_test!(position_frc_360 "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9" 5 9329122); +perft_test!(position_frc_361 "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9" 5 5236331); +perft_test!(position_frc_362 "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9" 5 5503579); +perft_test!(position_frc_363 "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9" 5 17883987); +perft_test!(position_frc_364 "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9" 5 68070015); +perft_test!(position_frc_365 "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9" 5 32318550); +perft_test!(position_frc_366 "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9" 5 5754555); +perft_test!(position_frc_367 "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9" 5 9905109); +perft_test!(position_frc_368 "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9" 5 19133881); +perft_test!(position_frc_369 "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9" 5 13581691); +perft_test!(position_frc_370 "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9" 5 21156664); +perft_test!(position_frc_371 "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9" 5 25360295); +perft_test!(position_frc_372 "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9" 5 12817011); +perft_test!(position_frc_373 "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9" 5 9236564); +perft_test!(position_frc_374 "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9" 5 5735644); +perft_test!(position_frc_375 "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9" 5 14192779); +perft_test!(position_frc_376 "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9" 5 14322279); +perft_test!(position_frc_377 "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9" 5 15316285); +perft_test!(position_frc_378 "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9" 5 16188945); +perft_test!(position_frc_379 "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9" 5 33150360); +perft_test!(position_frc_380 "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9" 5 5506897); +perft_test!(position_frc_381 "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9" 5 11245508); +perft_test!(position_frc_382 "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9" 5 22654797); +perft_test!(position_frc_383 "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9" 5 13890077); +perft_test!(position_frc_384 "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9" 5 3588435); +perft_test!(position_frc_385 "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9" 5 11162476); +perft_test!(position_frc_386 "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9" 5 30126510); +perft_test!(position_frc_387 "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9" 5 20849374); +perft_test!(position_frc_388 "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9" 5 19494094); +perft_test!(position_frc_389 "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9" 5 27802999); +perft_test!(position_frc_390 "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9" 5 17005916); +perft_test!(position_frc_391 "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9" 5 19615756); +perft_test!(position_frc_392 "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9" 5 11032633); +perft_test!(position_frc_393 "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9" 5 20292750); +perft_test!(position_frc_394 "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9" 5 22443036); +perft_test!(position_frc_395 "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9" 5 27658191); +perft_test!(position_frc_396 "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9" 5 14733245); +perft_test!(position_frc_397 "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9" 5 12367604); +perft_test!(position_frc_398 "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9" 5 30307554); +perft_test!(position_frc_399 "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9" 5 7046501); +perft_test!(position_frc_400 "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9" 5 8191054); +perft_test!(position_frc_401 "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9" 5 8903754); +perft_test!(position_frc_402 "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9" 5 16243731); +perft_test!(position_frc_403 "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9" 5 5048497); +perft_test!(position_frc_404 "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9" 5 26302461); +perft_test!(position_frc_405 "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9" 5 22147642); +perft_test!(position_frc_406 "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9" 5 10416981); +perft_test!(position_frc_407 "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9" 5 26316355); +perft_test!(position_frc_408 "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9" 5 24738875); +perft_test!(position_frc_409 "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9" 5 9714509); +perft_test!(position_frc_410 "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9" 5 13307890); +perft_test!(position_frc_411 "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9" 5 7204345); +perft_test!(position_frc_412 "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9" 5 20036784); +perft_test!(position_frc_413 "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9" 5 16013189); +perft_test!(position_frc_414 "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9" 5 16685687); +perft_test!(position_frc_415 "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9" 5 7508201); +perft_test!(position_frc_416 "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9" 5 8721079); +perft_test!(position_frc_417 "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9" 5 27734108); +perft_test!(position_frc_418 "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9" 5 6372681); +perft_test!(position_frc_419 "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9" 5 9015901); +perft_test!(position_frc_420 "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9" 5 12099119); +perft_test!(position_frc_421 "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9" 5 11491355); +perft_test!(position_frc_422 "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9" 5 12649636); +perft_test!(position_frc_423 "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9" 5 16609220); +perft_test!(position_frc_424 "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9" 5 8687621); +perft_test!(position_frc_425 "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9" 5 22592380); +perft_test!(position_frc_426 "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9" 5 17597398); +perft_test!(position_frc_427 "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9" 5 30251988); +perft_test!(position_frc_428 "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9" 5 24945574); +perft_test!(position_frc_429 "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9" 5 19919434); +perft_test!(position_frc_430 "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9" 5 16525239); +perft_test!(position_frc_431 "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9" 5 21112751); +perft_test!(position_frc_432 "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9" 5 6196438); +perft_test!(position_frc_433 "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9" 5 20687969); +perft_test!(position_frc_434 "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9" 5 12185361); +perft_test!(position_frc_435 "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9" 5 32490040); +perft_test!(position_frc_436 "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9" 5 19885037); +perft_test!(position_frc_437 "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9" 5 18862234); +perft_test!(position_frc_438 "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9" 5 19648535); +perft_test!(position_frc_439 "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9" 5 10022614); +perft_test!(position_frc_440 "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9" 5 13909432); +perft_test!(position_frc_441 "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9" 5 22408813); +perft_test!(position_frc_442 "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9" 5 12242780); +perft_test!(position_frc_443 "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9" 5 14395828); +perft_test!(position_frc_444 "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9" 5 8239159); +perft_test!(position_frc_445 "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9" 5 9079829); +perft_test!(position_frc_446 "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9" 5 20334071); +perft_test!(position_frc_447 "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9" 5 32921537); +perft_test!(position_frc_448 "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9" 5 7015419); +perft_test!(position_frc_449 "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9" 5 22391185); +perft_test!(position_frc_450 "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9" 5 20281962); +perft_test!(position_frc_451 "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9" 5 11607818); +perft_test!(position_frc_452 "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9" 5 19239812); +perft_test!(position_frc_453 "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9" 5 28469879); +perft_test!(position_frc_454 "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9" 5 36025223); +perft_test!(position_frc_455 "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9" 5 6666787); +perft_test!(position_frc_456 "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9" 5 6963287); +perft_test!(position_frc_457 "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9" 5 11008114); +perft_test!(position_frc_458 "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9" 5 20904119); +perft_test!(position_frc_459 "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9" 5 11469548); +perft_test!(position_frc_460 "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9" 5 21247414); +perft_test!(position_frc_461 "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9" 5 20188622); +perft_test!(position_frc_462 "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9" 5 25594662); +perft_test!(position_frc_463 "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9" 5 16944425); +perft_test!(position_frc_464 "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9" 5 12865247); +perft_test!(position_frc_465 "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9" 5 10776855); +perft_test!(position_frc_466 "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9" 5 7370758); +perft_test!(position_frc_467 "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9" 5 16429837); +perft_test!(position_frc_468 "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9" 5 28095833); +perft_test!(position_frc_469 "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9" 5 32825932); +perft_test!(position_frc_470 "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9" 5 10203438); +perft_test!(position_frc_471 "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9" 5 23266182); +perft_test!(position_frc_472 "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9" 5 23075785); +perft_test!(position_frc_473 "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9" 5 16718577); +perft_test!(position_frc_474 "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9" 5 15545590); +perft_test!(position_frc_475 "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9" 5 18742426); +perft_test!(position_frc_476 "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9" 5 21591790); +perft_test!(position_frc_477 "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9" 5 15847763); +perft_test!(position_frc_478 "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9" 5 20361517); +perft_test!(position_frc_479 "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9" 5 7287368); +perft_test!(position_frc_480 "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9" 5 14301029); +perft_test!(position_frc_481 "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9" 5 9374021); +perft_test!(position_frc_482 "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9" 5 26130444); +perft_test!(position_frc_483 "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9" 5 10606831); +perft_test!(position_frc_484 "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9" 5 12077228); +perft_test!(position_frc_485 "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9" 5 19584539); +perft_test!(position_frc_486 "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9" 5 20500804); +perft_test!(position_frc_487 "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9" 5 24422614); +perft_test!(position_frc_488 "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9" 5 41108769); +perft_test!(position_frc_489 "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9" 5 12164609); +perft_test!(position_frc_490 "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9" 5 11409633); +perft_test!(position_frc_491 "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9" 5 15037464); +perft_test!(position_frc_492 "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9" 5 12214768); +perft_test!(position_frc_493 "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9" 5 8538539); +perft_test!(position_frc_494 "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9" 5 41695761); +perft_test!(position_frc_495 "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9" 5 14457245); +perft_test!(position_frc_496 "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9" 5 8080951); +perft_test!(position_frc_497 "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9" 5 15520298); +perft_test!(position_frc_498 "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9" 5 6995034); +perft_test!(position_frc_499 "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9" 5 10840256); +perft_test!(position_frc_500 "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9" 5 17438715); +perft_test!(position_frc_501 "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9" 5 16053564); +perft_test!(position_frc_502 "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9" 5 19571559); +perft_test!(position_frc_503 "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9" 5 16324542); +perft_test!(position_frc_504 "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9" 5 26363334); +perft_test!(position_frc_505 "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9" 5 7055215); +perft_test!(position_frc_506 "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9" 5 20429246); +perft_test!(position_frc_507 "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9" 5 14038570); +perft_test!(position_frc_508 "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9" 5 24299415); +perft_test!(position_frc_509 "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9" 5 18719949); +perft_test!(position_frc_510 "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9" 5 21862776); +perft_test!(position_frc_511 "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9" 5 17664543); +perft_test!(position_frc_512 "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9" 5 33322477); +perft_test!(position_frc_513 "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9" 5 15454749); +perft_test!(position_frc_514 "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9" 5 5770284); +perft_test!(position_frc_515 "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9" 5 38505058); +perft_test!(position_frc_516 "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9" 5 17820605); +perft_test!(position_frc_517 "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9" 5 10881112); +perft_test!(position_frc_518 "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9" 5 21657601); +perft_test!(position_frc_519 "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9" 5 24923473); +perft_test!(position_frc_520 "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9" 5 15992882); +perft_test!(position_frc_521 "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9" 5 19948650); +perft_test!(position_frc_522 "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9" 5 6065231); +perft_test!(position_frc_523 "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9" 5 42109356); +perft_test!(position_frc_524 "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9" 5 26632459); +perft_test!(position_frc_525 "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9" 5 13200921); +perft_test!(position_frc_526 "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9" 5 30397368); +perft_test!(position_frc_527 "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9" 5 16813114); +perft_test!(position_frc_528 "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9" 5 10554668); +perft_test!(position_frc_529 "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9" 5 7679979); +perft_test!(position_frc_530 "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9" 5 17354516); +perft_test!(position_frc_531 "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9" 5 22376575); +perft_test!(position_frc_532 "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9" 5 12730970); +perft_test!(position_frc_533 "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9" 5 21100580); +perft_test!(position_frc_534 "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9" 5 14507076); +perft_test!(position_frc_535 "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9" 5 65239153); +perft_test!(position_frc_536 "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9" 5 26202752); +perft_test!(position_frc_537 "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9" 5 16049807); +perft_test!(position_frc_538 "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9" 5 14020041); +perft_test!(position_frc_539 "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9" 5 17000613); +perft_test!(position_frc_540 "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9" 5 37415304); +perft_test!(position_frc_541 "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9" 5 52991625); +perft_test!(position_frc_542 "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9" 5 15860369); +perft_test!(position_frc_543 "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9" 5 29022529); +perft_test!(position_frc_544 "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9" 5 10522064); +perft_test!(position_frc_545 "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9" 5 26000648); +perft_test!(position_frc_546 "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9" 5 14954779); +perft_test!(position_frc_547 "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9" 5 9760752); +perft_test!(position_frc_548 "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9" 5 17602252); +perft_test!(position_frc_549 "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9" 5 33695089); +perft_test!(position_frc_550 "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9" 5 15115531); +perft_test!(position_frc_551 "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9" 5 11199653); +perft_test!(position_frc_552 "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9" 5 6831555); +perft_test!(position_frc_553 "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9" 5 19472074); +perft_test!(position_frc_554 "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9" 5 9753617); +perft_test!(position_frc_555 "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9" 5 9206957); +perft_test!(position_frc_556 "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9" 5 10708639); +perft_test!(position_frc_557 "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9" 5 39145902); +perft_test!(position_frc_558 "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9" 5 9687507); +perft_test!(position_frc_559 "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9" 5 8436136); +perft_test!(position_frc_560 "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9" 5 9139962); +perft_test!(position_frc_561 "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9" 5 20503775); +perft_test!(position_frc_562 "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9" 5 19913758); +perft_test!(position_frc_563 "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9" 5 20044474); +perft_test!(position_frc_564 "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9" 5 8204171); +perft_test!(position_frc_565 "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9" 5 16787080); +perft_test!(position_frc_566 "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9" 5 20755098); +perft_test!(position_frc_567 "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9" 5 13257198); +perft_test!(position_frc_568 "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9" 5 13012378); +perft_test!(position_frc_569 "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9" 5 11269462); +perft_test!(position_frc_570 "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9" 5 9416862); +perft_test!(position_frc_571 "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9" 5 15257204); +perft_test!(position_frc_572 "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9" 5 38722152); +perft_test!(position_frc_573 "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9" 5 8086100); +perft_test!(position_frc_574 "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9" 5 10278695); +perft_test!(position_frc_575 "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9" 5 19252739); +perft_test!(position_frc_576 "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9" 5 22172123); +perft_test!(position_frc_577 "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9" 5 17546069); +perft_test!(position_frc_578 "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9" 5 20059741); +perft_test!(position_frc_579 "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9" 5 14237097); +perft_test!(position_frc_580 "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9" 5 8849383); +perft_test!(position_frc_581 "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9" 5 24328258); +perft_test!(position_frc_582 "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9" 5 5568106); +perft_test!(position_frc_583 "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9" 5 12458875); +perft_test!(position_frc_584 "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9" 5 12187382); +perft_test!(position_frc_585 "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9" 5 12103076); +perft_test!(position_frc_586 "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9" 5 9014737); +perft_test!(position_frc_587 "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9" 5 8295874); +perft_test!(position_frc_588 "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9" 5 18961456); +perft_test!(position_frc_589 "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9" 5 10832084); +perft_test!(position_frc_590 "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9" 5 6452205); +perft_test!(position_frc_591 "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9" 5 10940750); +perft_test!(position_frc_592 "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9" 5 10870247); +perft_test!(position_frc_593 "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9" 5 16391730); +perft_test!(position_frc_594 "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9" 5 14371755); +perft_test!(position_frc_595 "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9" 5 12463801); +perft_test!(position_frc_596 "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9" 5 21852196); +perft_test!(position_frc_597 "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9" 5 12794736); +perft_test!(position_frc_598 "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9" 5 34780853); +perft_test!(position_frc_599 "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9" 5 14565370); +perft_test!(position_frc_600 "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9" 5 5282124); +perft_test!(position_frc_601 "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9" 5 12989786); +perft_test!(position_frc_602 "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9" 5 8430874); +perft_test!(position_frc_603 "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9" 5 19290675); +perft_test!(position_frc_604 "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9" 5 12976682); +perft_test!(position_frc_605 "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9" 5 10850952); +perft_test!(position_frc_606 "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9" 5 15661072); +perft_test!(position_frc_607 "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9" 5 13837270); +perft_test!(position_frc_608 "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9" 5 7215306); +perft_test!(position_frc_609 "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9" 5 9929336); +perft_test!(position_frc_610 "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9" 5 6720181); +perft_test!(position_frc_611 "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9" 5 21806428); +perft_test!(position_frc_612 "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9" 5 22079005); +perft_test!(position_frc_613 "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9" 5 10271111); +perft_test!(position_frc_614 "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9" 5 5918310); +perft_test!(position_frc_615 "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9" 5 21285553); +perft_test!(position_frc_616 "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9" 5 6051500); +perft_test!(position_frc_617 "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9" 5 11039042); +perft_test!(position_frc_618 "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9" 5 20666099); +perft_test!(position_frc_619 "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9" 5 49748034); +perft_test!(position_frc_620 "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9" 5 15384362); +perft_test!(position_frc_621 "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9" 5 11843134); +perft_test!(position_frc_622 "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9" 5 15379233); +perft_test!(position_frc_623 "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9" 5 25144295); +perft_test!(position_frc_624 "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9" 5 6825123); +perft_test!(position_frc_625 "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9" 5 13674310); +perft_test!(position_frc_626 "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9" 5 7778289); +perft_test!(position_frc_627 "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9" 5 14228372); +perft_test!(position_frc_628 "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9" 5 7752404); +perft_test!(position_frc_629 "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9" 5 7549008); +perft_test!(position_frc_630 "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9" 5 17989920); +perft_test!(position_frc_631 "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9" 5 7808375); +perft_test!(position_frc_632 "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9" 5 33318567); +perft_test!(position_frc_633 "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9" 5 26763259); +perft_test!(position_frc_634 "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9" 5 16662477); +perft_test!(position_frc_635 "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9" 5 16987110); +perft_test!(position_frc_636 "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9" 5 23983464); +perft_test!(position_frc_637 "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9" 5 21518343); +perft_test!(position_frc_638 "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9" 5 12238776); +perft_test!(position_frc_639 "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9" 5 23698701); +perft_test!(position_frc_640 "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9" 5 20138432); +perft_test!(position_frc_641 "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9" 5 6307276); +perft_test!(position_frc_642 "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9" 5 12604078); +perft_test!(position_frc_643 "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9" 5 12290985); +perft_test!(position_frc_644 "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9" 5 7861413); +perft_test!(position_frc_645 "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9" 5 8699448); +perft_test!(position_frc_646 "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9" 5 14904192); +perft_test!(position_frc_647 "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9" 5 35626426); +perft_test!(position_frc_648 "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9" 5 11859538); +perft_test!(position_frc_649 "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9" 5 9556962); +perft_test!(position_frc_650 "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9" 5 33185346); +perft_test!(position_frc_651 "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9" 5 10786140); +perft_test!(position_frc_652 "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9" 5 9107175); +perft_test!(position_frc_653 "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9" 5 73871486); +perft_test!(position_frc_654 "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9" 5 16884013); +perft_test!(position_frc_655 "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9" 5 52620163); +perft_test!(position_frc_656 "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9" 5 57268492); +perft_test!(position_frc_657 "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9" 5 7049659); +perft_test!(position_frc_658 "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9" 5 22006883); +perft_test!(position_frc_659 "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9" 5 36214583); +perft_test!(position_frc_660 "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9" 5 18972778); +perft_test!(position_frc_661 "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9" 5 13532966); +perft_test!(position_frc_662 "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9" 5 21193292); +perft_test!(position_frc_663 "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9" 5 7112890); +perft_test!(position_frc_664 "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9" 5 20756770); +perft_test!(position_frc_665 "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9" 5 13722785); +perft_test!(position_frc_666 "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9" 5 18916370); +perft_test!(position_frc_667 "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9" 5 9491817); +perft_test!(position_frc_668 "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9" 5 20906017); +perft_test!(position_frc_669 "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9" 5 15308408); +perft_test!(position_frc_670 "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9" 5 10825379); +perft_test!(position_frc_671 "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9" 5 20522675); +perft_test!(position_frc_672 "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9" 5 34552118); +perft_test!(position_frc_673 "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9" 5 4834319); +perft_test!(position_frc_674 "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9" 5 12200870); +perft_test!(position_frc_675 "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9" 5 8786998); +perft_test!(position_frc_676 "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9" 5 7982978); +perft_test!(position_frc_677 "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9" 5 22493014); +perft_test!(position_frc_678 "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9" 5 27484692); +perft_test!(position_frc_679 "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9" 5 10098215); +perft_test!(position_frc_680 "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9" 5 13740891); +perft_test!(position_frc_681 "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9" 5 12079406); +perft_test!(position_frc_682 "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9" 5 13353359); +perft_test!(position_frc_683 "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9" 5 71514365); +perft_test!(position_frc_684 "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9" 5 17493373); +perft_test!(position_frc_685 "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9" 5 39736157); +perft_test!(position_frc_686 "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9" 5 21717615); +perft_test!(position_frc_687 "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9" 5 31909835); +perft_test!(position_frc_688 "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9" 5 26828059); +perft_test!(position_frc_689 "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9" 5 17337683); +perft_test!(position_frc_690 "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9" 5 15280079); +perft_test!(position_frc_691 "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9" 5 29821322); +perft_test!(position_frc_692 "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9" 5 22244193); +perft_test!(position_frc_693 "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9" 5 5576671); +perft_test!(position_frc_694 "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9" 5 15955388); +perft_test!(position_frc_695 "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9" 5 18361051); +perft_test!(position_frc_696 "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9" 5 21279560); +perft_test!(position_frc_697 "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9" 5 16347343); +perft_test!(position_frc_698 "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9" 5 13847463); +perft_test!(position_frc_699 "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9" 5 19382263); +perft_test!(position_frc_700 "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9" 5 51973672); +perft_test!(position_frc_701 "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9" 5 36347815); +perft_test!(position_frc_702 "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9" 5 13787303); +perft_test!(position_frc_703 "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9" 5 8082183); +perft_test!(position_frc_704 "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9" 5 35907489); +perft_test!(position_frc_705 "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9" 5 8858385); +perft_test!(position_frc_706 "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9" 5 8432183); +perft_test!(position_frc_707 "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9" 5 5489836); +perft_test!(position_frc_708 "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9" 5 47425783); +perft_test!(position_frc_709 "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9" 5 10822049); +perft_test!(position_frc_710 "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9" 5 20919309); +perft_test!(position_frc_711 "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9" 5 12515042); +perft_test!(position_frc_712 "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9" 5 15348335); +perft_test!(position_frc_713 "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9" 5 7519117); +perft_test!(position_frc_714 "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9" 5 7775173); +perft_test!(position_frc_715 "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9" 5 30515456); +perft_test!(position_frc_716 "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9" 5 38552638); +perft_test!(position_frc_717 "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9" 5 8725809); +perft_test!(position_frc_718 "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9" 5 15434721); +perft_test!(position_frc_719 "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9" 5 29643404); +perft_test!(position_frc_720 "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9" 5 12995202); +perft_test!(position_frc_721 "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9" 5 23529352); +perft_test!(position_frc_722 "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9" 5 45096834); +perft_test!(position_frc_723 "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9" 5 9040545); +perft_test!(position_frc_724 "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9" 5 30314172); +perft_test!(position_frc_725 "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9" 5 1400832); +perft_test!(position_frc_726 "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9" 5 22763215); +perft_test!(position_frc_727 "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9" 5 12954224); +perft_test!(position_frc_728 "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9" 5 23790033); +perft_test!(position_frc_729 "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9" 5 16926075); +perft_test!(position_frc_730 "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9" 5 12380488); +perft_test!(position_frc_731 "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9" 5 9501401); +perft_test!(position_frc_732 "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9" 5 30148787); +perft_test!(position_frc_733 "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9" 5 14848229); +perft_test!(position_frc_734 "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9" 5 7425917); +perft_test!(position_frc_735 "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9" 5 13790137); +perft_test!(position_frc_736 "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9" 5 19259490); +perft_test!(position_frc_737 "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9" 5 11490615); +perft_test!(position_frc_738 "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9" 5 17275100); +perft_test!(position_frc_739 "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9" 5 13057308); +perft_test!(position_frc_740 "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9" 5 10607781); +perft_test!(position_frc_741 "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9" 5 9514787); +perft_test!(position_frc_742 "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9" 5 17524731); +perft_test!(position_frc_743 "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9" 5 11601134); +perft_test!(position_frc_744 "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9" 5 23379040); +perft_test!(position_frc_745 "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9" 5 26485812); +perft_test!(position_frc_746 "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9" 5 17101732); +perft_test!(position_frc_747 "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9" 5 12182448); +perft_test!(position_frc_748 "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9" 5 27160490); +perft_test!(position_frc_749 "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9" 5 3454704); +perft_test!(position_frc_750 "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9" 5 23200961); +perft_test!(position_frc_751 "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9" 5 24485663); +perft_test!(position_frc_752 "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9" 5 26686205); +perft_test!(position_frc_753 "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9" 5 2352530); +perft_test!(position_frc_754 "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9" 5 27463717); +perft_test!(position_frc_755 "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9" 5 15076198); +perft_test!(position_frc_756 "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9" 5 20772996); +perft_test!(position_frc_757 "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9" 5 29735654); +perft_test!(position_frc_758 "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9" 5 15518417); +perft_test!(position_frc_759 "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9" 5 21126103); +perft_test!(position_frc_760 "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9" 5 24008129); +perft_test!(position_frc_761 "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9" 5 22243832); +perft_test!(position_frc_762 "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9" 5 8379748); +perft_test!(position_frc_763 "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9" 5 23472124); +perft_test!(position_frc_764 "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9" 5 20804424); +perft_test!(position_frc_765 "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9" 5 17180857); +perft_test!(position_frc_766 "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9" 5 7497674); +perft_test!(position_frc_767 "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9" 5 9694947); +perft_test!(position_frc_768 "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9" 5 17860156); +perft_test!(position_frc_769 "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9" 5 20981488); +perft_test!(position_frc_770 "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9" 5 13126287); +perft_test!(position_frc_771 "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9" 5 14984618); +perft_test!(position_frc_772 "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9" 5 7512432); +perft_test!(position_frc_773 "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9" 5 30642468); +perft_test!(position_frc_774 "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9" 5 8192621); +perft_test!(position_frc_775 "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9" 5 10571176); +perft_test!(position_frc_776 "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9" 5 17164382); +perft_test!(position_frc_777 "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9" 5 30933394); +perft_test!(position_frc_778 "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9" 5 10422676); +perft_test!(position_frc_779 "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9" 5 13765777); +perft_test!(position_frc_780 "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9" 5 20416668); +perft_test!(position_frc_781 "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9" 5 24049880); +perft_test!(position_frc_782 "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9" 5 44576409); +perft_test!(position_frc_783 "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9" 5 19978260); +perft_test!(position_frc_784 "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9" 5 2518864); +perft_test!(position_frc_785 "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9" 5 8922397); +perft_test!(position_frc_786 "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9" 5 9581695); +perft_test!(position_frc_787 "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9" 5 17948681); +perft_test!(position_frc_788 "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9" 5 13094823); +perft_test!(position_frc_789 "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9" 5 11029596); +perft_test!(position_frc_790 "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9" 5 31296485); +perft_test!(position_frc_791 "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9" 5 8687544); +perft_test!(position_frc_792 "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9" 5 43092716); +perft_test!(position_frc_793 "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9" 5 15450970); +perft_test!(position_frc_794 "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9" 5 17989811); +perft_test!(position_frc_795 "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9" 5 15209404); +perft_test!(position_frc_796 "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9" 5 10905865); +perft_test!(position_frc_797 "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9" 5 18084787); +perft_test!(position_frc_798 "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9" 5 8230417); +perft_test!(position_frc_799 "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9" 5 10827868); +perft_test!(position_frc_800 "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9" 5 16010135); +perft_test!(position_frc_801 "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9" 5 23746165); +perft_test!(position_frc_802 "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9" 5 5960901); +perft_test!(position_frc_803 "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9" 5 7830230); +perft_test!(position_frc_804 "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9" 5 8322614); +perft_test!(position_frc_805 "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9" 5 11105151); +perft_test!(position_frc_806 "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9" 5 14872172); +perft_test!(position_frc_807 "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9" 5 20209424); +perft_test!(position_frc_808 "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9" 5 18475618); +perft_test!(position_frc_809 "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9" 5 7891676); +perft_test!(position_frc_810 "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9" 5 27827461); +perft_test!(position_frc_811 "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9" 5 21639104); +perft_test!(position_frc_812 "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9" 5 13643783); +perft_test!(position_frc_813 "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9" 5 10066892); +perft_test!(position_frc_814 "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9" 5 9043111); +perft_test!(position_frc_815 "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9" 5 15078056); +perft_test!(position_frc_816 "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9" 5 9605845); +perft_test!(position_frc_817 "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9" 5 20360394); +perft_test!(position_frc_818 "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9" 5 10081351); +perft_test!(position_frc_819 "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9" 5 26262884); +perft_test!(position_frc_820 "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9" 5 9520963); +perft_test!(position_frc_821 "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9" 5 14354779); +perft_test!(position_frc_822 "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9" 5 12574541); +perft_test!(position_frc_823 "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9" 5 19093408); +perft_test!(position_frc_824 "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9" 5 42849564); +perft_test!(position_frc_825 "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9" 5 10587910); +perft_test!(position_frc_826 "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9" 5 17318772); +perft_test!(position_frc_827 "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9" 5 13389799); +perft_test!(position_frc_828 "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9" 5 35946987); +perft_test!(position_frc_829 "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9" 5 21014787); +perft_test!(position_frc_830 "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9" 5 16461795); +perft_test!(position_frc_831 "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9" 5 21875031); +perft_test!(position_frc_832 "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9" 5 20532790); +perft_test!(position_frc_833 "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9" 5 15156662); +perft_test!(position_frc_834 "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9" 5 22852433); +perft_test!(position_frc_835 "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9" 5 10687843); +perft_test!(position_frc_836 "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9" 5 7094988); +perft_test!(position_frc_837 "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9" 5 8671852); +perft_test!(position_frc_838 "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9" 5 12900485); +perft_test!(position_frc_839 "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9" 5 20276176); +perft_test!(position_frc_840 "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9" 5 9054028); +perft_test!(position_frc_841 "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9" 5 14697705); +perft_test!(position_frc_842 "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9" 5 10223443); +perft_test!(position_frc_843 "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9" 5 16047041); +perft_test!(position_frc_844 "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9" 5 1017864); +perft_test!(position_frc_845 "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9" 5 17192121); +perft_test!(position_frc_846 "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9" 5 11917036); +perft_test!(position_frc_847 "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9" 5 52213677); +perft_test!(position_frc_848 "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9" 5 38555608); +perft_test!(position_frc_849 "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9" 5 16453359); +perft_test!(position_frc_850 "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9" 5 10192718); +perft_test!(position_frc_851 "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9" 5 25848794); +perft_test!(position_frc_852 "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9" 5 11237919); +perft_test!(position_frc_853 "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9" 5 16025428); +perft_test!(position_frc_854 "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9" 5 23593363); +perft_test!(position_frc_855 "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9" 5 8782713); +perft_test!(position_frc_856 "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9" 5 9224232); +perft_test!(position_frc_857 "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9" 5 10587626); +perft_test!(position_frc_858 "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9" 5 7824941); +perft_test!(position_frc_859 "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9" 5 10507328); +perft_test!(position_frc_860 "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9" 5 10251465); +perft_test!(position_frc_861 "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9" 5 26241141); +perft_test!(position_frc_862 "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9" 5 20455205); +perft_test!(position_frc_863 "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9" 5 48711073); +perft_test!(position_frc_864 "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9" 5 21328001); +perft_test!(position_frc_865 "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9" 5 7928916); +perft_test!(position_frc_866 "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9" 5 12607528); +perft_test!(position_frc_867 "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9" 5 50052573); +perft_test!(position_frc_868 "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9" 5 9683808); +perft_test!(position_frc_869 "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9" 5 8239872); +perft_test!(position_frc_870 "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9" 5 5679073); +perft_test!(position_frc_871 "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9" 5 19486022); +perft_test!(position_frc_872 "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9" 5 25176664); +perft_test!(position_frc_873 "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9" 5 48216013); +perft_test!(position_frc_874 "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9" 5 6928220); +perft_test!(position_frc_875 "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9" 5 15055365); +perft_test!(position_frc_876 "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9" 5 10747407); +perft_test!(position_frc_877 "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9" 5 23063284); +perft_test!(position_frc_878 "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9" 5 10976745); +perft_test!(position_frc_879 "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9" 5 17351761); +perft_test!(position_frc_880 "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9" 5 13676371); +perft_test!(position_frc_881 "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9" 5 16639723); +perft_test!(position_frc_882 "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9" 5 25019636); +perft_test!(position_frc_883 "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9" 5 15516491); +perft_test!(position_frc_884 "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9" 5 14072641); +perft_test!(position_frc_885 "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9" 5 10776416); +perft_test!(position_frc_886 "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9" 5 15586203); +perft_test!(position_frc_887 "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9" 5 28761841); +perft_test!(position_frc_888 "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9" 5 5784206); +perft_test!(position_frc_889 "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9" 5 7147063); +perft_test!(position_frc_890 "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9" 5 10808908); +perft_test!(position_frc_891 "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9" 5 16916813); +perft_test!(position_frc_892 "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9" 5 11041820); +perft_test!(position_frc_893 "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9" 5 9395816); +perft_test!(position_frc_894 "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9" 5 10238486); +perft_test!(position_frc_895 "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9" 5 6563859); +perft_test!(position_frc_896 "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9" 5 19318355); +perft_test!(position_frc_897 "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9" 5 12610387); +perft_test!(position_frc_898 "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9" 5 13697382); +perft_test!(position_frc_899 "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9" 5 26051242); +perft_test!(position_frc_900 "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9" 5 5505063); +perft_test!(position_frc_901 "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9" 5 26676373); +perft_test!(position_frc_902 "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9" 5 16033316); +perft_test!(position_frc_903 "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9" 5 44672979); +perft_test!(position_frc_904 "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9" 5 4734999); +perft_test!(position_frc_905 "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9" 5 43832975); +perft_test!(position_frc_906 "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9" 5 9944107); +perft_test!(position_frc_907 "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9" 5 15965907); +perft_test!(position_frc_908 "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9" 5 8792550); +perft_test!(position_frc_909 "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9" 5 11978698); +perft_test!(position_frc_910 "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9" 5 11960861); +perft_test!(position_frc_911 "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9" 5 16633696); +perft_test!(position_frc_912 "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9" 5 28672582); +perft_test!(position_frc_913 "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9" 5 22840279); +perft_test!(position_frc_914 "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9" 5 13956472); +perft_test!(position_frc_915 "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9" 5 15093909); +perft_test!(position_frc_916 "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9" 5 19867800); +perft_test!(position_frc_917 "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9" 5 35143142); +perft_test!(position_frc_918 "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9" 5 17597073); +perft_test!(position_frc_919 "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9" 5 6253775); +perft_test!(position_frc_920 "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9" 5 26007841); +perft_test!(position_frc_921 "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9" 5 32688124); +perft_test!(position_frc_922 "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9" 5 15844525); +perft_test!(position_frc_923 "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9" 5 17257753); +perft_test!(position_frc_924 "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9" 5 19338246); +perft_test!(position_frc_925 "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9" 5 9700847); +perft_test!(position_frc_926 "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9" 5 15990307); +perft_test!(position_frc_927 "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9" 5 16303092); +perft_test!(position_frc_928 "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9" 5 15957628); +perft_test!(position_frc_929 "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9" 5 9688526); +perft_test!(position_frc_930 "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9" 5 3521652); +perft_test!(position_frc_931 "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9" 5 20558538); +perft_test!(position_frc_932 "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9" 5 14621108); +perft_test!(position_frc_933 "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9" 5 15605840); +perft_test!(position_frc_934 "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9" 5 9410221); +perft_test!(position_frc_935 "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9" 5 13112297); +perft_test!(position_frc_936 "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9" 5 8381483); +perft_test!(position_frc_937 "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9" 5 21894752); +perft_test!(position_frc_938 "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9" 5 57856784); +perft_test!(position_frc_939 "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9" 5 16323242); +perft_test!(position_frc_940 "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9" 5 5180716); +perft_test!(position_frc_941 "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9" 5 8813781); +perft_test!(position_frc_942 "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9" 5 6633319); +perft_test!(position_frc_943 "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9" 5 11614241); +perft_test!(position_frc_944 "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9" 5 50382104); +perft_test!(position_frc_945 "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9" 5 29205057); +perft_test!(position_frc_946 "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9" 5 25423729); +perft_test!(position_frc_947 "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9" 5 4232274); +perft_test!(position_frc_948 "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9" 5 19115128); +perft_test!(position_frc_949 "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9" 5 11170489); +perft_test!(position_frc_950 "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9" 5 31568111); +perft_test!(position_frc_951 "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9" 5 9020291); +perft_test!(position_frc_952 "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9" 5 21653203); +perft_test!(position_frc_953 "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9" 5 17150175); +perft_test!(position_frc_954 "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9" 5 21823412); +perft_test!(position_frc_955 "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9" 5 11758184); +perft_test!(position_frc_956 "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9" 5 937188); +perft_test!(position_frc_957 "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9" 5 25531358); +perft_test!(position_frc_958 "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9" 5 11484012); +perft_test!(position_frc_959 "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9" 5 31272517); +perft_test!(position_frc_960 "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9" 5 10316716); diff --git a/games/src/interface/mod.rs b/games/src/interface/mod.rs index d3f4f90..60f514d 100644 --- a/games/src/interface/mod.rs +++ b/games/src/interface/mod.rs @@ -174,7 +174,6 @@ macro_rules! set_type { derive_more::BitXorAssign, derive_more::ShlAssign, derive_more::ShrAssign, - derive_more::SubAssign, )] pub struct $name(pub $typ); @@ -265,6 +264,14 @@ macro_rules! set_type { } } + #[allow(clippy::suspicious_arithmetic_impl)] + impl std::ops::SubAssign for $name { + /// Returns the difference of `self` and `rhs` as a new BitBoard. + fn sub_assign(&mut self, rhs: Self) { + *self &= !rhs + } + } + #[allow(clippy::suspicious_arithmetic_impl)] impl std::ops::BitOr<$sq> for $name { type Output = Self; From d4d4f9683659f740237f16a46d3c228d81c60d07 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Tue, 10 Dec 2024 14:29:45 +0530 Subject: [PATCH 22/27] chore: ep pawn double pin fix --- games/src/chess/movegen.rs | 84 +++++++++++++++++++++++------------- games/src/chess/tests/mod.rs | 16 ++----- 2 files changed, 57 insertions(+), 43 deletions(-) diff --git a/games/src/chess/movegen.rs b/games/src/chess/movegen.rs index ab64320..8595915 100644 --- a/games/src/chess/movegen.rs +++ b/games/src/chess/movegen.rs @@ -1,5 +1,6 @@ use crate::interface::{ BitBoardType, Color, ColoredPieceType, MoveStore, PositionType, SetType, + SquareType, }; use super::{ @@ -189,7 +190,7 @@ impl MoveGenerationInfo<'_> { ) } - fn attacked(&self, sq: Square) -> bool { + fn attacked(&self, sq: Square, blockers: BitBoard) -> bool { let stm = self.position.side_to_move(); let p = self.enemies & self.position.piece_bb(Piece::Pawn); @@ -201,20 +202,14 @@ impl MoveGenerationInfo<'_> { !(p.is_disjoint(moves::pawn_attacks(sq, stm)) && n.is_disjoint(moves::knight(sq)) - && (b | q).is_disjoint(moves::bishop( - sq, - self.blocker ^ BitBoard::from(self.king), - )) - && (r | q).is_disjoint(moves::rook( - sq, - self.blocker ^ BitBoard::from(self.king), - )) + && (b | q).is_disjoint(moves::bishop(sq, blockers)) + && (r | q).is_disjoint(moves::rook(sq, blockers)) && k.is_disjoint(moves::king(sq))) } - fn any_attacked(&self, bb: BitBoard) -> bool { + fn any_attacked(&self, bb: BitBoard, blockers: BitBoard) -> bool { for target in bb { - if self.attacked(target) { + if self.attacked(target, blockers) { return true; } } @@ -270,25 +265,53 @@ impl MoveGenerationInfo<'_> { !self.position.side_to_move(), ); - match passanters.len() { - 0 => {} - 1 => { - movelist.push(Move::new( - unsafe { passanters.next().unwrap_unchecked() }, - target, - MoveFlag::EnPassant, - )); - } - 2 => { - for passanter in passanters { - movelist.push(Move::new( - passanter, - target, - MoveFlag::EnPassant, - )); + let passanted = unsafe { + target.down(self.position.side_to_move()).unwrap_unchecked() + }; + + let target_bb = BitBoard::from(target); + let passanted_bb = BitBoard::from(passanted); + + if !self.checkmask.is_disjoint(target_bb | passanted_bb) { + match passanters.len() { + 0 => {} + 1 => { + let passanter = + unsafe { passanters.next().unwrap_unchecked() }; + let passanter_bb = BitBoard::from(passanter); + + if (!self.pinmask_d.contains(passanter) + || self.pinmask_d.contains(target)) + && (self.king.rank() != passanter.rank() + || !self.attacked( + self.king, + self.blocker + ^ passanter_bb + ^ passanted_bb, + )) + { + movelist.push(Move::new( + passanter, + target, + MoveFlag::EnPassant, + )); + } + } + 2 => { + for passanter in passanters { + if !self.pinmask_d.contains(passanter) + || self.pinmask_d.contains(target) + { + movelist.push(Move::new( + passanter, + target, + MoveFlag::EnPassant, + )); + } + } } + _ => unreachable!(), } - _ => unreachable!(), } } } @@ -375,9 +398,10 @@ impl MoveGenerationInfo<'_> { fn king_moves>(&self, movelist: &mut ML) { let targets = moves::king(self.king) & self.territory; + let blockers = self.blocker ^ BitBoard::from(self.king); for target in targets { - if !self.attacked(target) { + if !self.attacked(target, blockers) { movelist.push(Move::new(self.king, target, MoveFlag::Normal)) } } @@ -398,7 +422,7 @@ impl MoveGenerationInfo<'_> { .blocker .is_disjoint(self.position.castling.blocker_mask(dimension)) // Castling path attackers - && !self.any_attacked(self.position.castling.attack_mask(dimension)) + && !self.any_attacked(self.position.castling.attack_mask(dimension), self.blocker) &&!self.pinmask_l.contains(rook) { movelist.push(Move::new_castling(self.king, rook, side)) diff --git a/games/src/chess/tests/mod.rs b/games/src/chess/tests/mod.rs index 2aede40..dc695c1 100644 --- a/games/src/chess/tests/mod.rs +++ b/games/src/chess/tests/mod.rs @@ -6,17 +6,8 @@ macro_rules! perft_test { ($name:ident $pos:literal $depth:literal $nodes:literal) => { #[test] fn $name() { - println!("cargo run -r {} {}", $depth, $pos); - match Position::from_str($pos) { - Ok(position) => { - println!("{}", u8::from(position.castling.rights)); - assert_eq!(perft::(position, $depth), $nodes) - } - Err(err) => { - println!("{}", err); - assert_eq!(true, false); - } - } + let position = Position::from_str($pos).unwrap(); + assert_eq!(perft::(position, $depth), $nodes) } }; } @@ -148,8 +139,7 @@ perft_test!(position_123 "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1" 5 90606); perft_test!(position_124 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1" 5 2193768); perft_test!(position_125 "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1" 5 1533145); perft_test!(position_126 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1" 5 3605103); -// TODO: en passant double pin -// perft_test!(position_127 "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1" 5 674624); +perft_test!(position_127 "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1" 5 674624); perft_test!(position_128 "rnbqkb1r/ppppp1pp/7n/4Pp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3" 5 11139762); perft_test!(position_frc_1 "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9" 5 8146062); From 556baa2c5b1778b3300aefdf284b8572aa977920 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Tue, 10 Dec 2024 14:42:19 +0530 Subject: [PATCH 23/27] chore: deeper perft tests --- games/src/chess/tests/mod.rs | 2179 +++++++++++++++++----------------- 1 file changed, 1090 insertions(+), 1089 deletions(-) diff --git a/games/src/chess/tests/mod.rs b/games/src/chess/tests/mod.rs index dc695c1..ba1c5c7 100644 --- a/games/src/chess/tests/mod.rs +++ b/games/src/chess/tests/mod.rs @@ -12,1093 +12,1094 @@ macro_rules! perft_test { }; } -// Tests taken from Ethereal -perft_test!(position_1 "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" 5 4865609); -perft_test!(position_2 "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1" 5 193690690); -perft_test!(position_3 "4k3/8/8/8/8/8/8/4K2R w K - 0 1" 5 133987); -perft_test!(position_4 "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1" 5 145232); -perft_test!(position_5 "4k2r/8/8/8/8/8/8/4K3 w k - 0 1" 5 47635); -perft_test!(position_6 "r3k3/8/8/8/8/8/8/4K3 w q - 0 1" 5 52710); -perft_test!(position_7 "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1" 5 532933); -perft_test!(position_8 "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1" 5 118882); -perft_test!(position_9 "8/8/8/8/8/8/6k1/4K2R w K - 0 1" 5 37735); -perft_test!(position_10 "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1" 5 80619); -perft_test!(position_11 "4k2r/6K1/8/8/8/8/8/8 w k - 0 1" 5 10485); -perft_test!(position_12 "r3k3/1K6/8/8/8/8/8/8 w q - 0 1" 5 20780); -perft_test!(position_13 "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1" 5 7594526); -perft_test!(position_14 "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1" 5 8153719); -perft_test!(position_15 "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1" 5 7736373); -perft_test!(position_16 "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1" 5 7878456); -perft_test!(position_17 "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 5 8198901); -perft_test!(position_18 "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 5 7710115); -perft_test!(position_19 "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1" 5 7848606); -perft_test!(position_20 "4k3/8/8/8/8/8/8/4K2R b K - 0 1" 5 47635); -perft_test!(position_21 "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1" 5 52710); -perft_test!(position_22 "4k2r/8/8/8/8/8/8/4K3 b k - 0 1" 5 133987); -perft_test!(position_23 "r3k3/8/8/8/8/8/8/4K3 b q - 0 1" 5 145232); -perft_test!(position_24 "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1" 5 118882); -perft_test!(position_25 "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1" 5 532933); -perft_test!(position_26 "8/8/8/8/8/8/6k1/4K2R b K - 0 1" 5 10485); -perft_test!(position_27 "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1" 5 20780); -perft_test!(position_28 "4k2r/6K1/8/8/8/8/8/8 b k - 0 1" 5 37735); -perft_test!(position_29 "r3k3/1K6/8/8/8/8/8/8 b q - 0 1" 5 80619); -perft_test!(position_30 "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1" 5 7594526); -perft_test!(position_31 "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1" 5 8198901); -perft_test!(position_32 "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1" 5 7710115); -perft_test!(position_33 "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1" 5 7848606); -perft_test!(position_34 "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 5 8153719); -perft_test!(position_35 "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 5 7736373); -perft_test!(position_36 "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1" 5 7878456); -perft_test!(position_37 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1" 5 570726); -perft_test!(position_38 "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1" 5 223507); -perft_test!(position_39 "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1" 5 1198299); -perft_test!(position_40 "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1" 5 38348); -perft_test!(position_41 "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1" 5 92250); -perft_test!(position_42 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1" 5 582642); -perft_test!(position_43 "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1" 5 288141); -perft_test!(position_44 "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1" 5 281190); -perft_test!(position_45 "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1" 5 92250); -perft_test!(position_46 "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1" 5 38348); -perft_test!(position_47 "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1" 5 1320507); -perft_test!(position_48 "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1" 5 1713368); -perft_test!(position_49 "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1" 5 787524); -perft_test!(position_50 "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1" 5 310862); -perft_test!(position_51 "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1" 5 530585); -perft_test!(position_52 "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1" 5 1591064); -perft_test!(position_53 "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1" 5 310862); -perft_test!(position_54 "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1" 5 787524); -perft_test!(position_55 "7k/RR6/8/8/8/8/rr6/7K w - - 0 1" 5 2161211); -perft_test!(position_56 "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1" 5 20506480); -perft_test!(position_57 "7k/RR6/8/8/8/8/rr6/7K b - - 0 1" 5 2161211); -perft_test!(position_58 "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1" 5 20521342); -perft_test!(position_59 "6kq/8/8/8/8/8/8/7K w - - 0 1" 5 14893); -perft_test!(position_60 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 5 14893); -perft_test!(position_61 "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1" 5 166741); -perft_test!(position_62 "6qk/8/8/8/8/8/8/7K b - - 0 1" 5 105749); -perft_test!(position_63 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 5 14893); -perft_test!(position_64 "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1" 5 166741); -perft_test!(position_65 "8/8/8/8/8/K7/P7/k7 w - - 0 1" 5 1347); -perft_test!(position_66 "8/8/8/8/8/7K/7P/7k w - - 0 1" 5 1347); -perft_test!(position_67 "K7/p7/k7/8/8/8/8/8 w - - 0 1" 5 342); -perft_test!(position_68 "7K/7p/7k/8/8/8/8/8 w - - 0 1" 5 342); -perft_test!(position_69 "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1" 5 7028); -perft_test!(position_70 "8/8/8/8/8/K7/P7/k7 b - - 0 1" 5 342); -perft_test!(position_71 "8/8/8/8/8/7K/7P/7k b - - 0 1" 5 342); -perft_test!(position_72 "K7/p7/k7/8/8/8/8/8 b - - 0 1" 5 1347); -perft_test!(position_73 "7K/7p/7k/8/8/8/8/8 b - - 0 1" 5 1347); -perft_test!(position_74 "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1" 5 5408); -perft_test!(position_75 "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1" 5 1814); -perft_test!(position_76 "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1" 5 1814); -perft_test!(position_77 "8/8/7k/7p/7P/7K/8/8 w - - 0 1" 5 1969); -perft_test!(position_78 "8/8/k7/p7/P7/K7/8/8 w - - 0 1" 5 1969); -perft_test!(position_79 "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1" 5 8296); -perft_test!(position_80 "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1" 5 23599); -perft_test!(position_81 "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1" 5 21637); -perft_test!(position_82 "k7/8/3p4/8/3P4/8/8/7K w - - 0 1" 5 3450); -perft_test!(position_83 "8/8/7k/7p/7P/7K/8/8 b - - 0 1" 5 1969); -perft_test!(position_84 "8/8/k7/p7/P7/K7/8/8 b - - 0 1" 5 1969); -perft_test!(position_85 "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1" 5 8296); -perft_test!(position_86 "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1" 5 21637); -perft_test!(position_87 "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1" 5 23599); -perft_test!(position_88 "k7/8/3p4/8/3P4/8/8/7K b - - 0 1" 5 3309); -perft_test!(position_89 "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1" 5 4661); -perft_test!(position_90 "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1" 5 4786); -perft_test!(position_91 "k7/8/8/7p/6P1/8/8/K7 w - - 0 1" 5 6112); -perft_test!(position_92 "k7/8/7p/8/8/6P1/8/K7 w - - 0 1" 5 4354); -perft_test!(position_93 "k7/8/8/6p1/7P/8/8/K7 w - - 0 1" 5 6112); -perft_test!(position_94 "k7/8/6p1/8/8/7P/8/K7 w - - 0 1" 5 4354); -perft_test!(position_95 "k7/8/8/3p4/4p3/8/8/7K w - - 0 1" 5 3013); -perft_test!(position_96 "k7/8/3p4/8/8/4P3/8/7K w - - 0 1" 5 4271); -perft_test!(position_97 "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1" 5 5014); -perft_test!(position_98 "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1" 5 4658); -perft_test!(position_99 "k7/8/8/7p/6P1/8/8/K7 b - - 0 1" 5 6112); -perft_test!(position_100 "k7/8/7p/8/8/6P1/8/K7 b - - 0 1" 5 4354); -perft_test!(position_101 "k7/8/8/6p1/7P/8/8/K7 b - - 0 1" 5 6112); -perft_test!(position_102 "k7/8/6p1/8/8/7P/8/K7 b - - 0 1" 5 4354); -perft_test!(position_103 "k7/8/8/3p4/4p3/8/8/7K b - - 0 1" 5 4337); -perft_test!(position_104 "k7/8/3p4/8/8/4P3/8/7K b - - 0 1" 5 4271); -perft_test!(position_105 "7k/8/8/p7/1P6/8/8/7K w - - 0 1" 5 6112); -perft_test!(position_106 "7k/8/p7/8/8/1P6/8/7K w - - 0 1" 5 4354); -perft_test!(position_107 "7k/8/8/1p6/P7/8/8/7K w - - 0 1" 5 6112); -perft_test!(position_108 "7k/8/1p6/8/8/P7/8/7K w - - 0 1" 5 4354); -perft_test!(position_109 "k7/7p/8/8/8/8/6P1/K7 w - - 0 1" 5 7574); -perft_test!(position_110 "k7/6p1/8/8/8/8/7P/K7 w - - 0 1" 5 7574); -perft_test!(position_111 "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1" 5 24122); -perft_test!(position_112 "7k/8/8/p7/1P6/8/8/7K b - - 0 1" 5 6112); -perft_test!(position_113 "7k/8/p7/8/8/1P6/8/7K b - - 0 1" 5 4354); -perft_test!(position_114 "7k/8/8/1p6/P7/8/8/7K b - - 0 1" 5 6112); -perft_test!(position_115 "7k/8/1p6/8/8/P7/8/7K b - - 0 1" 5 4354); -perft_test!(position_116 "k7/7p/8/8/8/8/6P1/K7 b - - 0 1" 5 7574); -perft_test!(position_117 "k7/6p1/8/8/8/8/7P/K7 b - - 0 1" 5 7574); -perft_test!(position_118 "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1" 5 24122); -perft_test!(position_119 "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1" 5 90606); -perft_test!(position_120 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1" 5 2193768); -perft_test!(position_121 "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1" 5 1533145); -perft_test!(position_122 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1" 5 3605103); -perft_test!(position_123 "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1" 5 90606); -perft_test!(position_124 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1" 5 2193768); -perft_test!(position_125 "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1" 5 1533145); -perft_test!(position_126 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1" 5 3605103); -perft_test!(position_127 "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1" 5 674624); -perft_test!(position_128 "rnbqkb1r/ppppp1pp/7n/4Pp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3" 5 11139762); +// Source: Ethereal/src/perft/standard.epd +perft_test!(position_std_1 "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" 6 119060324); +perft_test!(position_std_2 "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1" 5 193690690); +perft_test!(position_std_3 "4k3/8/8/8/8/8/8/4K2R w K - 0 1" 6 764643); +perft_test!(position_std_4 "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1" 6 846648); +perft_test!(position_std_5 "4k2r/8/8/8/8/8/8/4K3 w k - 0 1" 6 899442); +perft_test!(position_std_6 "r3k3/8/8/8/8/8/8/4K3 w q - 0 1" 6 1001523); +perft_test!(position_std_7 "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1" 6 2788982); +perft_test!(position_std_8 "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1" 6 3517770); +perft_test!(position_std_9 "8/8/8/8/8/8/6k1/4K2R w K - 0 1" 6 185867); +perft_test!(position_std_10 "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1" 6 413018); +perft_test!(position_std_11 "4k2r/6K1/8/8/8/8/8/8 w k - 0 1" 6 179869); +perft_test!(position_std_12 "r3k3/1K6/8/8/8/8/8/8 w q - 0 1" 6 367724); +perft_test!(position_std_13 "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1" 6 179862938); +perft_test!(position_std_14 "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1" 6 195629489); +perft_test!(position_std_15 "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1" 6 184411439); +perft_test!(position_std_16 "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1" 6 189224276); +perft_test!(position_std_17 "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 6 198328929); +perft_test!(position_std_18 "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1" 6 185959088); +perft_test!(position_std_19 "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1" 6 190755813); +perft_test!(position_std_20 "4k3/8/8/8/8/8/8/4K2R b K - 0 1" 6 899442); +perft_test!(position_std_21 "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1" 6 1001523); +perft_test!(position_std_22 "4k2r/8/8/8/8/8/8/4K3 b k - 0 1" 6 764643); +perft_test!(position_std_23 "r3k3/8/8/8/8/8/8/4K3 b q - 0 1" 6 846648); +perft_test!(position_std_24 "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1" 6 3517770); +perft_test!(position_std_25 "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1" 6 2788982); +perft_test!(position_std_26 "8/8/8/8/8/8/6k1/4K2R b K - 0 1" 6 179869); +perft_test!(position_std_27 "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1" 6 367724); +perft_test!(position_std_28 "4k2r/6K1/8/8/8/8/8/8 b k - 0 1" 6 185867); +perft_test!(position_std_29 "r3k3/1K6/8/8/8/8/8/8 b q - 0 1" 6 413018); +perft_test!(position_std_30 "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1" 6 179862938); +perft_test!(position_std_31 "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1" 6 198328929); +perft_test!(position_std_32 "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1" 6 185959088); +perft_test!(position_std_33 "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1" 6 190755813); +perft_test!(position_std_34 "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 6 195629489); +perft_test!(position_std_35 "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1" 6 184411439); +perft_test!(position_std_36 "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1" 6 189224276); +perft_test!(position_std_37 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1" 6 8107539); +perft_test!(position_std_38 "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1" 6 2594412); +perft_test!(position_std_39 "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1" 6 19870403); +perft_test!(position_std_40 "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1" 6 588695); +perft_test!(position_std_41 "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1" 6 688780); +perft_test!(position_std_42 "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1" 6 8503277); +perft_test!(position_std_43 "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1" 6 3147566); +perft_test!(position_std_44 "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1" 6 4405103); +perft_test!(position_std_45 "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1" 6 688780); +perft_test!(position_std_46 "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1" 6 588695); +perft_test!(position_std_47 "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1" 6 22823890); +perft_test!(position_std_48 "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1" 6 28861171); +perft_test!(position_std_49 "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1" 6 7881673); +perft_test!(position_std_50 "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1" 6 7382896); +perft_test!(position_std_51 "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1" 6 9250746); +perft_test!(position_std_52 "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1" 6 29027891); +perft_test!(position_std_53 "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1" 6 7382896); +perft_test!(position_std_54 "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1" 6 7881673); +perft_test!(position_std_55 "7k/RR6/8/8/8/8/rr6/7K w - - 0 1" 6 44956585); +perft_test!(position_std_56 "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1" 6 525169084); +perft_test!(position_std_57 "7k/RR6/8/8/8/8/rr6/7K b - - 0 1" 6 44956585); +perft_test!(position_std_58 "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1" 6 524966748); +perft_test!(position_std_59 "6kq/8/8/8/8/8/8/7K w - - 0 1" 6 391507); +perft_test!(position_std_60 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 6 391507); +perft_test!(position_std_61 "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1" 6 3370175); +perft_test!(position_std_62 "6qk/8/8/8/8/8/8/7K b - - 0 1" 6 419369); +perft_test!(position_std_63 "6KQ/8/8/8/8/8/8/7k b - - 0 1" 6 391507); +perft_test!(position_std_64 "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1" 6 3370175); +perft_test!(position_std_65 "8/8/8/8/8/K7/P7/k7 w - - 0 1" 6 6249); +perft_test!(position_std_66 "8/8/8/8/8/7K/7P/7k w - - 0 1" 6 6249); +perft_test!(position_std_67 "K7/p7/k7/8/8/8/8/8 w - - 0 1" 6 2343); +perft_test!(position_std_68 "7K/7p/7k/8/8/8/8/8 w - - 0 1" 6 2343); +perft_test!(position_std_69 "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1" 6 34834); +perft_test!(position_std_70 "8/8/8/8/8/K7/P7/k7 b - - 0 1" 6 2343); +perft_test!(position_std_71 "8/8/8/8/8/7K/7P/7k b - - 0 1" 6 2343); +perft_test!(position_std_72 "K7/p7/k7/8/8/8/8/8 b - - 0 1" 6 6249); +perft_test!(position_std_73 "7K/7p/7k/8/8/8/8/8 b - - 0 1" 6 6249); +perft_test!(position_std_74 "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1" 6 34822); +perft_test!(position_std_75 "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1" 6 11848); +perft_test!(position_std_76 "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1" 6 11848); +perft_test!(position_std_77 "8/8/7k/7p/7P/7K/8/8 w - - 0 1" 6 10724); +perft_test!(position_std_78 "8/8/k7/p7/P7/K7/8/8 w - - 0 1" 6 10724); +perft_test!(position_std_79 "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1" 6 53138); +perft_test!(position_std_80 "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1" 6 157093); +perft_test!(position_std_81 "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1" 6 158065); +perft_test!(position_std_82 "k7/8/3p4/8/3P4/8/8/7K w - - 0 1" 6 20960); +perft_test!(position_std_83 "8/8/7k/7p/7P/7K/8/8 b - - 0 1" 6 10724); +perft_test!(position_std_84 "8/8/k7/p7/P7/K7/8/8 b - - 0 1" 6 10724); +perft_test!(position_std_85 "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1" 6 53138); +perft_test!(position_std_86 "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1" 6 158065); +perft_test!(position_std_87 "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1" 6 157093); +perft_test!(position_std_88 "k7/8/3p4/8/3P4/8/8/7K b - - 0 1" 6 21104); +perft_test!(position_std_89 "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1" 6 32191); +perft_test!(position_std_90 "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1" 6 30980); +perft_test!(position_std_91 "k7/8/8/7p/6P1/8/8/K7 w - - 0 1" 6 41874); +perft_test!(position_std_92 "k7/8/7p/8/8/6P1/8/K7 w - - 0 1" 6 29679); +perft_test!(position_std_93 "k7/8/8/6p1/7P/8/8/K7 w - - 0 1" 6 41874); +perft_test!(position_std_94 "k7/8/6p1/8/8/7P/8/K7 w - - 0 1" 6 29679); +perft_test!(position_std_95 "k7/8/8/3p4/4p3/8/8/7K w - - 0 1" 6 22886); +perft_test!(position_std_96 "k7/8/3p4/8/8/4P3/8/7K w - - 0 1" 6 28662); +perft_test!(position_std_97 "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1" 6 32167); +perft_test!(position_std_98 "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1" 6 30749); +perft_test!(position_std_99 "k7/8/8/7p/6P1/8/8/K7 b - - 0 1" 6 41874); +perft_test!(position_std_100 "k7/8/7p/8/8/6P1/8/K7 b - - 0 1" 6 29679); +perft_test!(position_std_101 "k7/8/8/6p1/7P/8/8/K7 b - - 0 1" 6 41874); +perft_test!(position_std_102 "k7/8/6p1/8/8/7P/8/K7 b - - 0 1" 6 29679); +perft_test!(position_std_103 "k7/8/8/3p4/4p3/8/8/7K b - - 0 1" 6 22579); +perft_test!(position_std_104 "k7/8/3p4/8/8/4P3/8/7K b - - 0 1" 6 28662); +perft_test!(position_std_105 "7k/8/8/p7/1P6/8/8/7K w - - 0 1" 6 41874); +perft_test!(position_std_106 "7k/8/p7/8/8/1P6/8/7K w - - 0 1" 6 29679); +perft_test!(position_std_107 "7k/8/8/1p6/P7/8/8/7K w - - 0 1" 6 41874); +perft_test!(position_std_108 "7k/8/1p6/8/8/P7/8/7K w - - 0 1" 6 29679); +perft_test!(position_std_109 "k7/7p/8/8/8/8/6P1/K7 w - - 0 1" 6 55338); +perft_test!(position_std_110 "k7/6p1/8/8/8/8/7P/K7 w - - 0 1" 6 55338); +perft_test!(position_std_111 "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1" 6 199002); +perft_test!(position_std_112 "7k/8/8/p7/1P6/8/8/7K b - - 0 1" 6 41874); +perft_test!(position_std_113 "7k/8/p7/8/8/1P6/8/7K b - - 0 1" 6 29679); +perft_test!(position_std_114 "7k/8/8/1p6/P7/8/8/7K b - - 0 1" 6 41874); +perft_test!(position_std_115 "7k/8/1p6/8/8/P7/8/7K b - - 0 1" 6 29679); +perft_test!(position_std_116 "k7/7p/8/8/8/8/6P1/K7 b - - 0 1" 6 55338); +perft_test!(position_std_117 "k7/6p1/8/8/8/8/7P/K7 b - - 0 1" 6 55338); +perft_test!(position_std_118 "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1" 6 199002); +perft_test!(position_std_119 "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1" 6 1030499); +perft_test!(position_std_120 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1" 6 37665329); +perft_test!(position_std_121 "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1" 6 28859283); +perft_test!(position_std_122 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1" 6 71179139); +perft_test!(position_std_123 "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1" 6 1030499); +perft_test!(position_std_124 "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1" 6 37665329); +perft_test!(position_std_125 "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1" 6 28859283); +perft_test!(position_std_126 "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1" 6 71179139); +perft_test!(position_std_127 "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1" 6 11030083); +perft_test!(position_std_128 "rnbqkb1r/ppppp1pp/7n/4Pp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3" 5 11139762); -perft_test!(position_frc_1 "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9" 5 8146062); -perft_test!(position_frc_2 "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9" 5 16253601); -perft_test!(position_frc_3 "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9" 5 6417013); -perft_test!(position_frc_4 "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9" 5 9183776); -perft_test!(position_frc_5 "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9" 5 34030312); -perft_test!(position_frc_6 "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9" 5 24851983); -perft_test!(position_frc_7 "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9" 5 21093346); -perft_test!(position_frc_8 "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9" 5 13203304); -perft_test!(position_frc_9 "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9" 5 11110203); -perft_test!(position_frc_10 "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9" 5 19836606); -perft_test!(position_frc_11 "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9" 5 23114629); -perft_test!(position_frc_12 "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9" 5 21796206); -perft_test!(position_frc_13 "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9" 5 17819770); -perft_test!(position_frc_14 "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9" 5 29370838); -perft_test!(position_frc_15 "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9" 5 9482310); -perft_test!(position_frc_16 "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9" 5 24219627); -perft_test!(position_frc_17 "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9" 5 23701014); -perft_test!(position_frc_18 "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9" 5 29032175); -perft_test!(position_frc_19 "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9" 5 6718715); -perft_test!(position_frc_20 "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9" 5 14481581); -perft_test!(position_frc_21 "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9" 5 14226907); -perft_test!(position_frc_22 "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9" 5 13780398); -perft_test!(position_frc_23 "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9" 5 10815324); -perft_test!(position_frc_24 "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9" 5 12719546); -perft_test!(position_frc_25 "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9" 5 7697880); -perft_test!(position_frc_26 "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9" 5 13454573); -perft_test!(position_frc_27 "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9" 5 6194124); -perft_test!(position_frc_28 "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9" 5 8047916); -perft_test!(position_frc_29 "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9" 5 4708975); -perft_test!(position_frc_30 "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9" 5 17647882); -perft_test!(position_frc_31 "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9" 5 13055173); -perft_test!(position_frc_32 "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9" 5 17454857); -perft_test!(position_frc_33 "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9" 5 29742670); -perft_test!(position_frc_34 "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9" 5 32898113); -perft_test!(position_frc_35 "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9" 5 11735969); -perft_test!(position_frc_36 "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9" 5 15621236); -perft_test!(position_frc_37 "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9" 5 8088751); -perft_test!(position_frc_38 "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9" 5 13755384); -perft_test!(position_frc_39 "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9" 5 36218182); -perft_test!(position_frc_40 "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9" 5 8697700); -perft_test!(position_frc_41 "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9" 5 15338230); -perft_test!(position_frc_42 "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9" 5 17166700); -perft_test!(position_frc_43 "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9" 5 18162741); -perft_test!(position_frc_44 "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9" 5 10630667); -perft_test!(position_frc_45 "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9" 5 10356818); -perft_test!(position_frc_46 "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9" 5 16819085); -perft_test!(position_frc_47 "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9" 5 11594634); -perft_test!(position_frc_48 "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9" 5 14496370); -perft_test!(position_frc_49 "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9" 5 14284338); -perft_test!(position_frc_50 "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9" 5 18486027); -perft_test!(position_frc_51 "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9" 5 31801525); -perft_test!(position_frc_52 "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9" 5 11394778); -perft_test!(position_frc_53 "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9" 5 8846766); -perft_test!(position_frc_54 "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9" 5 7103549); -perft_test!(position_frc_55 "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9" 5 24714401); -perft_test!(position_frc_56 "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9" 5 15964771); -perft_test!(position_frc_57 "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9" 5 10911545); -perft_test!(position_frc_58 "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9" 5 7419372); -perft_test!(position_frc_59 "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9" 5 14233587); -perft_test!(position_frc_60 "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9" 5 22318948); -perft_test!(position_frc_61 "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9" 5 13189156); -perft_test!(position_frc_62 "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9" 5 16420659); -perft_test!(position_frc_63 "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9" 5 17342527); -perft_test!(position_frc_64 "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9" 5 15373803); -perft_test!(position_frc_65 "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9" 5 22562080); -perft_test!(position_frc_66 "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9" 5 19153245); -perft_test!(position_frc_67 "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9" 5 11906515); -perft_test!(position_frc_68 "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9" 5 10817378); -perft_test!(position_frc_69 "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9" 5 13242252); -perft_test!(position_frc_70 "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9" 5 29436320); -perft_test!(position_frc_71 "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9" 5 24321197); -perft_test!(position_frc_72 "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9" 5 37143354); -perft_test!(position_frc_73 "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9" 5 16836636); -perft_test!(position_frc_74 "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9" 5 13342771); -perft_test!(position_frc_75 "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9" 5 18761475); -perft_test!(position_frc_76 "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9" 5 12815016); -perft_test!(position_frc_77 "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9" 5 4266410); -perft_test!(position_frc_78 "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9" 5 14708490); -perft_test!(position_frc_79 "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9" 5 11993332); -perft_test!(position_frc_80 "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9" 5 8427161); -perft_test!(position_frc_81 "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9" 5 28286576); -perft_test!(position_frc_82 "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9" 5 14333034); -perft_test!(position_frc_83 "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9" 5 7545536); -perft_test!(position_frc_84 "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9" 5 23443854); -perft_test!(position_frc_85 "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9" 5 6131124); -perft_test!(position_frc_86 "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9" 5 8084701); -perft_test!(position_frc_87 "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9" 5 14529434); -perft_test!(position_frc_88 "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9" 5 20120565); -perft_test!(position_frc_89 "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9" 5 19979594); -perft_test!(position_frc_90 "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9" 5 16838099); -perft_test!(position_frc_91 "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9" 5 11343507); -perft_test!(position_frc_92 "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9" 5 23555139); -perft_test!(position_frc_93 "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9" 5 22027695); -perft_test!(position_frc_94 "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9" 5 16473376); -perft_test!(position_frc_95 "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9" 5 11420973); -perft_test!(position_frc_96 "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9" 5 28127620); -perft_test!(position_frc_97 "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9" 5 9359618); -perft_test!(position_frc_98 "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9" 5 14692779); -perft_test!(position_frc_99 "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9" 5 43256823); -perft_test!(position_frc_100 "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9" 5 16492398); -perft_test!(position_frc_101 "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9" 5 11767038); -perft_test!(position_frc_102 "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9" 5 36048727); -perft_test!(position_frc_103 "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9" 5 23143989); -perft_test!(position_frc_104 "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9" 5 19555214); -perft_test!(position_frc_105 "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9" 5 21694330); -perft_test!(position_frc_106 "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9" 5 31204371); -perft_test!(position_frc_107 "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9" 5 11856964); -perft_test!(position_frc_108 "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9" 5 21855658); -perft_test!(position_frc_109 "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9" 5 24415089); -perft_test!(position_frc_110 "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9" 5 17477825); -perft_test!(position_frc_111 "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9" 5 25251641); -perft_test!(position_frc_112 "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9" 5 16693640); -perft_test!(position_frc_113 "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9" 5 22197063); -perft_test!(position_frc_114 "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9" 5 8601011); -perft_test!(position_frc_115 "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9" 5 15583376); -perft_test!(position_frc_116 "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9" 5 19478789); -perft_test!(position_frc_117 "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9" 5 9002073); -perft_test!(position_frc_118 "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9" 5 24703467); -perft_test!(position_frc_119 "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9" 5 15556806); -perft_test!(position_frc_120 "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9" 5 88557078); -perft_test!(position_frc_121 "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9" 5 19866918); -perft_test!(position_frc_122 "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9" 5 28053260); -perft_test!(position_frc_123 "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9" 5 12681936); -perft_test!(position_frc_124 "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9" 5 22616076); -perft_test!(position_frc_125 "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9" 5 9698432); -perft_test!(position_frc_126 "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9" 5 34914919); -perft_test!(position_frc_127 "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9" 5 21141738); -perft_test!(position_frc_128 "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9" 5 14343443); -perft_test!(position_frc_129 "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9" 5 30026687); -perft_test!(position_frc_130 "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9" 5 11099382); -perft_test!(position_frc_131 "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9" 5 11208688); -perft_test!(position_frc_132 "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9" 5 9919113); -perft_test!(position_frc_133 "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9" 5 31059587); -perft_test!(position_frc_134 "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9" 5 7809837); -perft_test!(position_frc_135 "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9" 5 21981567); -perft_test!(position_frc_136 "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9" 5 22076141); -perft_test!(position_frc_137 "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9" 5 23239122); -perft_test!(position_frc_138 "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9" 5 15236287); -perft_test!(position_frc_139 "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9" 5 21284835); -perft_test!(position_frc_140 "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9" 5 56588117); -perft_test!(position_frc_141 "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9" 5 21427496); -perft_test!(position_frc_142 "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9" 5 11872805); -perft_test!(position_frc_143 "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9" 5 28520172); -perft_test!(position_frc_144 "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9" 5 21581178); -perft_test!(position_frc_145 "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9" 5 9537260); -perft_test!(position_frc_146 "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9" 5 14216070); -perft_test!(position_frc_147 "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9" 5 18547476); -perft_test!(position_frc_148 "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9" 5 16555068); -perft_test!(position_frc_149 "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9" 5 9863080); -perft_test!(position_frc_150 "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9" 5 12044358); -perft_test!(position_frc_151 "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9" 5 11806808); -perft_test!(position_frc_152 "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9" 5 42201531); -perft_test!(position_frc_153 "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9" 5 11582539); -perft_test!(position_frc_154 "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9" 5 13287051); -perft_test!(position_frc_155 "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9" 5 9968830); -perft_test!(position_frc_156 "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9" 5 13378840); -perft_test!(position_frc_157 "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9" 5 12525939); -perft_test!(position_frc_158 "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9" 5 15952533); -perft_test!(position_frc_159 "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9" 5 15865528); -perft_test!(position_frc_160 "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9" 5 14375839); -perft_test!(position_frc_161 "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9" 5 13514201); -perft_test!(position_frc_162 "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9" 5 16125924); -perft_test!(position_frc_163 "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9" 5 27792175); -perft_test!(position_frc_164 "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9" 5 26998966); -perft_test!(position_frc_165 "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9" 5 35627310); -perft_test!(position_frc_166 "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9" 5 10658989); -perft_test!(position_frc_167 "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9" 5 23957242); -perft_test!(position_frc_168 "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9" 5 9627826); -perft_test!(position_frc_169 "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9" 5 27229468); -perft_test!(position_frc_170 "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9" 5 21952444); -perft_test!(position_frc_171 "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9" 5 9244693); -perft_test!(position_frc_172 "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9" 5 9692630); -perft_test!(position_frc_173 "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9" 5 9305533); -perft_test!(position_frc_174 "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9" 5 18103280); -perft_test!(position_frc_175 "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9" 5 23868737); -perft_test!(position_frc_176 "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9" 5 54843403); -perft_test!(position_frc_177 "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9" 5 28784300); -perft_test!(position_frc_178 "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9" 5 11965544); -perft_test!(position_frc_179 "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9" 5 15966934); -perft_test!(position_frc_180 "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9" 5 6629293); -perft_test!(position_frc_181 "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9" 5 9227883); -perft_test!(position_frc_182 "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9" 5 21019301); -perft_test!(position_frc_183 "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9" 5 5760165); -perft_test!(position_frc_184 "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9" 5 22667987); -perft_test!(position_frc_185 "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9" 5 11489727); -perft_test!(position_frc_186 "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9" 5 12069159); -perft_test!(position_frc_187 "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9" 5 12167153); -perft_test!(position_frc_188 "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9" 5 35738410); -perft_test!(position_frc_189 "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9" 5 11920087); -perft_test!(position_frc_190 "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9" 5 31703749); -perft_test!(position_frc_191 "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9" 5 11371067); -perft_test!(position_frc_192 "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9" 5 24085223); -perft_test!(position_frc_193 "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9" 5 13157826); -perft_test!(position_frc_194 "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9" 5 21341087); -perft_test!(position_frc_195 "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9" 5 16391601); -perft_test!(position_frc_196 "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9" 5 32649943); -perft_test!(position_frc_197 "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9" 5 11562434); -perft_test!(position_frc_198 "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9" 5 32597704); -perft_test!(position_frc_199 "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9" 5 17761431); -perft_test!(position_frc_200 "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9" 5 32523099); -perft_test!(position_frc_201 "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9" 5 5846781); -perft_test!(position_frc_202 "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9" 5 7994547); -perft_test!(position_frc_203 "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9" 5 10845146); -perft_test!(position_frc_204 "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9" 5 38511307); -perft_test!(position_frc_205 "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9" 5 7403327); -perft_test!(position_frc_206 "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9" 5 9396521); -perft_test!(position_frc_207 "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9" 5 27463479); -perft_test!(position_frc_208 "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9" 5 18024195); -perft_test!(position_frc_209 "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9" 5 20290974); -perft_test!(position_frc_210 "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9" 5 13133439); -perft_test!(position_frc_211 "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9" 5 27610213); -perft_test!(position_frc_212 "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9" 5 30894863); -perft_test!(position_frc_213 "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9" 5 7583292); -perft_test!(position_frc_214 "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9" 5 17313279); -perft_test!(position_frc_215 "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9" 5 6218644); -perft_test!(position_frc_216 "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9" 5 24138518); -perft_test!(position_frc_217 "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9" 5 21998733); -perft_test!(position_frc_218 "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9" 5 15514933); -perft_test!(position_frc_219 "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9" 5 19185851); -perft_test!(position_frc_220 "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9" 5 53033675); -perft_test!(position_frc_221 "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9" 5 18296195); -perft_test!(position_frc_222 "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9" 5 19429491); -perft_test!(position_frc_223 "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9" 5 16065378); -perft_test!(position_frc_224 "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9" 5 10697065); -perft_test!(position_frc_225 "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9" 5 23717883); -perft_test!(position_frc_226 "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9" 5 25245957); -perft_test!(position_frc_227 "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9" 5 25128076); -perft_test!(position_frc_228 "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9" 5 9153089); -perft_test!(position_frc_229 "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9" 5 15133381); -perft_test!(position_frc_230 "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9" 5 12871967); -perft_test!(position_frc_231 "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9" 5 7777833); -perft_test!(position_frc_232 "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9" 5 22305910); -perft_test!(position_frc_233 "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9" 5 35121759); -perft_test!(position_frc_234 "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9" 5 13097064); -perft_test!(position_frc_235 "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9" 5 19715083); -perft_test!(position_frc_236 "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9" 5 11026383); -perft_test!(position_frc_237 "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9" 5 16058815); -perft_test!(position_frc_238 "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9" 5 29263502); -perft_test!(position_frc_239 "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9" 5 19532077); -perft_test!(position_frc_240 "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9" 5 16661676); -perft_test!(position_frc_241 "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9" 5 15079602); -perft_test!(position_frc_242 "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9" 5 28194726); -perft_test!(position_frc_243 "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9" 5 33195397); -perft_test!(position_frc_244 "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9" 5 26970098); -perft_test!(position_frc_245 "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9" 5 9539687); -perft_test!(position_frc_246 "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9" 5 16986290); -perft_test!(position_frc_247 "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9" 5 16906409); -perft_test!(position_frc_248 "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9" 5 12879258); -perft_test!(position_frc_249 "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9" 5 20671433); -perft_test!(position_frc_250 "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9" 5 16278120); -perft_test!(position_frc_251 "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9" 5 8763742); -perft_test!(position_frc_252 "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9" 5 15394667); -perft_test!(position_frc_253 "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9" 5 7218486); -perft_test!(position_frc_254 "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9" 5 9587439); -perft_test!(position_frc_255 "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9" 5 19867117); -perft_test!(position_frc_256 "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9" 5 17734818); -perft_test!(position_frc_257 "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9" 5 10133092); -perft_test!(position_frc_258 "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9" 5 36142423); -perft_test!(position_frc_259 "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9" 5 16897544); -perft_test!(position_frc_260 "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9" 5 5822387); -perft_test!(position_frc_261 "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9" 5 15153092); -perft_test!(position_frc_262 "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9" 5 22094260); -perft_test!(position_frc_263 "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9" 5 12225742); -perft_test!(position_frc_264 "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9" 5 24965592); -perft_test!(position_frc_265 "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9" 5 12187583); -perft_test!(position_frc_266 "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9" 5 14684565); -perft_test!(position_frc_267 "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9" 5 11663330); -perft_test!(position_frc_268 "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9" 5 28899548); -perft_test!(position_frc_269 "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9" 5 15045589); -perft_test!(position_frc_270 "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9" 5 17603960); -perft_test!(position_frc_271 "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9" 5 9569590); -perft_test!(position_frc_272 "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9" 5 15301879); -perft_test!(position_frc_273 "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9" 5 31385912); -perft_test!(position_frc_274 "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9" 5 5980981); -perft_test!(position_frc_275 "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9" 5 107234294); -perft_test!(position_frc_276 "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9" 5 26083252); -perft_test!(position_frc_277 "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9" 5 18588316); -perft_test!(position_frc_278 "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9" 5 8525056); -perft_test!(position_frc_279 "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9" 5 28465693); -perft_test!(position_frc_280 "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9" 5 6124625); -perft_test!(position_frc_281 "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9" 5 6696458); -perft_test!(position_frc_282 "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9" 5 7197322); -perft_test!(position_frc_283 "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9" 5 10755190); -perft_test!(position_frc_284 "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9" 5 6230616); -perft_test!(position_frc_285 "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9" 5 3008668); -perft_test!(position_frc_286 "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9" 5 18231199); -perft_test!(position_frc_287 "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9" 5 11132758); -perft_test!(position_frc_288 "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9" 5 16764576); -perft_test!(position_frc_289 "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9" 5 16632403); -perft_test!(position_frc_290 "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9" 5 27233018); -perft_test!(position_frc_291 "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9" 5 18608857); -perft_test!(position_frc_292 "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9" 5 18476807); -perft_test!(position_frc_293 "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9" 5 10260500); -perft_test!(position_frc_294 "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9" 5 11640416); -perft_test!(position_frc_295 "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9" 5 8604788); -perft_test!(position_frc_296 "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9" 5 7939483); -perft_test!(position_frc_297 "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9" 5 24475596); -perft_test!(position_frc_298 "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9" 5 14065717); -perft_test!(position_frc_299 "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9" 5 14404324); -perft_test!(position_frc_300 "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9" 5 8516966); -perft_test!(position_frc_301 "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9" 5 12055174); -perft_test!(position_frc_302 "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9" 5 19939053); -perft_test!(position_frc_303 "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9" 5 18110831); -perft_test!(position_frc_304 "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9" 5 24984621); -perft_test!(position_frc_305 "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9" 5 20128587); -perft_test!(position_frc_306 "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9" 5 20840078); -perft_test!(position_frc_307 "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9" 5 16109522); -perft_test!(position_frc_308 "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9" 5 12173245); -perft_test!(position_frc_309 "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9" 5 7626054); -perft_test!(position_frc_310 "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9" 5 15167248); -perft_test!(position_frc_311 "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9" 5 13706856); -perft_test!(position_frc_312 "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9" 5 16613630); -perft_test!(position_frc_313 "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9" 5 10096863); -perft_test!(position_frc_314 "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9" 5 17597164); -perft_test!(position_frc_315 "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9" 5 40918952); -perft_test!(position_frc_316 "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9" 5 11911314); -perft_test!(position_frc_317 "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9" 5 612305); -perft_test!(position_frc_318 "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9" 5 13421727); -perft_test!(position_frc_319 "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9" 5 13322502); -perft_test!(position_frc_320 "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9" 5 30458921); -perft_test!(position_frc_321 "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9" 5 14154852); -perft_test!(position_frc_322 "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9" 5 6450025); -perft_test!(position_frc_323 "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9" 5 10391021); -perft_test!(position_frc_324 "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9" 5 22873901); -perft_test!(position_frc_325 "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9" 5 17199594); -perft_test!(position_frc_326 "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9" 5 13038519); -perft_test!(position_frc_327 "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9" 5 30995969); -perft_test!(position_frc_328 "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9" 5 56747878); -perft_test!(position_frc_329 "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9" 5 19506135); -perft_test!(position_frc_330 "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9" 5 8250997); -perft_test!(position_frc_331 "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9" 5 17735648); -perft_test!(position_frc_332 "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9" 5 19192982); -perft_test!(position_frc_333 "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9" 5 8652810); -perft_test!(position_frc_334 "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9" 5 6506674); -perft_test!(position_frc_335 "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9" 5 23952941); -perft_test!(position_frc_336 "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9" 5 29602610); -perft_test!(position_frc_337 "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9" 5 5356253); -perft_test!(position_frc_338 "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9" 5 32684185); -perft_test!(position_frc_339 "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9" 5 14561181); -perft_test!(position_frc_340 "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9" 5 9307003); -perft_test!(position_frc_341 "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9" 5 23091070); -perft_test!(position_frc_342 "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9" 5 8887567); -perft_test!(position_frc_343 "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9" 5 9465555); -perft_test!(position_frc_344 "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9" 5 4160034); -perft_test!(position_frc_345 "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9" 5 5862341); -perft_test!(position_frc_346 "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9" 5 11090645); -perft_test!(position_frc_347 "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9" 5 19318837); -perft_test!(position_frc_348 "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9" 5 20145765); -perft_test!(position_frc_349 "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9" 5 10295086); -perft_test!(position_frc_350 "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9" 5 2640555); -perft_test!(position_frc_351 "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9" 5 16226660); -perft_test!(position_frc_352 "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9" 5 6826249); -perft_test!(position_frc_353 "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9" 5 7371098); -perft_test!(position_frc_354 "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9" 5 28412902); -perft_test!(position_frc_355 "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9" 5 30392925); -perft_test!(position_frc_356 "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9" 5 31185844); -perft_test!(position_frc_357 "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9" 5 14006203); -perft_test!(position_frc_358 "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9" 5 11718463); -perft_test!(position_frc_359 "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9" 5 35483796); -perft_test!(position_frc_360 "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9" 5 9329122); -perft_test!(position_frc_361 "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9" 5 5236331); -perft_test!(position_frc_362 "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9" 5 5503579); -perft_test!(position_frc_363 "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9" 5 17883987); -perft_test!(position_frc_364 "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9" 5 68070015); -perft_test!(position_frc_365 "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9" 5 32318550); -perft_test!(position_frc_366 "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9" 5 5754555); -perft_test!(position_frc_367 "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9" 5 9905109); -perft_test!(position_frc_368 "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9" 5 19133881); -perft_test!(position_frc_369 "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9" 5 13581691); -perft_test!(position_frc_370 "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9" 5 21156664); -perft_test!(position_frc_371 "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9" 5 25360295); -perft_test!(position_frc_372 "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9" 5 12817011); -perft_test!(position_frc_373 "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9" 5 9236564); -perft_test!(position_frc_374 "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9" 5 5735644); -perft_test!(position_frc_375 "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9" 5 14192779); -perft_test!(position_frc_376 "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9" 5 14322279); -perft_test!(position_frc_377 "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9" 5 15316285); -perft_test!(position_frc_378 "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9" 5 16188945); -perft_test!(position_frc_379 "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9" 5 33150360); -perft_test!(position_frc_380 "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9" 5 5506897); -perft_test!(position_frc_381 "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9" 5 11245508); -perft_test!(position_frc_382 "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9" 5 22654797); -perft_test!(position_frc_383 "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9" 5 13890077); -perft_test!(position_frc_384 "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9" 5 3588435); -perft_test!(position_frc_385 "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9" 5 11162476); -perft_test!(position_frc_386 "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9" 5 30126510); -perft_test!(position_frc_387 "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9" 5 20849374); -perft_test!(position_frc_388 "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9" 5 19494094); -perft_test!(position_frc_389 "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9" 5 27802999); -perft_test!(position_frc_390 "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9" 5 17005916); -perft_test!(position_frc_391 "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9" 5 19615756); -perft_test!(position_frc_392 "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9" 5 11032633); -perft_test!(position_frc_393 "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9" 5 20292750); -perft_test!(position_frc_394 "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9" 5 22443036); -perft_test!(position_frc_395 "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9" 5 27658191); -perft_test!(position_frc_396 "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9" 5 14733245); -perft_test!(position_frc_397 "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9" 5 12367604); -perft_test!(position_frc_398 "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9" 5 30307554); -perft_test!(position_frc_399 "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9" 5 7046501); -perft_test!(position_frc_400 "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9" 5 8191054); -perft_test!(position_frc_401 "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9" 5 8903754); -perft_test!(position_frc_402 "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9" 5 16243731); -perft_test!(position_frc_403 "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9" 5 5048497); -perft_test!(position_frc_404 "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9" 5 26302461); -perft_test!(position_frc_405 "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9" 5 22147642); -perft_test!(position_frc_406 "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9" 5 10416981); -perft_test!(position_frc_407 "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9" 5 26316355); -perft_test!(position_frc_408 "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9" 5 24738875); -perft_test!(position_frc_409 "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9" 5 9714509); -perft_test!(position_frc_410 "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9" 5 13307890); -perft_test!(position_frc_411 "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9" 5 7204345); -perft_test!(position_frc_412 "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9" 5 20036784); -perft_test!(position_frc_413 "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9" 5 16013189); -perft_test!(position_frc_414 "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9" 5 16685687); -perft_test!(position_frc_415 "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9" 5 7508201); -perft_test!(position_frc_416 "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9" 5 8721079); -perft_test!(position_frc_417 "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9" 5 27734108); -perft_test!(position_frc_418 "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9" 5 6372681); -perft_test!(position_frc_419 "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9" 5 9015901); -perft_test!(position_frc_420 "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9" 5 12099119); -perft_test!(position_frc_421 "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9" 5 11491355); -perft_test!(position_frc_422 "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9" 5 12649636); -perft_test!(position_frc_423 "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9" 5 16609220); -perft_test!(position_frc_424 "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9" 5 8687621); -perft_test!(position_frc_425 "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9" 5 22592380); -perft_test!(position_frc_426 "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9" 5 17597398); -perft_test!(position_frc_427 "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9" 5 30251988); -perft_test!(position_frc_428 "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9" 5 24945574); -perft_test!(position_frc_429 "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9" 5 19919434); -perft_test!(position_frc_430 "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9" 5 16525239); -perft_test!(position_frc_431 "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9" 5 21112751); -perft_test!(position_frc_432 "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9" 5 6196438); -perft_test!(position_frc_433 "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9" 5 20687969); -perft_test!(position_frc_434 "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9" 5 12185361); -perft_test!(position_frc_435 "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9" 5 32490040); -perft_test!(position_frc_436 "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9" 5 19885037); -perft_test!(position_frc_437 "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9" 5 18862234); -perft_test!(position_frc_438 "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9" 5 19648535); -perft_test!(position_frc_439 "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9" 5 10022614); -perft_test!(position_frc_440 "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9" 5 13909432); -perft_test!(position_frc_441 "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9" 5 22408813); -perft_test!(position_frc_442 "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9" 5 12242780); -perft_test!(position_frc_443 "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9" 5 14395828); -perft_test!(position_frc_444 "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9" 5 8239159); -perft_test!(position_frc_445 "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9" 5 9079829); -perft_test!(position_frc_446 "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9" 5 20334071); -perft_test!(position_frc_447 "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9" 5 32921537); -perft_test!(position_frc_448 "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9" 5 7015419); -perft_test!(position_frc_449 "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9" 5 22391185); -perft_test!(position_frc_450 "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9" 5 20281962); -perft_test!(position_frc_451 "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9" 5 11607818); -perft_test!(position_frc_452 "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9" 5 19239812); -perft_test!(position_frc_453 "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9" 5 28469879); -perft_test!(position_frc_454 "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9" 5 36025223); -perft_test!(position_frc_455 "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9" 5 6666787); -perft_test!(position_frc_456 "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9" 5 6963287); -perft_test!(position_frc_457 "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9" 5 11008114); -perft_test!(position_frc_458 "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9" 5 20904119); -perft_test!(position_frc_459 "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9" 5 11469548); -perft_test!(position_frc_460 "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9" 5 21247414); -perft_test!(position_frc_461 "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9" 5 20188622); -perft_test!(position_frc_462 "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9" 5 25594662); -perft_test!(position_frc_463 "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9" 5 16944425); -perft_test!(position_frc_464 "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9" 5 12865247); -perft_test!(position_frc_465 "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9" 5 10776855); -perft_test!(position_frc_466 "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9" 5 7370758); -perft_test!(position_frc_467 "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9" 5 16429837); -perft_test!(position_frc_468 "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9" 5 28095833); -perft_test!(position_frc_469 "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9" 5 32825932); -perft_test!(position_frc_470 "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9" 5 10203438); -perft_test!(position_frc_471 "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9" 5 23266182); -perft_test!(position_frc_472 "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9" 5 23075785); -perft_test!(position_frc_473 "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9" 5 16718577); -perft_test!(position_frc_474 "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9" 5 15545590); -perft_test!(position_frc_475 "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9" 5 18742426); -perft_test!(position_frc_476 "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9" 5 21591790); -perft_test!(position_frc_477 "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9" 5 15847763); -perft_test!(position_frc_478 "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9" 5 20361517); -perft_test!(position_frc_479 "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9" 5 7287368); -perft_test!(position_frc_480 "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9" 5 14301029); -perft_test!(position_frc_481 "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9" 5 9374021); -perft_test!(position_frc_482 "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9" 5 26130444); -perft_test!(position_frc_483 "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9" 5 10606831); -perft_test!(position_frc_484 "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9" 5 12077228); -perft_test!(position_frc_485 "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9" 5 19584539); -perft_test!(position_frc_486 "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9" 5 20500804); -perft_test!(position_frc_487 "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9" 5 24422614); -perft_test!(position_frc_488 "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9" 5 41108769); -perft_test!(position_frc_489 "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9" 5 12164609); -perft_test!(position_frc_490 "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9" 5 11409633); -perft_test!(position_frc_491 "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9" 5 15037464); -perft_test!(position_frc_492 "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9" 5 12214768); -perft_test!(position_frc_493 "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9" 5 8538539); -perft_test!(position_frc_494 "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9" 5 41695761); -perft_test!(position_frc_495 "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9" 5 14457245); -perft_test!(position_frc_496 "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9" 5 8080951); -perft_test!(position_frc_497 "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9" 5 15520298); -perft_test!(position_frc_498 "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9" 5 6995034); -perft_test!(position_frc_499 "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9" 5 10840256); -perft_test!(position_frc_500 "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9" 5 17438715); -perft_test!(position_frc_501 "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9" 5 16053564); -perft_test!(position_frc_502 "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9" 5 19571559); -perft_test!(position_frc_503 "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9" 5 16324542); -perft_test!(position_frc_504 "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9" 5 26363334); -perft_test!(position_frc_505 "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9" 5 7055215); -perft_test!(position_frc_506 "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9" 5 20429246); -perft_test!(position_frc_507 "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9" 5 14038570); -perft_test!(position_frc_508 "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9" 5 24299415); -perft_test!(position_frc_509 "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9" 5 18719949); -perft_test!(position_frc_510 "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9" 5 21862776); -perft_test!(position_frc_511 "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9" 5 17664543); -perft_test!(position_frc_512 "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9" 5 33322477); -perft_test!(position_frc_513 "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9" 5 15454749); -perft_test!(position_frc_514 "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9" 5 5770284); -perft_test!(position_frc_515 "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9" 5 38505058); -perft_test!(position_frc_516 "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9" 5 17820605); -perft_test!(position_frc_517 "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9" 5 10881112); -perft_test!(position_frc_518 "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9" 5 21657601); -perft_test!(position_frc_519 "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9" 5 24923473); -perft_test!(position_frc_520 "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9" 5 15992882); -perft_test!(position_frc_521 "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9" 5 19948650); -perft_test!(position_frc_522 "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9" 5 6065231); -perft_test!(position_frc_523 "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9" 5 42109356); -perft_test!(position_frc_524 "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9" 5 26632459); -perft_test!(position_frc_525 "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9" 5 13200921); -perft_test!(position_frc_526 "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9" 5 30397368); -perft_test!(position_frc_527 "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9" 5 16813114); -perft_test!(position_frc_528 "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9" 5 10554668); -perft_test!(position_frc_529 "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9" 5 7679979); -perft_test!(position_frc_530 "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9" 5 17354516); -perft_test!(position_frc_531 "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9" 5 22376575); -perft_test!(position_frc_532 "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9" 5 12730970); -perft_test!(position_frc_533 "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9" 5 21100580); -perft_test!(position_frc_534 "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9" 5 14507076); -perft_test!(position_frc_535 "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9" 5 65239153); -perft_test!(position_frc_536 "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9" 5 26202752); -perft_test!(position_frc_537 "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9" 5 16049807); -perft_test!(position_frc_538 "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9" 5 14020041); -perft_test!(position_frc_539 "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9" 5 17000613); -perft_test!(position_frc_540 "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9" 5 37415304); -perft_test!(position_frc_541 "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9" 5 52991625); -perft_test!(position_frc_542 "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9" 5 15860369); -perft_test!(position_frc_543 "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9" 5 29022529); -perft_test!(position_frc_544 "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9" 5 10522064); -perft_test!(position_frc_545 "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9" 5 26000648); -perft_test!(position_frc_546 "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9" 5 14954779); -perft_test!(position_frc_547 "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9" 5 9760752); -perft_test!(position_frc_548 "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9" 5 17602252); -perft_test!(position_frc_549 "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9" 5 33695089); -perft_test!(position_frc_550 "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9" 5 15115531); -perft_test!(position_frc_551 "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9" 5 11199653); -perft_test!(position_frc_552 "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9" 5 6831555); -perft_test!(position_frc_553 "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9" 5 19472074); -perft_test!(position_frc_554 "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9" 5 9753617); -perft_test!(position_frc_555 "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9" 5 9206957); -perft_test!(position_frc_556 "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9" 5 10708639); -perft_test!(position_frc_557 "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9" 5 39145902); -perft_test!(position_frc_558 "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9" 5 9687507); -perft_test!(position_frc_559 "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9" 5 8436136); -perft_test!(position_frc_560 "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9" 5 9139962); -perft_test!(position_frc_561 "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9" 5 20503775); -perft_test!(position_frc_562 "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9" 5 19913758); -perft_test!(position_frc_563 "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9" 5 20044474); -perft_test!(position_frc_564 "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9" 5 8204171); -perft_test!(position_frc_565 "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9" 5 16787080); -perft_test!(position_frc_566 "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9" 5 20755098); -perft_test!(position_frc_567 "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9" 5 13257198); -perft_test!(position_frc_568 "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9" 5 13012378); -perft_test!(position_frc_569 "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9" 5 11269462); -perft_test!(position_frc_570 "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9" 5 9416862); -perft_test!(position_frc_571 "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9" 5 15257204); -perft_test!(position_frc_572 "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9" 5 38722152); -perft_test!(position_frc_573 "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9" 5 8086100); -perft_test!(position_frc_574 "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9" 5 10278695); -perft_test!(position_frc_575 "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9" 5 19252739); -perft_test!(position_frc_576 "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9" 5 22172123); -perft_test!(position_frc_577 "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9" 5 17546069); -perft_test!(position_frc_578 "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9" 5 20059741); -perft_test!(position_frc_579 "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9" 5 14237097); -perft_test!(position_frc_580 "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9" 5 8849383); -perft_test!(position_frc_581 "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9" 5 24328258); -perft_test!(position_frc_582 "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9" 5 5568106); -perft_test!(position_frc_583 "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9" 5 12458875); -perft_test!(position_frc_584 "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9" 5 12187382); -perft_test!(position_frc_585 "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9" 5 12103076); -perft_test!(position_frc_586 "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9" 5 9014737); -perft_test!(position_frc_587 "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9" 5 8295874); -perft_test!(position_frc_588 "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9" 5 18961456); -perft_test!(position_frc_589 "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9" 5 10832084); -perft_test!(position_frc_590 "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9" 5 6452205); -perft_test!(position_frc_591 "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9" 5 10940750); -perft_test!(position_frc_592 "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9" 5 10870247); -perft_test!(position_frc_593 "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9" 5 16391730); -perft_test!(position_frc_594 "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9" 5 14371755); -perft_test!(position_frc_595 "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9" 5 12463801); -perft_test!(position_frc_596 "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9" 5 21852196); -perft_test!(position_frc_597 "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9" 5 12794736); -perft_test!(position_frc_598 "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9" 5 34780853); -perft_test!(position_frc_599 "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9" 5 14565370); -perft_test!(position_frc_600 "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9" 5 5282124); -perft_test!(position_frc_601 "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9" 5 12989786); -perft_test!(position_frc_602 "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9" 5 8430874); -perft_test!(position_frc_603 "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9" 5 19290675); -perft_test!(position_frc_604 "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9" 5 12976682); -perft_test!(position_frc_605 "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9" 5 10850952); -perft_test!(position_frc_606 "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9" 5 15661072); -perft_test!(position_frc_607 "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9" 5 13837270); -perft_test!(position_frc_608 "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9" 5 7215306); -perft_test!(position_frc_609 "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9" 5 9929336); -perft_test!(position_frc_610 "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9" 5 6720181); -perft_test!(position_frc_611 "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9" 5 21806428); -perft_test!(position_frc_612 "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9" 5 22079005); -perft_test!(position_frc_613 "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9" 5 10271111); -perft_test!(position_frc_614 "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9" 5 5918310); -perft_test!(position_frc_615 "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9" 5 21285553); -perft_test!(position_frc_616 "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9" 5 6051500); -perft_test!(position_frc_617 "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9" 5 11039042); -perft_test!(position_frc_618 "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9" 5 20666099); -perft_test!(position_frc_619 "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9" 5 49748034); -perft_test!(position_frc_620 "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9" 5 15384362); -perft_test!(position_frc_621 "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9" 5 11843134); -perft_test!(position_frc_622 "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9" 5 15379233); -perft_test!(position_frc_623 "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9" 5 25144295); -perft_test!(position_frc_624 "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9" 5 6825123); -perft_test!(position_frc_625 "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9" 5 13674310); -perft_test!(position_frc_626 "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9" 5 7778289); -perft_test!(position_frc_627 "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9" 5 14228372); -perft_test!(position_frc_628 "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9" 5 7752404); -perft_test!(position_frc_629 "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9" 5 7549008); -perft_test!(position_frc_630 "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9" 5 17989920); -perft_test!(position_frc_631 "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9" 5 7808375); -perft_test!(position_frc_632 "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9" 5 33318567); -perft_test!(position_frc_633 "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9" 5 26763259); -perft_test!(position_frc_634 "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9" 5 16662477); -perft_test!(position_frc_635 "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9" 5 16987110); -perft_test!(position_frc_636 "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9" 5 23983464); -perft_test!(position_frc_637 "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9" 5 21518343); -perft_test!(position_frc_638 "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9" 5 12238776); -perft_test!(position_frc_639 "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9" 5 23698701); -perft_test!(position_frc_640 "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9" 5 20138432); -perft_test!(position_frc_641 "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9" 5 6307276); -perft_test!(position_frc_642 "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9" 5 12604078); -perft_test!(position_frc_643 "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9" 5 12290985); -perft_test!(position_frc_644 "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9" 5 7861413); -perft_test!(position_frc_645 "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9" 5 8699448); -perft_test!(position_frc_646 "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9" 5 14904192); -perft_test!(position_frc_647 "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9" 5 35626426); -perft_test!(position_frc_648 "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9" 5 11859538); -perft_test!(position_frc_649 "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9" 5 9556962); -perft_test!(position_frc_650 "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9" 5 33185346); -perft_test!(position_frc_651 "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9" 5 10786140); -perft_test!(position_frc_652 "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9" 5 9107175); -perft_test!(position_frc_653 "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9" 5 73871486); -perft_test!(position_frc_654 "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9" 5 16884013); -perft_test!(position_frc_655 "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9" 5 52620163); -perft_test!(position_frc_656 "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9" 5 57268492); -perft_test!(position_frc_657 "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9" 5 7049659); -perft_test!(position_frc_658 "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9" 5 22006883); -perft_test!(position_frc_659 "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9" 5 36214583); -perft_test!(position_frc_660 "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9" 5 18972778); -perft_test!(position_frc_661 "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9" 5 13532966); -perft_test!(position_frc_662 "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9" 5 21193292); -perft_test!(position_frc_663 "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9" 5 7112890); -perft_test!(position_frc_664 "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9" 5 20756770); -perft_test!(position_frc_665 "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9" 5 13722785); -perft_test!(position_frc_666 "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9" 5 18916370); -perft_test!(position_frc_667 "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9" 5 9491817); -perft_test!(position_frc_668 "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9" 5 20906017); -perft_test!(position_frc_669 "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9" 5 15308408); -perft_test!(position_frc_670 "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9" 5 10825379); -perft_test!(position_frc_671 "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9" 5 20522675); -perft_test!(position_frc_672 "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9" 5 34552118); -perft_test!(position_frc_673 "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9" 5 4834319); -perft_test!(position_frc_674 "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9" 5 12200870); -perft_test!(position_frc_675 "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9" 5 8786998); -perft_test!(position_frc_676 "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9" 5 7982978); -perft_test!(position_frc_677 "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9" 5 22493014); -perft_test!(position_frc_678 "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9" 5 27484692); -perft_test!(position_frc_679 "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9" 5 10098215); -perft_test!(position_frc_680 "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9" 5 13740891); -perft_test!(position_frc_681 "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9" 5 12079406); -perft_test!(position_frc_682 "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9" 5 13353359); -perft_test!(position_frc_683 "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9" 5 71514365); -perft_test!(position_frc_684 "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9" 5 17493373); -perft_test!(position_frc_685 "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9" 5 39736157); -perft_test!(position_frc_686 "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9" 5 21717615); -perft_test!(position_frc_687 "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9" 5 31909835); -perft_test!(position_frc_688 "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9" 5 26828059); -perft_test!(position_frc_689 "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9" 5 17337683); -perft_test!(position_frc_690 "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9" 5 15280079); -perft_test!(position_frc_691 "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9" 5 29821322); -perft_test!(position_frc_692 "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9" 5 22244193); -perft_test!(position_frc_693 "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9" 5 5576671); -perft_test!(position_frc_694 "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9" 5 15955388); -perft_test!(position_frc_695 "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9" 5 18361051); -perft_test!(position_frc_696 "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9" 5 21279560); -perft_test!(position_frc_697 "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9" 5 16347343); -perft_test!(position_frc_698 "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9" 5 13847463); -perft_test!(position_frc_699 "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9" 5 19382263); -perft_test!(position_frc_700 "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9" 5 51973672); -perft_test!(position_frc_701 "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9" 5 36347815); -perft_test!(position_frc_702 "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9" 5 13787303); -perft_test!(position_frc_703 "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9" 5 8082183); -perft_test!(position_frc_704 "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9" 5 35907489); -perft_test!(position_frc_705 "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9" 5 8858385); -perft_test!(position_frc_706 "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9" 5 8432183); -perft_test!(position_frc_707 "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9" 5 5489836); -perft_test!(position_frc_708 "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9" 5 47425783); -perft_test!(position_frc_709 "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9" 5 10822049); -perft_test!(position_frc_710 "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9" 5 20919309); -perft_test!(position_frc_711 "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9" 5 12515042); -perft_test!(position_frc_712 "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9" 5 15348335); -perft_test!(position_frc_713 "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9" 5 7519117); -perft_test!(position_frc_714 "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9" 5 7775173); -perft_test!(position_frc_715 "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9" 5 30515456); -perft_test!(position_frc_716 "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9" 5 38552638); -perft_test!(position_frc_717 "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9" 5 8725809); -perft_test!(position_frc_718 "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9" 5 15434721); -perft_test!(position_frc_719 "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9" 5 29643404); -perft_test!(position_frc_720 "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9" 5 12995202); -perft_test!(position_frc_721 "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9" 5 23529352); -perft_test!(position_frc_722 "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9" 5 45096834); -perft_test!(position_frc_723 "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9" 5 9040545); -perft_test!(position_frc_724 "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9" 5 30314172); -perft_test!(position_frc_725 "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9" 5 1400832); -perft_test!(position_frc_726 "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9" 5 22763215); -perft_test!(position_frc_727 "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9" 5 12954224); -perft_test!(position_frc_728 "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9" 5 23790033); -perft_test!(position_frc_729 "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9" 5 16926075); -perft_test!(position_frc_730 "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9" 5 12380488); -perft_test!(position_frc_731 "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9" 5 9501401); -perft_test!(position_frc_732 "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9" 5 30148787); -perft_test!(position_frc_733 "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9" 5 14848229); -perft_test!(position_frc_734 "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9" 5 7425917); -perft_test!(position_frc_735 "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9" 5 13790137); -perft_test!(position_frc_736 "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9" 5 19259490); -perft_test!(position_frc_737 "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9" 5 11490615); -perft_test!(position_frc_738 "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9" 5 17275100); -perft_test!(position_frc_739 "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9" 5 13057308); -perft_test!(position_frc_740 "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9" 5 10607781); -perft_test!(position_frc_741 "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9" 5 9514787); -perft_test!(position_frc_742 "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9" 5 17524731); -perft_test!(position_frc_743 "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9" 5 11601134); -perft_test!(position_frc_744 "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9" 5 23379040); -perft_test!(position_frc_745 "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9" 5 26485812); -perft_test!(position_frc_746 "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9" 5 17101732); -perft_test!(position_frc_747 "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9" 5 12182448); -perft_test!(position_frc_748 "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9" 5 27160490); -perft_test!(position_frc_749 "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9" 5 3454704); -perft_test!(position_frc_750 "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9" 5 23200961); -perft_test!(position_frc_751 "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9" 5 24485663); -perft_test!(position_frc_752 "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9" 5 26686205); -perft_test!(position_frc_753 "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9" 5 2352530); -perft_test!(position_frc_754 "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9" 5 27463717); -perft_test!(position_frc_755 "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9" 5 15076198); -perft_test!(position_frc_756 "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9" 5 20772996); -perft_test!(position_frc_757 "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9" 5 29735654); -perft_test!(position_frc_758 "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9" 5 15518417); -perft_test!(position_frc_759 "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9" 5 21126103); -perft_test!(position_frc_760 "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9" 5 24008129); -perft_test!(position_frc_761 "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9" 5 22243832); -perft_test!(position_frc_762 "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9" 5 8379748); -perft_test!(position_frc_763 "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9" 5 23472124); -perft_test!(position_frc_764 "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9" 5 20804424); -perft_test!(position_frc_765 "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9" 5 17180857); -perft_test!(position_frc_766 "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9" 5 7497674); -perft_test!(position_frc_767 "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9" 5 9694947); -perft_test!(position_frc_768 "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9" 5 17860156); -perft_test!(position_frc_769 "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9" 5 20981488); -perft_test!(position_frc_770 "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9" 5 13126287); -perft_test!(position_frc_771 "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9" 5 14984618); -perft_test!(position_frc_772 "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9" 5 7512432); -perft_test!(position_frc_773 "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9" 5 30642468); -perft_test!(position_frc_774 "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9" 5 8192621); -perft_test!(position_frc_775 "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9" 5 10571176); -perft_test!(position_frc_776 "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9" 5 17164382); -perft_test!(position_frc_777 "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9" 5 30933394); -perft_test!(position_frc_778 "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9" 5 10422676); -perft_test!(position_frc_779 "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9" 5 13765777); -perft_test!(position_frc_780 "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9" 5 20416668); -perft_test!(position_frc_781 "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9" 5 24049880); -perft_test!(position_frc_782 "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9" 5 44576409); -perft_test!(position_frc_783 "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9" 5 19978260); -perft_test!(position_frc_784 "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9" 5 2518864); -perft_test!(position_frc_785 "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9" 5 8922397); -perft_test!(position_frc_786 "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9" 5 9581695); -perft_test!(position_frc_787 "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9" 5 17948681); -perft_test!(position_frc_788 "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9" 5 13094823); -perft_test!(position_frc_789 "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9" 5 11029596); -perft_test!(position_frc_790 "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9" 5 31296485); -perft_test!(position_frc_791 "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9" 5 8687544); -perft_test!(position_frc_792 "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9" 5 43092716); -perft_test!(position_frc_793 "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9" 5 15450970); -perft_test!(position_frc_794 "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9" 5 17989811); -perft_test!(position_frc_795 "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9" 5 15209404); -perft_test!(position_frc_796 "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9" 5 10905865); -perft_test!(position_frc_797 "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9" 5 18084787); -perft_test!(position_frc_798 "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9" 5 8230417); -perft_test!(position_frc_799 "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9" 5 10827868); -perft_test!(position_frc_800 "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9" 5 16010135); -perft_test!(position_frc_801 "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9" 5 23746165); -perft_test!(position_frc_802 "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9" 5 5960901); -perft_test!(position_frc_803 "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9" 5 7830230); -perft_test!(position_frc_804 "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9" 5 8322614); -perft_test!(position_frc_805 "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9" 5 11105151); -perft_test!(position_frc_806 "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9" 5 14872172); -perft_test!(position_frc_807 "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9" 5 20209424); -perft_test!(position_frc_808 "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9" 5 18475618); -perft_test!(position_frc_809 "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9" 5 7891676); -perft_test!(position_frc_810 "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9" 5 27827461); -perft_test!(position_frc_811 "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9" 5 21639104); -perft_test!(position_frc_812 "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9" 5 13643783); -perft_test!(position_frc_813 "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9" 5 10066892); -perft_test!(position_frc_814 "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9" 5 9043111); -perft_test!(position_frc_815 "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9" 5 15078056); -perft_test!(position_frc_816 "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9" 5 9605845); -perft_test!(position_frc_817 "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9" 5 20360394); -perft_test!(position_frc_818 "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9" 5 10081351); -perft_test!(position_frc_819 "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9" 5 26262884); -perft_test!(position_frc_820 "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9" 5 9520963); -perft_test!(position_frc_821 "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9" 5 14354779); -perft_test!(position_frc_822 "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9" 5 12574541); -perft_test!(position_frc_823 "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9" 5 19093408); -perft_test!(position_frc_824 "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9" 5 42849564); -perft_test!(position_frc_825 "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9" 5 10587910); -perft_test!(position_frc_826 "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9" 5 17318772); -perft_test!(position_frc_827 "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9" 5 13389799); -perft_test!(position_frc_828 "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9" 5 35946987); -perft_test!(position_frc_829 "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9" 5 21014787); -perft_test!(position_frc_830 "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9" 5 16461795); -perft_test!(position_frc_831 "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9" 5 21875031); -perft_test!(position_frc_832 "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9" 5 20532790); -perft_test!(position_frc_833 "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9" 5 15156662); -perft_test!(position_frc_834 "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9" 5 22852433); -perft_test!(position_frc_835 "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9" 5 10687843); -perft_test!(position_frc_836 "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9" 5 7094988); -perft_test!(position_frc_837 "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9" 5 8671852); -perft_test!(position_frc_838 "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9" 5 12900485); -perft_test!(position_frc_839 "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9" 5 20276176); -perft_test!(position_frc_840 "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9" 5 9054028); -perft_test!(position_frc_841 "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9" 5 14697705); -perft_test!(position_frc_842 "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9" 5 10223443); -perft_test!(position_frc_843 "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9" 5 16047041); -perft_test!(position_frc_844 "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9" 5 1017864); -perft_test!(position_frc_845 "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9" 5 17192121); -perft_test!(position_frc_846 "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9" 5 11917036); -perft_test!(position_frc_847 "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9" 5 52213677); -perft_test!(position_frc_848 "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9" 5 38555608); -perft_test!(position_frc_849 "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9" 5 16453359); -perft_test!(position_frc_850 "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9" 5 10192718); -perft_test!(position_frc_851 "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9" 5 25848794); -perft_test!(position_frc_852 "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9" 5 11237919); -perft_test!(position_frc_853 "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9" 5 16025428); -perft_test!(position_frc_854 "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9" 5 23593363); -perft_test!(position_frc_855 "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9" 5 8782713); -perft_test!(position_frc_856 "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9" 5 9224232); -perft_test!(position_frc_857 "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9" 5 10587626); -perft_test!(position_frc_858 "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9" 5 7824941); -perft_test!(position_frc_859 "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9" 5 10507328); -perft_test!(position_frc_860 "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9" 5 10251465); -perft_test!(position_frc_861 "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9" 5 26241141); -perft_test!(position_frc_862 "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9" 5 20455205); -perft_test!(position_frc_863 "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9" 5 48711073); -perft_test!(position_frc_864 "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9" 5 21328001); -perft_test!(position_frc_865 "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9" 5 7928916); -perft_test!(position_frc_866 "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9" 5 12607528); -perft_test!(position_frc_867 "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9" 5 50052573); -perft_test!(position_frc_868 "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9" 5 9683808); -perft_test!(position_frc_869 "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9" 5 8239872); -perft_test!(position_frc_870 "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9" 5 5679073); -perft_test!(position_frc_871 "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9" 5 19486022); -perft_test!(position_frc_872 "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9" 5 25176664); -perft_test!(position_frc_873 "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9" 5 48216013); -perft_test!(position_frc_874 "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9" 5 6928220); -perft_test!(position_frc_875 "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9" 5 15055365); -perft_test!(position_frc_876 "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9" 5 10747407); -perft_test!(position_frc_877 "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9" 5 23063284); -perft_test!(position_frc_878 "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9" 5 10976745); -perft_test!(position_frc_879 "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9" 5 17351761); -perft_test!(position_frc_880 "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9" 5 13676371); -perft_test!(position_frc_881 "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9" 5 16639723); -perft_test!(position_frc_882 "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9" 5 25019636); -perft_test!(position_frc_883 "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9" 5 15516491); -perft_test!(position_frc_884 "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9" 5 14072641); -perft_test!(position_frc_885 "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9" 5 10776416); -perft_test!(position_frc_886 "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9" 5 15586203); -perft_test!(position_frc_887 "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9" 5 28761841); -perft_test!(position_frc_888 "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9" 5 5784206); -perft_test!(position_frc_889 "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9" 5 7147063); -perft_test!(position_frc_890 "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9" 5 10808908); -perft_test!(position_frc_891 "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9" 5 16916813); -perft_test!(position_frc_892 "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9" 5 11041820); -perft_test!(position_frc_893 "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9" 5 9395816); -perft_test!(position_frc_894 "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9" 5 10238486); -perft_test!(position_frc_895 "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9" 5 6563859); -perft_test!(position_frc_896 "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9" 5 19318355); -perft_test!(position_frc_897 "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9" 5 12610387); -perft_test!(position_frc_898 "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9" 5 13697382); -perft_test!(position_frc_899 "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9" 5 26051242); -perft_test!(position_frc_900 "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9" 5 5505063); -perft_test!(position_frc_901 "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9" 5 26676373); -perft_test!(position_frc_902 "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9" 5 16033316); -perft_test!(position_frc_903 "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9" 5 44672979); -perft_test!(position_frc_904 "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9" 5 4734999); -perft_test!(position_frc_905 "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9" 5 43832975); -perft_test!(position_frc_906 "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9" 5 9944107); -perft_test!(position_frc_907 "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9" 5 15965907); -perft_test!(position_frc_908 "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9" 5 8792550); -perft_test!(position_frc_909 "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9" 5 11978698); -perft_test!(position_frc_910 "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9" 5 11960861); -perft_test!(position_frc_911 "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9" 5 16633696); -perft_test!(position_frc_912 "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9" 5 28672582); -perft_test!(position_frc_913 "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9" 5 22840279); -perft_test!(position_frc_914 "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9" 5 13956472); -perft_test!(position_frc_915 "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9" 5 15093909); -perft_test!(position_frc_916 "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9" 5 19867800); -perft_test!(position_frc_917 "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9" 5 35143142); -perft_test!(position_frc_918 "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9" 5 17597073); -perft_test!(position_frc_919 "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9" 5 6253775); -perft_test!(position_frc_920 "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9" 5 26007841); -perft_test!(position_frc_921 "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9" 5 32688124); -perft_test!(position_frc_922 "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9" 5 15844525); -perft_test!(position_frc_923 "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9" 5 17257753); -perft_test!(position_frc_924 "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9" 5 19338246); -perft_test!(position_frc_925 "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9" 5 9700847); -perft_test!(position_frc_926 "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9" 5 15990307); -perft_test!(position_frc_927 "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9" 5 16303092); -perft_test!(position_frc_928 "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9" 5 15957628); -perft_test!(position_frc_929 "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9" 5 9688526); -perft_test!(position_frc_930 "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9" 5 3521652); -perft_test!(position_frc_931 "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9" 5 20558538); -perft_test!(position_frc_932 "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9" 5 14621108); -perft_test!(position_frc_933 "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9" 5 15605840); -perft_test!(position_frc_934 "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9" 5 9410221); -perft_test!(position_frc_935 "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9" 5 13112297); -perft_test!(position_frc_936 "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9" 5 8381483); -perft_test!(position_frc_937 "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9" 5 21894752); -perft_test!(position_frc_938 "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9" 5 57856784); -perft_test!(position_frc_939 "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9" 5 16323242); -perft_test!(position_frc_940 "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9" 5 5180716); -perft_test!(position_frc_941 "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9" 5 8813781); -perft_test!(position_frc_942 "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9" 5 6633319); -perft_test!(position_frc_943 "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9" 5 11614241); -perft_test!(position_frc_944 "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9" 5 50382104); -perft_test!(position_frc_945 "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9" 5 29205057); -perft_test!(position_frc_946 "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9" 5 25423729); -perft_test!(position_frc_947 "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9" 5 4232274); -perft_test!(position_frc_948 "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9" 5 19115128); -perft_test!(position_frc_949 "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9" 5 11170489); -perft_test!(position_frc_950 "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9" 5 31568111); -perft_test!(position_frc_951 "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9" 5 9020291); -perft_test!(position_frc_952 "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9" 5 21653203); -perft_test!(position_frc_953 "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9" 5 17150175); -perft_test!(position_frc_954 "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9" 5 21823412); -perft_test!(position_frc_955 "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9" 5 11758184); -perft_test!(position_frc_956 "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9" 5 937188); -perft_test!(position_frc_957 "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9" 5 25531358); -perft_test!(position_frc_958 "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9" 5 11484012); -perft_test!(position_frc_959 "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9" 5 31272517); -perft_test!(position_frc_960 "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9" 5 10316716); +// Source: Ethereal/src/perft/fischer.epd +perft_test!(position_frc_1 "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9" 6 227689589); +perft_test!(position_frc_2 "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9" 6 590751109); +perft_test!(position_frc_3 "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9" 6 177654692); +perft_test!(position_frc_4 "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9" 6 274103539); +perft_test!(position_frc_5 "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9" 6 1250970898); +perft_test!(position_frc_6 "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9" 6 775718317); +perft_test!(position_frc_7 "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9" 6 649209803); +perft_test!(position_frc_8 "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9" 6 377184252); +perft_test!(position_frc_9 "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9" 6 293989890); +perft_test!(position_frc_10 "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9" 6 594527992); +perft_test!(position_frc_11 "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9" 6 646390782); +perft_test!(position_frc_12 "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9" 6 651054626); +perft_test!(position_frc_13 "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9" 6 544866674); +perft_test!(position_frc_14 "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9" 6 783201510); +perft_test!(position_frc_15 "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9" 6 233468620); +perft_test!(position_frc_16 "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9" 6 776836316); +perft_test!(position_frc_17 "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9" 6 809194268); +perft_test!(position_frc_18 "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9" 6 1008880643); +perft_test!(position_frc_19 "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9" 6 193594729); +perft_test!(position_frc_20 "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9" 6 457140569); +perft_test!(position_frc_21 "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9" 6 400942568); +perft_test!(position_frc_22 "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9" 6 354122358); +perft_test!(position_frc_23 "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9" 6 254026570); +perft_test!(position_frc_24 "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9" 6 339132046); +perft_test!(position_frc_25 "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9" 6 207028745); +perft_test!(position_frc_26 "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9" 6 345445468); +perft_test!(position_frc_27 "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9" 6 152861936); +perft_test!(position_frc_28 "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9" 6 249171636); +perft_test!(position_frc_29 "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9" 6 112278808); +perft_test!(position_frc_30 "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9" 6 593457788); +perft_test!(position_frc_31 "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9" 6 352398011); +perft_test!(position_frc_32 "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9" 6 483785639); +perft_test!(position_frc_33 "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9" 6 702867204); +perft_test!(position_frc_34 "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9" 6 1047360456); +perft_test!(position_frc_35 "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9" 6 344211589); +perft_test!(position_frc_36 "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9" 6 415766465); +perft_test!(position_frc_37 "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9" 6 223068417); +perft_test!(position_frc_38 "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9" 6 357222394); +perft_test!(position_frc_39 "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9" 6 1202830851); +perft_test!(position_frc_40 "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9" 6 201455191); +perft_test!(position_frc_41 "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9" 6 484638597); +perft_test!(position_frc_42 "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9" 6 450069742); +perft_test!(position_frc_43 "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9" 6 641708630); +perft_test!(position_frc_44 "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9" 6 279474189); +perft_test!(position_frc_45 "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9" 6 301583306); +perft_test!(position_frc_46 "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9" 6 516796736); +perft_test!(position_frc_47 "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9" 6 322745925); +perft_test!(position_frc_48 "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9" 6 468608864); +perft_test!(position_frc_49 "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9" 6 434008567); +perft_test!(position_frc_50 "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9" 6 616653869); +perft_test!(position_frc_51 "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9" 6 1075147725); +perft_test!(position_frc_52 "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9" 6 310589129); +perft_test!(position_frc_53 "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9" 6 229270702); +perft_test!(position_frc_54 "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9" 6 217108001); +perft_test!(position_frc_55 "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9" 6 645835197); +perft_test!(position_frc_56 "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9" 6 464662032); +perft_test!(position_frc_57 "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9" 6 320838556); +perft_test!(position_frc_58 "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9" 6 165945904); +perft_test!(position_frc_59 "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9" 6 373744834); +perft_test!(position_frc_60 "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9" 6 619857455); +perft_test!(position_frc_61 "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9" 6 354689323); +perft_test!(position_frc_62 "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9" 6 519075930); +perft_test!(position_frc_63 "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9" 6 556144017); +perft_test!(position_frc_64 "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9" 6 406016364); +perft_test!(position_frc_65 "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9" 6 662029574); +perft_test!(position_frc_66 "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9" 6 562738257); +perft_test!(position_frc_67 "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9" 6 338092952); +perft_test!(position_frc_68 "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9" 6 311138112); +perft_test!(position_frc_69 "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9" 6 373557073); +perft_test!(position_frc_70 "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9" 6 957904151); +perft_test!(position_frc_71 "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9" 6 630396940); +perft_test!(position_frc_72 "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9" 6 1124883780); +perft_test!(position_frc_73 "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9" 6 416139320); +perft_test!(position_frc_74 "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9" 6 363074681); +perft_test!(position_frc_75 "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9" 6 617932151); +perft_test!(position_frc_76 "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9" 6 312798696); +perft_test!(position_frc_77 "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9" 6 149176979); +perft_test!(position_frc_78 "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9" 6 397268628); +perft_test!(position_frc_79 "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9" 6 308518181); +perft_test!(position_frc_80 "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9" 6 252274233); +perft_test!(position_frc_81 "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9" 6 1042120495); +perft_test!(position_frc_82 "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9" 6 361900466); +perft_test!(position_frc_83 "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9" 6 179579818); +perft_test!(position_frc_84 "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9" 6 686365049); +perft_test!(position_frc_85 "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9" 6 160393505); +perft_test!(position_frc_86 "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9" 6 193484216); +perft_test!(position_frc_87 "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9" 6 384837696); +perft_test!(position_frc_88 "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9" 6 641832725); +perft_test!(position_frc_89 "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9" 6 549437308); +perft_test!(position_frc_90 "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9" 6 555230555); +perft_test!(position_frc_91 "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9" 6 334123513); +perft_test!(position_frc_92 "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9" 6 686250413); +perft_test!(position_frc_93 "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9" 6 696353497); +perft_test!(position_frc_94 "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9" 6 532214177); +perft_test!(position_frc_95 "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9" 6 321855685); +perft_test!(position_frc_96 "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9" 6 799738334); +perft_test!(position_frc_97 "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9" 6 273795898); +perft_test!(position_frc_98 "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9" 6 445827351); +perft_test!(position_frc_99 "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9" 6 1456721391); +perft_test!(position_frc_100 "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9" 6 456983120); +perft_test!(position_frc_101 "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9" 6 335414976); +perft_test!(position_frc_102 "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9" 6 1290346802); +perft_test!(position_frc_103 "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9" 6 673147648); +perft_test!(position_frc_104 "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9" 6 530475036); +perft_test!(position_frc_105 "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9" 6 619907316); +perft_test!(position_frc_106 "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9" 6 958455898); +perft_test!(position_frc_107 "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9" 6 336672890); +perft_test!(position_frc_108 "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9" 6 706272554); +perft_test!(position_frc_109 "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9" 6 866744329); +perft_test!(position_frc_110 "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9" 6 539674275); +perft_test!(position_frc_111 "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9" 6 869525254); +perft_test!(position_frc_112 "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9" 6 410115900); +perft_test!(position_frc_113 "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9" 6 696399065); +perft_test!(position_frc_114 "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9" 6 225530258); +perft_test!(position_frc_115 "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9" 6 468399900); +perft_test!(position_frc_116 "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9" 6 515473678); +perft_test!(position_frc_117 "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9" 6 228726497); +perft_test!(position_frc_118 "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9" 6 757166494); +perft_test!(position_frc_119 "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9" 6 353235120); +perft_test!(position_frc_120 "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9" 6 3589649998); +perft_test!(position_frc_121 "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9" 6 737239330); +perft_test!(position_frc_122 "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9" 6 804687975); +perft_test!(position_frc_123 "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9" 6 351623879); +perft_test!(position_frc_124 "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9" 6 666227466); +perft_test!(position_frc_125 "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9" 6 274064911); +perft_test!(position_frc_126 "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9" 6 1233362066); +perft_test!(position_frc_127 "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9" 6 621142773); +perft_test!(position_frc_128 "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9" 6 481405144); +perft_test!(position_frc_129 "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9" 6 968109774); +perft_test!(position_frc_130 "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9" 6 294180723); +perft_test!(position_frc_131 "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9" 6 302955778); +perft_test!(position_frc_132 "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9" 6 284592289); +perft_test!(position_frc_133 "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9" 6 1111986835); +perft_test!(position_frc_134 "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9" 6 216997152); +perft_test!(position_frc_135 "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9" 6 664886187); +perft_test!(position_frc_136 "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9" 6 670296871); +perft_test!(position_frc_137 "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9" 6 634260266); +perft_test!(position_frc_138 "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9" 6 398759980); +perft_test!(position_frc_139 "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9" 6 514864869); +perft_test!(position_frc_140 "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9" 6 1850696281); +perft_test!(position_frc_141 "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9" 6 650939962); +perft_test!(position_frc_142 "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9" 6 327545120); +perft_test!(position_frc_143 "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9" 6 995356563); +perft_test!(position_frc_144 "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9" 6 732696327); +perft_test!(position_frc_145 "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9" 6 233549184); +perft_test!(position_frc_146 "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9" 6 406225409); +perft_test!(position_frc_147 "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9" 6 471443091); +perft_test!(position_frc_148 "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9" 6 458045505); +perft_test!(position_frc_149 "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9" 6 269284081); +perft_test!(position_frc_150 "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9" 6 360311412); +perft_test!(position_frc_151 "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9" 6 303338935); +perft_test!(position_frc_152 "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9" 6 1239888683); +perft_test!(position_frc_153 "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9" 6 320997679); +perft_test!(position_frc_154 "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9" 6 457010195); +perft_test!(position_frc_155 "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9" 6 281344367); +perft_test!(position_frc_156 "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9" 6 396575613); +perft_test!(position_frc_157 "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9" 6 358763789); +perft_test!(position_frc_158 "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9" 6 439046803); +perft_test!(position_frc_159 "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9" 6 454532806); +perft_test!(position_frc_160 "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9" 6 435585252); +perft_test!(position_frc_161 "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9" 6 364421088); +perft_test!(position_frc_162 "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9" 6 442508159); +perft_test!(position_frc_163 "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9" 6 719015345); +perft_test!(position_frc_164 "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9" 6 702903862); +perft_test!(position_frc_165 "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9" 6 1310683359); +perft_test!(position_frc_166 "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9" 6 386307449); +perft_test!(position_frc_167 "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9" 6 913710194); +perft_test!(position_frc_168 "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9" 6 285900573); +perft_test!(position_frc_169 "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9" 6 930799376); +perft_test!(position_frc_170 "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9" 6 623156747); +perft_test!(position_frc_171 "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9" 6 264088392); +perft_test!(position_frc_172 "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9" 6 247479180); +perft_test!(position_frc_173 "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9" 6 268612479); +perft_test!(position_frc_174 "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9" 6 454569900); +perft_test!(position_frc_175 "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9" 6 747991356); +perft_test!(position_frc_176 "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9" 6 1898432768); +perft_test!(position_frc_177 "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9" 6 784569826); +perft_test!(position_frc_178 "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9" 6 311309576); +perft_test!(position_frc_179 "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9" 6 467132503); +perft_test!(position_frc_180 "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9" 6 202528241); +perft_test!(position_frc_181 "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9" 6 247634489); +perft_test!(position_frc_182 "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9" 6 542954168); +perft_test!(position_frc_183 "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9" 6 146614723); +perft_test!(position_frc_184 "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9" 6 760795567); +perft_test!(position_frc_185 "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9" 6 324948755); +perft_test!(position_frc_186 "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9" 6 269922838); +perft_test!(position_frc_187 "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9" 6 312633873); +perft_test!(position_frc_188 "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9" 6 1060661628); +perft_test!(position_frc_189 "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9" 6 331498921); +perft_test!(position_frc_190 "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9" 6 980306735); +perft_test!(position_frc_191 "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9" 6 325556465); +perft_test!(position_frc_192 "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9" 6 645633370); +perft_test!(position_frc_193 "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9" 6 389603029); +perft_test!(position_frc_194 "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9" 6 719712622); +perft_test!(position_frc_195 "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9" 6 511725087); +perft_test!(position_frc_196 "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9" 6 962536105); +perft_test!(position_frc_197 "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9" 6 301166330); +perft_test!(position_frc_198 "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9" 6 1075429389); +perft_test!(position_frc_199 "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9" 6 650603534); +perft_test!(position_frc_200 "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9" 6 955802240); +perft_test!(position_frc_201 "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9" 6 140714047); +perft_test!(position_frc_202 "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9" 6 243724815); +perft_test!(position_frc_203 "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9" 6 268229097); +perft_test!(position_frc_204 "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9" 6 1104094381); +perft_test!(position_frc_205 "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9" 6 200581103); +perft_test!(position_frc_206 "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9" 6 255676649); +perft_test!(position_frc_207 "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9" 6 847726572); +perft_test!(position_frc_208 "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9" 6 595947631); +perft_test!(position_frc_209 "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9" 6 600195008); +perft_test!(position_frc_210 "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9" 6 390886040); +perft_test!(position_frc_211 "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9" 6 880739164); +perft_test!(position_frc_212 "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9" 6 985384035); +perft_test!(position_frc_213 "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9" 6 175376176); +perft_test!(position_frc_214 "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9" 6 507140861); +perft_test!(position_frc_215 "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9" 6 168704845); +perft_test!(position_frc_216 "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9" 6 806554650); +perft_test!(position_frc_217 "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9" 6 583349773); +perft_test!(position_frc_218 "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9" 6 459533767); +perft_test!(position_frc_219 "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9" 6 616508881); +perft_test!(position_frc_220 "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9" 6 2139267832); +perft_test!(position_frc_221 "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9" 6 628403401); +perft_test!(position_frc_222 "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9" 6 595493802); +perft_test!(position_frc_223 "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9" 6 483037840); +perft_test!(position_frc_224 "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9" 6 289472497); +perft_test!(position_frc_225 "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9" 6 682154649); +perft_test!(position_frc_226 "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9" 6 727424329); +perft_test!(position_frc_227 "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9" 6 745401024); +perft_test!(position_frc_228 "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9" 6 234841945); +perft_test!(position_frc_229 "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9" 6 439344945); +perft_test!(position_frc_230 "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9" 6 380436777); +perft_test!(position_frc_231 "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9" 6 234905172); +perft_test!(position_frc_232 "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9" 6 672322762); +perft_test!(position_frc_233 "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9" 6 1418677099); +perft_test!(position_frc_234 "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9" 6 345294379); +perft_test!(position_frc_235 "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9" 6 535650233); +perft_test!(position_frc_236 "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9" 6 290708878); +perft_test!(position_frc_237 "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9" 6 485460242); +perft_test!(position_frc_238 "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9" 6 791963709); +perft_test!(position_frc_239 "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9" 6 593181101); +perft_test!(position_frc_240 "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9" 6 487354613); +perft_test!(position_frc_241 "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9" 6 488924040); +perft_test!(position_frc_242 "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9" 6 801757709); +perft_test!(position_frc_243 "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9" 6 1036498304); +perft_test!(position_frc_244 "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9" 6 788040469); +perft_test!(position_frc_245 "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9" 6 284426039); +perft_test!(position_frc_246 "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9" 6 521817800); +perft_test!(position_frc_247 "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9" 6 390324794); +perft_test!(position_frc_248 "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9" 6 376652259); +perft_test!(position_frc_249 "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9" 6 568524724); +perft_test!(position_frc_250 "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9" 6 423649784); +perft_test!(position_frc_251 "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9" 6 206993496); +perft_test!(position_frc_252 "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9" 6 443506342); +perft_test!(position_frc_253 "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9" 6 193586674); +perft_test!(position_frc_254 "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9" 6 259830255); +perft_test!(position_frc_255 "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9" 6 658535326); +perft_test!(position_frc_256 "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9" 6 535094237); +perft_test!(position_frc_257 "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9" 6 288041554); +perft_test!(position_frc_258 "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9" 6 1361341249); +perft_test!(position_frc_259 "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9" 6 367503974); +perft_test!(position_frc_260 "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9" 6 180936551); +perft_test!(position_frc_261 "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9" 6 425149249); +perft_test!(position_frc_262 "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9" 6 609377239); +perft_test!(position_frc_263 "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9" 6 301834282); +perft_test!(position_frc_264 "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9" 6 799182442); +perft_test!(position_frc_265 "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9" 6 336872952); +perft_test!(position_frc_266 "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9" 6 394951291); +perft_test!(position_frc_267 "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9" 6 283583340); +perft_test!(position_frc_268 "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9" 6 759875563); +perft_test!(position_frc_269 "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9" 6 445074372); +perft_test!(position_frc_270 "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9" 6 592121050); +perft_test!(position_frc_271 "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9" 6 206509331); +perft_test!(position_frc_272 "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9" 6 410843713); +perft_test!(position_frc_273 "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9" 6 903831981); +perft_test!(position_frc_274 "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9" 6 133080499); +perft_test!(position_frc_275 "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9" 6 3651608327); +perft_test!(position_frc_276 "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9" 6 846682836); +perft_test!(position_frc_277 "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9" 6 512048946); +perft_test!(position_frc_278 "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9" 6 247615348); +perft_test!(position_frc_279 "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9" 6 783048748); +perft_test!(position_frc_280 "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9" 6 154766108); +perft_test!(position_frc_281 "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9" 6 165253524); +perft_test!(position_frc_282 "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9" 6 188021682); +perft_test!(position_frc_283 "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9" 6 220058991); +perft_test!(position_frc_284 "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9" 6 180748649); +perft_test!(position_frc_285 "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9" 6 82706705); +perft_test!(position_frc_286 "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9" 6 511686397); +perft_test!(position_frc_287 "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9" 6 386064577); +perft_test!(position_frc_288 "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9" 6 346185058); +perft_test!(position_frc_289 "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9" 6 515838333); +perft_test!(position_frc_290 "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9" 6 813751250); +perft_test!(position_frc_291 "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9" 6 480498340); +perft_test!(position_frc_292 "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9" 6 582542257); +perft_test!(position_frc_293 "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9" 6 279222412); +perft_test!(position_frc_294 "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9" 6 293541380); +perft_test!(position_frc_295 "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9" 6 299491047); +perft_test!(position_frc_296 "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9" 6 229142178); +perft_test!(position_frc_297 "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9" 6 719842237); +perft_test!(position_frc_298 "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9" 6 410130412); +perft_test!(position_frc_299 "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9" 6 424279467); +perft_test!(position_frc_300 "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9" 6 228074630); +perft_test!(position_frc_301 "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9" 6 313276304); +perft_test!(position_frc_302 "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9" 6 718075943); +perft_test!(position_frc_303 "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9" 6 549019739); +perft_test!(position_frc_304 "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9" 6 901444251); +perft_test!(position_frc_305 "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9" 6 600207069); +perft_test!(position_frc_306 "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9" 6 775795187); +perft_test!(position_frc_307 "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9" 6 492933398); +perft_test!(position_frc_308 "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9" 6 329661421); +perft_test!(position_frc_309 "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9" 6 188215608); +perft_test!(position_frc_310 "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9" 6 399015237); +perft_test!(position_frc_311 "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9" 6 291708797); +perft_test!(position_frc_312 "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9" 6 379344541); +perft_test!(position_frc_313 "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9" 6 294900903); +perft_test!(position_frc_314 "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9" 6 428786656); +perft_test!(position_frc_315 "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9" 6 1126603824); +perft_test!(position_frc_316 "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9" 6 342563372); +perft_test!(position_frc_317 "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9" 6 17040200); +perft_test!(position_frc_318 "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9" 6 403551903); +perft_test!(position_frc_319 "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9" 6 403441498); +perft_test!(position_frc_320 "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9" 6 824344087); +perft_test!(position_frc_321 "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9" 6 450893738); +perft_test!(position_frc_322 "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9" 6 175593967); +perft_test!(position_frc_323 "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9" 6 259629603); +perft_test!(position_frc_324 "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9" 6 649556666); +perft_test!(position_frc_325 "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9" 6 512134836); +perft_test!(position_frc_326 "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9" 6 338365642); +perft_test!(position_frc_327 "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9" 6 991509814); +perft_test!(position_frc_328 "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9" 6 1560584212); +perft_test!(position_frc_329 "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9" 6 668969549); +perft_test!(position_frc_330 "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9" 6 201795680); +perft_test!(position_frc_331 "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9" 6 669854148); +perft_test!(position_frc_332 "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9" 6 591335970); +perft_test!(position_frc_333 "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9" 6 191762235); +perft_test!(position_frc_334 "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9" 6 184309316); +perft_test!(position_frc_335 "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9" 6 809841274); +perft_test!(position_frc_336 "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9" 6 881898159); +perft_test!(position_frc_337 "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9" 6 144653627); +perft_test!(position_frc_338 "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9" 6 1080607773); +perft_test!(position_frc_339 "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9" 6 413226841); +perft_test!(position_frc_340 "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9" 6 273928315); +perft_test!(position_frc_341 "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9" 6 560139600); +perft_test!(position_frc_342 "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9" 6 237475184); +perft_test!(position_frc_343 "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9" 6 335004239); +perft_test!(position_frc_344 "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9" 6 82875306); +perft_test!(position_frc_345 "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9" 6 184959796); +perft_test!(position_frc_346 "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9" 6 313526088); +perft_test!(position_frc_347 "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9" 6 685549171); +perft_test!(position_frc_348 "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9" 6 557578726); +perft_test!(position_frc_349 "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9" 6 292131422); +perft_test!(position_frc_350 "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9" 6 66958031); +perft_test!(position_frc_351 "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9" 6 408570219); +perft_test!(position_frc_352 "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9" 6 165025370); +perft_test!(position_frc_353 "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9" 6 190583454); +perft_test!(position_frc_354 "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9" 6 869228014); +perft_test!(position_frc_355 "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9" 6 952871799); +perft_test!(position_frc_356 "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9" 6 944483246); +perft_test!(position_frc_357 "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9" 6 384101783); +perft_test!(position_frc_358 "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9" 6 313794027); +perft_test!(position_frc_359 "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9" 6 1181835398); +perft_test!(position_frc_360 "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9" 6 315021712); +perft_test!(position_frc_361 "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9" 6 137024458); +perft_test!(position_frc_362 "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9" 6 150091997); +perft_test!(position_frc_363 "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9" 6 547233320); +perft_test!(position_frc_364 "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9" 6 2490912491); +perft_test!(position_frc_365 "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9" 6 1106487743); +perft_test!(position_frc_366 "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9" 6 141245633); +perft_test!(position_frc_367 "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9" 6 301403003); +perft_test!(position_frc_368 "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9" 6 620749189); +perft_test!(position_frc_369 "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9" 6 456736500); +perft_test!(position_frc_370 "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9" 6 485803600); +perft_test!(position_frc_371 "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9" 6 698159474); +perft_test!(position_frc_372 "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9" 6 341026662); +perft_test!(position_frc_373 "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9" 6 248469879); +perft_test!(position_frc_374 "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9" 6 135295774); +perft_test!(position_frc_375 "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9" 6 380516508); +perft_test!(position_frc_376 "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9" 6 427269976); +perft_test!(position_frc_377 "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9" 6 389051744); +perft_test!(position_frc_378 "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9" 6 458900901); +perft_test!(position_frc_379 "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9" 6 968024386); +perft_test!(position_frc_380 "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9" 6 139436165); +perft_test!(position_frc_381 "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9" 6 270967202); +perft_test!(position_frc_382 "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9" 6 540864616); +perft_test!(position_frc_383 "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9" 6 402109399); +perft_test!(position_frc_384 "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9" 6 82754650); +perft_test!(position_frc_385 "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9" 6 295682250); +perft_test!(position_frc_386 "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9" 6 850296236); +perft_test!(position_frc_387 "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9" 6 645694580); +perft_test!(position_frc_388 "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9" 6 482645160); +perft_test!(position_frc_389 "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9" 6 992109168); +perft_test!(position_frc_390 "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9" 6 507008968); +perft_test!(position_frc_391 "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9" 6 655850285); +perft_test!(position_frc_392 "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9" 6 416356876); +perft_test!(position_frc_393 "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9" 6 675408811); +perft_test!(position_frc_394 "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9" 6 515122176); +perft_test!(position_frc_395 "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9" 6 890966633); +perft_test!(position_frc_396 "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9" 6 416881799); +perft_test!(position_frc_397 "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9" 6 342165821); +perft_test!(position_frc_398 "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9" 6 888709821); +perft_test!(position_frc_399 "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9" 6 190414579); +perft_test!(position_frc_400 "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9" 6 227555387); +perft_test!(position_frc_401 "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9" 6 223437427); +perft_test!(position_frc_402 "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9" 6 463883447); +perft_test!(position_frc_403 "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9" 6 153986034); +perft_test!(position_frc_404 "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9" 6 924181432); +perft_test!(position_frc_405 "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9" 6 670707652); +perft_test!(position_frc_406 "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9" 6 288064942); +perft_test!(position_frc_407 "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9" 6 843078864); +perft_test!(position_frc_408 "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9" 6 707188107); +perft_test!(position_frc_409 "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9" 6 234622128); +perft_test!(position_frc_410 "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9" 6 356279813); +perft_test!(position_frc_411 "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9" 6 175460841); +perft_test!(position_frc_412 "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9" 6 554292502); +perft_test!(position_frc_413 "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9" 6 515078271); +perft_test!(position_frc_414 "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9" 6 494574415); +perft_test!(position_frc_415 "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9" 6 235103697); +perft_test!(position_frc_416 "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9" 6 259069471); +perft_test!(position_frc_417 "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9" 6 829785474); +perft_test!(position_frc_418 "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9" 6 167139732); +perft_test!(position_frc_419 "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9" 6 235249649); +perft_test!(position_frc_420 "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9" 6 361714466); +perft_test!(position_frc_421 "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9" 6 399135495); +perft_test!(position_frc_422 "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9" 6 361157611); +perft_test!(position_frc_423 "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9" 6 563558512); +perft_test!(position_frc_424 "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9" 6 255304141); +perft_test!(position_frc_425 "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9" 6 564255328); +perft_test!(position_frc_426 "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9" 6 506140370); +perft_test!(position_frc_427 "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9" 6 1096869832); +perft_test!(position_frc_428 "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9" 6 724171581); +perft_test!(position_frc_429 "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9" 6 551494771); +perft_test!(position_frc_430 "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9" 6 507175842); +perft_test!(position_frc_431 "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9" 6 654808184); +perft_test!(position_frc_432 "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9" 6 131401224); +perft_test!(position_frc_433 "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9" 6 695850727); +perft_test!(position_frc_434 "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9" 6 337805606); +perft_test!(position_frc_435 "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9" 6 880403591); +perft_test!(position_frc_436 "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9" 6 599219582); +perft_test!(position_frc_437 "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9" 6 547415271); +perft_test!(position_frc_438 "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9" 6 496023732); +perft_test!(position_frc_439 "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9" 6 279545007); +perft_test!(position_frc_440 "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9" 6 349478320); +perft_test!(position_frc_441 "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9" 6 636779732); +perft_test!(position_frc_442 "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9" 6 315431511); +perft_test!(position_frc_443 "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9" 6 331782223); +perft_test!(position_frc_444 "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9" 6 227346638); +perft_test!(position_frc_445 "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9" 6 232750602); +perft_test!(position_frc_446 "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9" 6 682580976); +perft_test!(position_frc_447 "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9" 6 988770109); +perft_test!(position_frc_448 "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9" 6 187564853); +perft_test!(position_frc_449 "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9" 6 653721389); +perft_test!(position_frc_450 "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9" 6 685749952); +perft_test!(position_frc_451 "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9" 6 294181806); +perft_test!(position_frc_452 "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9" 6 581716972); +perft_test!(position_frc_453 "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9" 6 1122703887); +perft_test!(position_frc_454 "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9" 6 1211187800); +perft_test!(position_frc_455 "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9" 6 159759052); +perft_test!(position_frc_456 "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9" 6 172833738); +perft_test!(position_frc_457 "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9" 6 284485303); +perft_test!(position_frc_458 "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9" 6 716170771); +perft_test!(position_frc_459 "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9" 6 255067638); +perft_test!(position_frc_460 "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9" 6 606221516); +perft_test!(position_frc_461 "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9" 6 636748147); +perft_test!(position_frc_462 "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9" 6 659615710); +perft_test!(position_frc_463 "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9" 6 456898648); +perft_test!(position_frc_464 "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9" 6 365621294); +perft_test!(position_frc_465 "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9" 6 300125003); +perft_test!(position_frc_466 "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9" 6 178605165); +perft_test!(position_frc_467 "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9" 6 539767605); +perft_test!(position_frc_468 "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9" 6 806446436); +perft_test!(position_frc_469 "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9" 6 1281760240); +perft_test!(position_frc_470 "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9" 6 301874034); +perft_test!(position_frc_471 "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9" 6 672294132); +perft_test!(position_frc_472 "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9" 6 789152120); +perft_test!(position_frc_473 "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9" 6 515864053); +perft_test!(position_frc_474 "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9" 6 416359581); +perft_test!(position_frc_475 "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9" 6 537750982); +perft_test!(position_frc_476 "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9" 6 675163653); +perft_test!(position_frc_477 "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9" 6 536419559); +perft_test!(position_frc_478 "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9" 6 575069358); +perft_test!(position_frc_479 "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9" 6 189865944); +perft_test!(position_frc_480 "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9" 6 394943978); +perft_test!(position_frc_481 "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9" 6 250988458); +perft_test!(position_frc_482 "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9" 6 582880996); +perft_test!(position_frc_483 "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9" 6 315124518); +perft_test!(position_frc_484 "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9" 6 368479752); +perft_test!(position_frc_485 "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9" 6 484814878); +perft_test!(position_frc_486 "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9" 6 662608969); +perft_test!(position_frc_487 "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9" 6 701363800); +perft_test!(position_frc_488 "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9" 6 1285503872); +perft_test!(position_frc_489 "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9" 6 345122090); +perft_test!(position_frc_490 "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9" 6 298054792); +perft_test!(position_frc_491 "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9" 6 358531599); +perft_test!(position_frc_492 "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9" 6 323518628); +perft_test!(position_frc_493 "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9" 6 230364479); +perft_test!(position_frc_494 "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9" 6 1113836402); +perft_test!(position_frc_495 "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9" 6 400971226); +perft_test!(position_frc_496 "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9" 6 224960353); +perft_test!(position_frc_497 "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9" 6 460840861); +perft_test!(position_frc_498 "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9" 6 214340699); +perft_test!(position_frc_499 "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9" 6 249999654); +perft_test!(position_frc_500 "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9" 6 570893953); +perft_test!(position_frc_501 "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9" 6 529082811); +perft_test!(position_frc_502 "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9" 6 593915677); +perft_test!(position_frc_503 "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9" 6 506453626); +perft_test!(position_frc_504 "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9" 6 842796987); +perft_test!(position_frc_505 "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9" 6 186760784); +perft_test!(position_frc_506 "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9" 6 663183060); +perft_test!(position_frc_507 "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9" 6 364210162); +perft_test!(position_frc_508 "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9" 6 692180754); +perft_test!(position_frc_509 "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9" 6 556282676); +perft_test!(position_frc_510 "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9" 6 716521139); +perft_test!(position_frc_511 "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9" 6 423574794); +perft_test!(position_frc_512 "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9" 6 1043293394); +perft_test!(position_frc_513 "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9" 6 371861782); +perft_test!(position_frc_514 "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9" 6 153051835); +perft_test!(position_frc_515 "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9" 6 1202668717); +perft_test!(position_frc_516 "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9" 6 497251206); +perft_test!(position_frc_517 "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9" 6 329010121); +perft_test!(position_frc_518 "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9" 6 647745807); +perft_test!(position_frc_519 "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9" 6 710765657); +perft_test!(position_frc_520 "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9" 6 501093456); +perft_test!(position_frc_521 "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9" 6 637973209); +perft_test!(position_frc_522 "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9" 6 172734380); +perft_test!(position_frc_523 "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9" 6 1465473753); +perft_test!(position_frc_524 "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9" 6 781067145); +perft_test!(position_frc_525 "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9" 6 385193532); +perft_test!(position_frc_526 "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9" 6 1011631987); +perft_test!(position_frc_527 "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9" 6 438096194); +perft_test!(position_frc_528 "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9" 6 283975400); +perft_test!(position_frc_529 "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9" 6 207799378); +perft_test!(position_frc_530 "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9" 6 507176753); +perft_test!(position_frc_531 "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9" 6 640362920); +perft_test!(position_frc_532 "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9" 6 325226128); +perft_test!(position_frc_533 "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9" 6 646624429); +perft_test!(position_frc_534 "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9" 6 498621813); +perft_test!(position_frc_535 "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9" 6 1834391369); +perft_test!(position_frc_536 "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9" 6 868565895); +perft_test!(position_frc_537 "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9" 6 492966455); +perft_test!(position_frc_538 "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9" 6 355083962); +perft_test!(position_frc_539 "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9" 6 476598337); +perft_test!(position_frc_540 "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9" 6 1328374620); +perft_test!(position_frc_541 "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9" 6 1675608008); +perft_test!(position_frc_542 "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9" 6 353831792); +perft_test!(position_frc_543 "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9" 6 736717252); +perft_test!(position_frc_544 "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9" 6 280707118); +perft_test!(position_frc_545 "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9" 6 873063158); +perft_test!(position_frc_546 "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9" 6 415624943); +perft_test!(position_frc_547 "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9" 6 293499724); +perft_test!(position_frc_548 "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9" 6 528140595); +perft_test!(position_frc_549 "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9" 6 940198007); +perft_test!(position_frc_550 "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9" 6 369257622); +perft_test!(position_frc_551 "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9" 6 339919682); +perft_test!(position_frc_552 "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9" 6 167329117); +perft_test!(position_frc_553 "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9" 6 504622114); +perft_test!(position_frc_554 "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9" 6 325177085); +perft_test!(position_frc_555 "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9" 6 232664675); +perft_test!(position_frc_556 "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9" 6 326565393); +perft_test!(position_frc_557 "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9" 6 1079612614); +perft_test!(position_frc_558 "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9" 6 260874068); +perft_test!(position_frc_559 "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9" 6 237525904); +perft_test!(position_frc_560 "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9" 6 226253685); +perft_test!(position_frc_561 "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9" 6 560338709); +perft_test!(position_frc_562 "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9" 6 565143976); +perft_test!(position_frc_563 "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9" 6 558383603); +perft_test!(position_frc_564 "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9" 6 217689974); +perft_test!(position_frc_565 "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9" 6 525678162); +perft_test!(position_frc_566 "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9" 6 639632905); +perft_test!(position_frc_567 "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9" 6 311282465); +perft_test!(position_frc_568 "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9" 6 411860744); +perft_test!(position_frc_569 "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9" 6 296701249); +perft_test!(position_frc_570 "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9" 6 293659781); +perft_test!(position_frc_571 "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9" 6 461293885); +perft_test!(position_frc_572 "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9" 6 1421492227); +perft_test!(position_frc_573 "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9" 6 207129256); +perft_test!(position_frc_574 "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9" 6 242592363); +perft_test!(position_frc_575 "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9" 6 521629794); +perft_test!(position_frc_576 "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9" 6 609277274); +perft_test!(position_frc_577 "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9" 6 647165916); +perft_test!(position_frc_578 "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9" 6 624462073); +perft_test!(position_frc_579 "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9" 6 372181570); +perft_test!(position_frc_580 "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9" 6 229112926); +perft_test!(position_frc_581 "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9" 6 961371180); +perft_test!(position_frc_582 "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9" 6 155744022); +perft_test!(position_frc_583 "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9" 6 361495148); +perft_test!(position_frc_584 "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9" 6 326834539); +perft_test!(position_frc_585 "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9" 6 310695797); +perft_test!(position_frc_586 "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9" 6 258925091); +perft_test!(position_frc_587 "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9" 6 213856651); +perft_test!(position_frc_588 "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9" 6 621884383); +perft_test!(position_frc_589 "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9" 6 307793179); +perft_test!(position_frc_590 "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9" 6 170268300); +perft_test!(position_frc_591 "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9" 6 287987207); +perft_test!(position_frc_592 "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9" 6 356399665); +perft_test!(position_frc_593 "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9" 6 455940859); +perft_test!(position_frc_594 "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9" 6 559579332); +perft_test!(position_frc_595 "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9" 6 410795298); +perft_test!(position_frc_596 "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9" 6 471452088); +perft_test!(position_frc_597 "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9" 6 396640086); +perft_test!(position_frc_598 "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9" 6 1292405738); +perft_test!(position_frc_599 "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9" 6 416833400); +perft_test!(position_frc_600 "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9" 6 132309824); +perft_test!(position_frc_601 "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9" 6 326601372); +perft_test!(position_frc_602 "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9" 6 217797292); +perft_test!(position_frc_603 "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9" 6 632892337); +perft_test!(position_frc_604 "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9" 6 337377291); +perft_test!(position_frc_605 "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9" 6 335943324); +perft_test!(position_frc_606 "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9" 6 379844460); +perft_test!(position_frc_607 "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9" 6 416239106); +perft_test!(position_frc_608 "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9" 6 207612575); +perft_test!(position_frc_609 "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9" 6 300902534); +perft_test!(position_frc_610 "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9" 6 187205941); +perft_test!(position_frc_611 "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9" 6 654487872); +perft_test!(position_frc_612 "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9" 6 647939781); +perft_test!(position_frc_613 "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9" 6 273864588); +perft_test!(position_frc_614 "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9" 6 174733195); +perft_test!(position_frc_615 "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9" 6 569141201); +perft_test!(position_frc_616 "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9" 6 170135726); +perft_test!(position_frc_617 "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9" 6 291243811); +perft_test!(position_frc_618 "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9" 6 638696065); +perft_test!(position_frc_619 "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9" 6 1671593862); +perft_test!(position_frc_620 "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9" 6 421343249); +perft_test!(position_frc_621 "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9" 6 413965054); +perft_test!(position_frc_622 "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9" 6 417191461); +perft_test!(position_frc_623 "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9" 6 789705382); +perft_test!(position_frc_624 "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9" 6 171793012); +perft_test!(position_frc_625 "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9" 6 345386924); +perft_test!(position_frc_626 "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9" 6 217596497); +perft_test!(position_frc_627 "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9" 6 451842354); +perft_test!(position_frc_628 "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9" 6 185393913); +perft_test!(position_frc_629 "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9" 6 199883770); +perft_test!(position_frc_630 "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9" 6 527273615); +perft_test!(position_frc_631 "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9" 6 216224115); +perft_test!(position_frc_632 "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9" 6 978991050); +perft_test!(position_frc_633 "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9" 6 797524786); +perft_test!(position_frc_634 "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9" 6 419496845); +perft_test!(position_frc_635 "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9" 6 523437649); +perft_test!(position_frc_636 "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9" 6 625669222); +perft_test!(position_frc_637 "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9" 6 857951339); +perft_test!(position_frc_638 "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9" 6 299752383); +perft_test!(position_frc_639 "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9" 6 790239502); +perft_test!(position_frc_640 "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9" 6 481498664); +perft_test!(position_frc_641 "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9" 6 159025909); +perft_test!(position_frc_642 "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9" 6 362747791); +perft_test!(position_frc_643 "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9" 6 317097424); +perft_test!(position_frc_644 "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9" 6 202594556); +perft_test!(position_frc_645 "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9" 6 243460643); +perft_test!(position_frc_646 "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9" 6 386694739); +perft_test!(position_frc_647 "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9" 6 993747544); +perft_test!(position_frc_648 "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9" 6 293703269); +perft_test!(position_frc_649 "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9" 6 245137199); +perft_test!(position_frc_650 "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9" 6 851927292); +perft_test!(position_frc_651 "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9" 6 285233838); +perft_test!(position_frc_652 "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9" 6 293397389); +perft_test!(position_frc_653 "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9" 6 2633945690); +perft_test!(position_frc_654 "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9" 6 503561996); +perft_test!(position_frc_655 "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9" 6 1633655838); +perft_test!(position_frc_656 "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9" 6 2059942014); +perft_test!(position_frc_657 "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9" 6 177940764); +perft_test!(position_frc_658 "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9" 6 639803952); +perft_test!(position_frc_659 "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9" 6 1026195877); +perft_test!(position_frc_660 "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9" 6 513486101); +perft_test!(position_frc_661 "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9" 6 426443376); +perft_test!(position_frc_662 "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9" 6 625757852); +perft_test!(position_frc_663 "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9" 6 180378139); +perft_test!(position_frc_664 "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9" 6 535497008); +perft_test!(position_frc_665 "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9" 6 341389148); +perft_test!(position_frc_666 "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9" 6 589161126); +perft_test!(position_frc_667 "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9" 6 225389422); +perft_test!(position_frc_668 "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9" 6 578332225); +perft_test!(position_frc_669 "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9" 6 404129987); +perft_test!(position_frc_670 "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9" 6 246965507); +perft_test!(position_frc_671 "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9" 6 596067005); +perft_test!(position_frc_672 "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9" 6 1124738493); +perft_test!(position_frc_673 "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9" 6 113660536); +perft_test!(position_frc_674 "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9" 6 351766307); +perft_test!(position_frc_675 "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9" 6 181492621); +perft_test!(position_frc_676 "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9" 6 192717198); +perft_test!(position_frc_677 "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9" 6 646855304); +perft_test!(position_frc_678 "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9" 6 947786800); +perft_test!(position_frc_679 "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9" 6 293988585); +perft_test!(position_frc_680 "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9" 6 373081138); +perft_test!(position_frc_681 "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9" 6 324006164); +perft_test!(position_frc_682 "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9" 6 375702908); +perft_test!(position_frc_683 "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9" 6 2427477375); +perft_test!(position_frc_684 "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9" 6 543180234); +perft_test!(position_frc_685 "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9" 6 1051910977); +perft_test!(position_frc_686 "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9" 6 577979364); +perft_test!(position_frc_687 "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9" 6 798405123); +perft_test!(position_frc_688 "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9" 6 723306114); +perft_test!(position_frc_689 "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9" 6 579112676); +perft_test!(position_frc_690 "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9" 6 473071890); +perft_test!(position_frc_691 "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9" 6 874251866); +perft_test!(position_frc_692 "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9" 6 592797491); +perft_test!(position_frc_693 "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9" 6 121267576); +perft_test!(position_frc_694 "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9" 6 448477218); +perft_test!(position_frc_695 "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9" 6 483248153); +perft_test!(position_frc_696 "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9" 6 682863811); +perft_test!(position_frc_697 "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9" 6 453153783); +perft_test!(position_frc_698 "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9" 6 383256006); +perft_test!(position_frc_699 "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9" 6 686009788); +perft_test!(position_frc_700 "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9" 6 1837704407); +perft_test!(position_frc_701 "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9" 6 918801645); +perft_test!(position_frc_702 "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9" 6 386125234); +perft_test!(position_frc_703 "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9" 6 219311659); +perft_test!(position_frc_704 "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9" 6 1034223364); +perft_test!(position_frc_705 "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9" 6 304339862); +perft_test!(position_frc_706 "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9" 6 262293169); +perft_test!(position_frc_707 "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9" 6 128389738); +perft_test!(position_frc_708 "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9" 6 1415578783); +perft_test!(position_frc_709 "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9" 6 302056813); +perft_test!(position_frc_710 "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9" 6 561073410); +perft_test!(position_frc_711 "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9" 6 342967558); +perft_test!(position_frc_712 "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9" 6 403323883); +perft_test!(position_frc_713 "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9" 6 196524441); +perft_test!(position_frc_714 "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9" 6 193947530); +perft_test!(position_frc_715 "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9" 6 1073711823); +perft_test!(position_frc_716 "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9" 6 1139322479); +perft_test!(position_frc_717 "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9" 6 251613569); +perft_test!(position_frc_718 "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9" 6 365761521); +perft_test!(position_frc_719 "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9" 6 998848556); +perft_test!(position_frc_720 "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9" 6 411077508); +perft_test!(position_frc_721 "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9" 6 754501112); +perft_test!(position_frc_722 "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9" 6 1470987023); +perft_test!(position_frc_723 "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9" 6 259643605); +perft_test!(position_frc_724 "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9" 6 976268967); +perft_test!(position_frc_725 "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9" 6 39654253); +perft_test!(position_frc_726 "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9" 6 731511256); +perft_test!(position_frc_727 "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9" 6 361237536); +perft_test!(position_frc_728 "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9" 6 768247869); +perft_test!(position_frc_729 "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9" 6 447896703); +perft_test!(position_frc_730 "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9" 6 349047256); +perft_test!(position_frc_731 "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9" 6 263870337); +perft_test!(position_frc_732 "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9" 6 1045942540); +perft_test!(position_frc_733 "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9" 6 402599313); +perft_test!(position_frc_734 "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9" 6 203194521); +perft_test!(position_frc_735 "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9" 6 392629571); +perft_test!(position_frc_736 "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9" 6 617563700); +perft_test!(position_frc_737 "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9" 6 304805107); +perft_test!(position_frc_738 "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9" 6 544309489); +perft_test!(position_frc_739 "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9" 6 375033550); +perft_test!(position_frc_740 "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9" 6 324452612); +perft_test!(position_frc_741 "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9" 6 259898748); +perft_test!(position_frc_742 "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9" 6 472356665); +perft_test!(position_frc_743 "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9" 6 343214006); +perft_test!(position_frc_744 "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9" 6 692576573); +perft_test!(position_frc_745 "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9" 6 696999449); +perft_test!(position_frc_746 "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9" 6 412778368); +perft_test!(position_frc_747 "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9" 6 312575205); +perft_test!(position_frc_748 "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9" 6 780616047); +perft_test!(position_frc_749 "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9" 6 125373395); +perft_test!(position_frc_750 "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9" 6 756489357); +perft_test!(position_frc_751 "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9" 6 688115847); +perft_test!(position_frc_752 "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9" 6 731944177); +perft_test!(position_frc_753 "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9" 6 64251468); +perft_test!(position_frc_754 "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9" 6 888881062); +perft_test!(position_frc_755 "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9" 6 396737074); +perft_test!(position_frc_756 "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9" 6 613798447); +perft_test!(position_frc_757 "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9" 6 903933626); +perft_test!(position_frc_758 "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9" 6 484217179); +perft_test!(position_frc_759 "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9" 6 744755212); +perft_test!(position_frc_760 "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9" 6 677776408); +perft_test!(position_frc_761 "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9" 6 660040360); +perft_test!(position_frc_762 "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9" 6 214004367); +perft_test!(position_frc_763 "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9" 6 699211365); +perft_test!(position_frc_764 "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9" 6 660917073); +perft_test!(position_frc_765 "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9" 6 507618340); +perft_test!(position_frc_766 "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9" 6 191130942); +perft_test!(position_frc_767 "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9" 6 245669668); +perft_test!(position_frc_768 "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9" 6 502410909); +perft_test!(position_frc_769 "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9" 6 611986786); +perft_test!(position_frc_770 "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9" 6 363765666); +perft_test!(position_frc_771 "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9" 6 349082278); +perft_test!(position_frc_772 "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9" 6 202967948); +perft_test!(position_frc_773 "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9" 6 1009228283); +perft_test!(position_frc_774 "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9" 6 214730959); +perft_test!(position_frc_775 "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9" 6 369603424); +perft_test!(position_frc_776 "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9" 6 510878835); +perft_test!(position_frc_777 "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9" 6 867833733); +perft_test!(position_frc_778 "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9" 6 258348640); +perft_test!(position_frc_779 "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9" 6 414930519); +perft_test!(position_frc_780 "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9" 6 584870558); +perft_test!(position_frc_781 "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9" 6 957218571); +perft_test!(position_frc_782 "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9" 6 1846382333); +perft_test!(position_frc_783 "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9" 6 661207281); +perft_test!(position_frc_784 "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9" 6 80775549); +perft_test!(position_frc_785 "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9" 6 253271592); +perft_test!(position_frc_786 "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9" 6 304103516); +perft_test!(position_frc_787 "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9" 6 536330341); +perft_test!(position_frc_788 "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9" 6 419402704); +perft_test!(position_frc_789 "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9" 6 308553169); +perft_test!(position_frc_790 "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9" 6 881529007); +perft_test!(position_frc_791 "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9" 6 277906201); +perft_test!(position_frc_792 "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9" 6 1614019629); +perft_test!(position_frc_793 "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9" 6 401499189); +perft_test!(position_frc_794 "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9" 6 525585996); +perft_test!(position_frc_795 "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9" 6 439767476); +perft_test!(position_frc_796 "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9" 6 274364342); +perft_test!(position_frc_797 "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9" 6 520547029); +perft_test!(position_frc_798 "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9" 6 245871540); +perft_test!(position_frc_799 "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9" 6 343525739); +perft_test!(position_frc_800 "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9" 6 475206624); +perft_test!(position_frc_801 "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9" 6 751690068); +perft_test!(position_frc_802 "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9" 6 190316951); +perft_test!(position_frc_803 "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9" 6 190419716); +perft_test!(position_frc_804 "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9" 6 242240658); +perft_test!(position_frc_805 "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9" 6 283211800); +perft_test!(position_frc_806 "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9" 6 384663405); +perft_test!(position_frc_807 "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9" 6 625281937); +perft_test!(position_frc_808 "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9" 6 591681956); +perft_test!(position_frc_809 "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9" 6 205739580); +perft_test!(position_frc_810 "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9" 6 876341492); +perft_test!(position_frc_811 "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9" 6 617064197); +perft_test!(position_frc_812 "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9" 6 369702807); +perft_test!(position_frc_813 "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9" 6 271121237); +perft_test!(position_frc_814 "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9" 6 235545764); +perft_test!(position_frc_815 "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9" 6 471296844); +perft_test!(position_frc_816 "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9" 6 293532398); +perft_test!(position_frc_817 "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9" 6 548380577); +perft_test!(position_frc_818 "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9" 6 242864559); +perft_test!(position_frc_819 "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9" 6 765831403); +perft_test!(position_frc_820 "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9" 6 290579255); +perft_test!(position_frc_821 "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9" 6 383207197); +perft_test!(position_frc_822 "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9" 6 310495538); +perft_test!(position_frc_823 "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9" 6 576325868); +perft_test!(position_frc_824 "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9" 6 1555711209); +perft_test!(position_frc_825 "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9" 6 332632033); +perft_test!(position_frc_826 "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9" 6 507563675); +perft_test!(position_frc_827 "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9" 6 383508368); +perft_test!(position_frc_828 "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9" 6 992756232); +perft_test!(position_frc_829 "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9" 6 536852043); +perft_test!(position_frc_830 "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9" 6 448313956); +perft_test!(position_frc_831 "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9" 6 654754840); +perft_test!(position_frc_832 "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9" 6 603059376); +perft_test!(position_frc_833 "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9" 6 457601127); +perft_test!(position_frc_834 "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9" 6 577223409); +perft_test!(position_frc_835 "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9" 6 320881984); +perft_test!(position_frc_836 "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9" 6 185488058); +perft_test!(position_frc_837 "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9" 6 229898448); +perft_test!(position_frc_838 "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9" 6 404944553); +perft_test!(position_frc_839 "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9" 6 683290790); +perft_test!(position_frc_840 "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9" 6 222704171); +perft_test!(position_frc_841 "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9" 6 433719427); +perft_test!(position_frc_842 "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9" 6 248715580); +perft_test!(position_frc_843 "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9" 6 496340789); +perft_test!(position_frc_844 "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9" 6 33183408); +perft_test!(position_frc_845 "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9" 6 499247248); +perft_test!(position_frc_846 "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9" 6 352885930); +perft_test!(position_frc_847 "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9" 6 1500007485); +perft_test!(position_frc_848 "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9" 6 1037686769); +perft_test!(position_frc_849 "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9" 6 567287944); +perft_test!(position_frc_850 "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9" 6 302864305); +perft_test!(position_frc_851 "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9" 6 720443112); +perft_test!(position_frc_852 "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9" 6 300314373); +perft_test!(position_frc_853 "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9" 6 420887328); +perft_test!(position_frc_854 "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9" 6 622249676); +perft_test!(position_frc_855 "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9" 6 215787079); +perft_test!(position_frc_856 "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9" 6 257288920); +perft_test!(position_frc_857 "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9" 6 253006082); +perft_test!(position_frc_858 "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9" 6 175766730); +perft_test!(position_frc_859 "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9" 6 312096061); +perft_test!(position_frc_860 "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9" 6 263574861); +perft_test!(position_frc_861 "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9" 6 812343987); +perft_test!(position_frc_862 "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9" 6 588518645); +perft_test!(position_frc_863 "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9" 6 1412437357); +perft_test!(position_frc_864 "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9" 6 705170410); +perft_test!(position_frc_865 "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9" 6 197806842); +perft_test!(position_frc_866 "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9" 6 298629240); +perft_test!(position_frc_867 "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9" 6 1483524894); +perft_test!(position_frc_868 "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9" 6 300294295); +perft_test!(position_frc_869 "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9" 6 228837930); +perft_test!(position_frc_870 "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9" 6 162883949); +perft_test!(position_frc_871 "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9" 6 421740856); +perft_test!(position_frc_872 "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9" 6 734656217); +perft_test!(position_frc_873 "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9" 6 1522548864); +perft_test!(position_frc_874 "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9" 6 142507795); +perft_test!(position_frc_875 "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9" 6 419552571); +perft_test!(position_frc_876 "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9" 6 323905533); +perft_test!(position_frc_877 "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9" 6 807913585); +perft_test!(position_frc_878 "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9" 6 251694423); +perft_test!(position_frc_879 "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9" 6 479400272); +perft_test!(position_frc_880 "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9" 6 470796854); +perft_test!(position_frc_881 "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9" 6 402140795); +perft_test!(position_frc_882 "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9" 6 959651619); +perft_test!(position_frc_883 "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9" 6 417396563); +perft_test!(position_frc_884 "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9" 6 404960259); +perft_test!(position_frc_885 "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9" 6 335689685); +perft_test!(position_frc_886 "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9" 6 383515709); +perft_test!(position_frc_887 "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9" 6 907579129); +perft_test!(position_frc_888 "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9" 6 140934555); +perft_test!(position_frc_889 "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9" 6 188559137); +perft_test!(position_frc_890 "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9" 6 268393274); +perft_test!(position_frc_891 "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9" 6 485406712); +perft_test!(position_frc_892 "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9" 6 314327867); +perft_test!(position_frc_893 "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9" 6 269460607); +perft_test!(position_frc_894 "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9" 6 266047417); +perft_test!(position_frc_895 "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9" 6 193376359); +perft_test!(position_frc_896 "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9" 6 593204629); +perft_test!(position_frc_897 "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9" 6 355969349); +perft_test!(position_frc_898 "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9" 6 401903030); +perft_test!(position_frc_899 "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9" 6 791718847); +perft_test!(position_frc_900 "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9" 6 134818483); +perft_test!(position_frc_901 "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9" 6 673756141); +perft_test!(position_frc_902 "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9" 6 482288814); +perft_test!(position_frc_903 "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9" 6 1389312729); +perft_test!(position_frc_904 "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9" 6 157499039); +perft_test!(position_frc_905 "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9" 6 1366087771); +perft_test!(position_frc_906 "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9" 6 251179183); +perft_test!(position_frc_907 "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9" 6 418191735); +perft_test!(position_frc_908 "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9" 6 218658292); +perft_test!(position_frc_909 "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9" 6 328434174); +perft_test!(position_frc_910 "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9" 6 367311176); +perft_test!(position_frc_911 "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9" 6 505212747); +perft_test!(position_frc_912 "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9" 6 800922511); +perft_test!(position_frc_913 "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9" 6 759318058); +perft_test!(position_frc_914 "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9" 6 380267099); +perft_test!(position_frc_915 "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9" 6 406594531); +perft_test!(position_frc_916 "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9" 6 631209313); +perft_test!(position_frc_917 "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9" 6 966310885); +perft_test!(position_frc_918 "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9" 6 515304215); +perft_test!(position_frc_919 "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9" 6 167767913); +perft_test!(position_frc_920 "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9" 6 838704143); +perft_test!(position_frc_921 "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9" 6 1024529879); +perft_test!(position_frc_922 "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9" 6 484884485); +perft_test!(position_frc_923 "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9" 6 537354146); +perft_test!(position_frc_924 "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9" 6 532603566); +perft_test!(position_frc_925 "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9" 6 279864836); +perft_test!(position_frc_926 "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9" 6 382218272); +perft_test!(position_frc_927 "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9" 6 468666425); +perft_test!(position_frc_928 "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9" 6 509307623); +perft_test!(position_frc_929 "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9" 6 247750144); +perft_test!(position_frc_930 "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9" 6 81787718); +perft_test!(position_frc_931 "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9" 6 667089231); +perft_test!(position_frc_932 "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9" 6 397454100); +perft_test!(position_frc_933 "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9" 6 485037906); +perft_test!(position_frc_934 "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9" 6 234041078); +perft_test!(position_frc_935 "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9" 6 357030697); +perft_test!(position_frc_936 "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9" 6 236013157); +perft_test!(position_frc_937 "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9" 6 669256602); +perft_test!(position_frc_938 "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9" 6 1501852662); +perft_test!(position_frc_939 "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9" 6 463032124); +perft_test!(position_frc_940 "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9" 6 133936564); +perft_test!(position_frc_941 "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9" 6 222026485); +perft_test!(position_frc_942 "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9" 6 163291279); +perft_test!(position_frc_943 "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9" 6 331083405); +perft_test!(position_frc_944 "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9" 6 1650202838); +perft_test!(position_frc_945 "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9" 6 936568065); +perft_test!(position_frc_946 "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9" 6 755334868); +perft_test!(position_frc_947 "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9" 6 103537333); +perft_test!(position_frc_948 "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9" 6 578210135); +perft_test!(position_frc_949 "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9" 6 329615708); +perft_test!(position_frc_950 "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9" 6 842265141); +perft_test!(position_frc_951 "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9" 6 261247606); +perft_test!(position_frc_952 "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9" 6 745802405); +perft_test!(position_frc_953 "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9" 6 441578567); +perft_test!(position_frc_954 "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9" 6 712787248); +perft_test!(position_frc_955 "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9" 6 323043654); +perft_test!(position_frc_956 "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9" 6 28753562); +perft_test!(position_frc_957 "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9" 6 787205262); +perft_test!(position_frc_958 "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9" 6 341262639); +perft_test!(position_frc_959 "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9" 6 915268405); +perft_test!(position_frc_960 "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9" 6 280056112); From 66d1774f69a131eedaab8cbbdebdb041e0a43029 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Thu, 12 Dec 2024 10:32:48 +0530 Subject: [PATCH 24/27] chore: some cleanup stuff --- games/src/chess/position.rs | 43 +++++++++++++++---------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/games/src/chess/position.rs b/games/src/chess/position.rs index f1b9879..8457c1c 100644 --- a/games/src/chess/position.rs +++ b/games/src/chess/position.rs @@ -36,6 +36,7 @@ use crate::interface::MoveStore; use super::castling::CastlingRightsParseError; use super::castling::Dimension; use super::castling::Rights; +use super::castling::Side; use super::movegen; use super::MoveFlag; @@ -134,21 +135,13 @@ impl PositionType for Position { let source_pc = unsafe { source_pc.unwrap_unchecked() }; - if !m.flag().is_promotion() && !m.flag().is_castling() { - board.insert(m.target(), source_pc); - } - board.castling.rights -= board.castling.get_updates(m.source()) | board.castling.get_updates(m.target()); - if source_pc.piece() == Piece::Pawn || target_pc.is_some() { - board.half_move_clock = 0; - } - board.en_passant_target = None; match m.flag() { - MoveFlag::Normal => {} + MoveFlag::Normal => board.insert(m.target(), source_pc), MoveFlag::NPromotion | MoveFlag::BPromotion | MoveFlag::RPromotion @@ -160,32 +153,27 @@ impl PositionType for Position { ), ), MoveFlag::EnPassant => { + board.insert(m.target(), source_pc); board.remove(unsafe { m.target().down(board.side_to_move).unwrap_unchecked() }); } MoveFlag::DoublePush => { + board.insert(m.target(), source_pc); board.en_passant_target = Some(unsafe { m.target().down(board.side_to_move).unwrap_unchecked() }); } - MoveFlag::CastleASide => { - let (king, rook) = - Dimension::from(board.side_to_move, castling::Side::A) - .get_targets(); - board.insert( - king, - ColoredPiece::new(Piece::King, board.side_to_move), - ); - board.insert( - rook, - ColoredPiece::new(Piece::Rook, board.side_to_move), - ); - } - MoveFlag::CastleHSide => { - let (king, rook) = - Dimension::from(board.side_to_move, castling::Side::H) - .get_targets(); + MoveFlag::CastleHSide | MoveFlag::CastleASide => { + let (king, rook) = Dimension::from( + board.side_to_move, + if m.flag() == MoveFlag::CastleHSide { + Side::H + } else { + Side::A + }, + ) + .get_targets(); board.insert( king, ColoredPiece::new(Piece::King, board.side_to_move), @@ -198,6 +186,9 @@ impl PositionType for Position { } board.half_move_clock += 1; + if source_pc.piece() == Piece::Pawn || target_pc.is_some() { + board.half_move_clock = 0; + } board.side_to_move = !board.side_to_move; board From 299a5e8c9f38a8bebdf66b577b16da5a7f4bb980 Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Thu, 12 Dec 2024 10:33:11 +0530 Subject: [PATCH 25/27] chore: updated config --- Cargo.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 11b4c7d..2a879e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,16 @@ description = "A game engine Swiss-army knife" repository = "https://github.com/raklaptudirm/tetka" [dependencies] +strum = "0.26" tetka-uxi = { package = "uxi", path = "./uxi" } tetka-games = { path = "./games" } [workspace] resolver = "2" members = [ "uxi", "games" ] + +[profile.release] +debug = true +opt-level = 3 +codegen-units = 1 +lto = true From ebd995c535ed3e136bc57793ba455431f730054d Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Thu, 12 Dec 2024 10:36:20 +0530 Subject: [PATCH 26/27] chore: new gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e2a4825..f27136a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,6 @@ Cargo.lock *.pdb /mexx/ -/dev/ \ No newline at end of file +/dev/ +/src/ +*.oth \ No newline at end of file From 81fb1db859fb826f66b145d913f7e3afed85f7cd Mon Sep 17 00:00:00 2001 From: Rak Laptudirm Date: Mon, 23 Dec 2024 11:39:54 +0530 Subject: [PATCH 27/27] chore: actually run the tests :skull: --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa24d31..ef1d06e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: # update rust to latest stable version - run: rustup update stable && rustup default stable - - run: cargo clippy # look for lint errors - - run: cargo build # look for build errors - - run: cargo test # look for test errors - - run: cargo doc # look for bad documentation + - run: cargo clippy # look for lint errors + - run: cargo build # look for build errors + - run: cargo test --workspace # look for test errors + - run: cargo doc # look for bad documentation