// File: ShootMe[P]Klondike-Solver/Solitaire.cpp
// Function: Solitaire::GameDiagramPysol[abi:cxx11]()
string Solitaire::GameDiagramPysol() {
	stringstream ss;
	ss << "Foundations: H-" << RANKS[piles[FOUNDATION4H].Size()] << " C-" << RANKS[piles[FOUNDATION1C].Size()] << " D-" << RANKS[piles[FOUNDATION2D].Size()] << " S-" << RANKS[piles[FOUNDATION3S].Size()];
	ss << "\nTalon: ";

	Pile & waste = piles[WASTE];
	int size = waste.UpSize();
	for (int j = size - 1; j >= 0; j--) {
		Card c = waste.Up(j);
		char rank = RANKS[c.Rank];
		char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
		ss << rank << suit << ' ';
	}
	ss << "==> ";

	Pile & stock = piles[STOCK];
	size = stock.UpSize();
	for (int j = size - 1; j >= 0; j--) {
		Card c = stock.Up(j);
		char rank = RANKS[c.Rank];
		char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
		ss << rank << suit << ' ';
	}
	ss << "<==";

	for (int i = TABLEAU1; i <= TABLEAU7; i++) {
		ss << "\n:";
		Pile & p = piles[i];
		size = p.DownSize();
		for (int j = 0; j < size; j++) {
			Card c = p.Down(j);
			char rank = RANKS[c.Rank];
			char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
			ss << " <" << rank << suit << ">";
		}
		size = p.UpSize();
		for (int j = 0; j < size; j++) {
			Card c = p.Up(j);
			char rank = RANKS[c.Rank];
			char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
			ss << ' ' << rank << suit;
		}
	}

	return ss.str();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x310, %rsp            # imm = 0x310
movq %rdi, -0x218(%rbp)
movq %rdi, %rax
movq %rax, -0x210(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x208(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x3170
leaq -0x188(%rbp), %rdi
leaq 0x6d70(%rip), %rsi      # 0x14a29
callq 0x3230
movq %rax, -0x200(%rbp)
jmp 0xdcc7
movq -0x208(%rbp), %rdi
addq $0x1610, %rdi           # imm = 0x1610
callq 0x6400
movl %eax, -0x21c(%rbp)
jmp 0xdce2
movq -0x200(%rbp), %rdi
movl -0x21c(%rbp), %eax
cltq
leaq 0x6bd8(%rip), %rcx      # 0x148d0
movsbl (%rax,%rcx), %esi
callq 0x32d0
movq %rax, -0x228(%rbp)
jmp 0xdd0a
movq -0x228(%rbp), %rdi
leaq 0x6d21(%rip), %rsi      # 0x14a39
callq 0x3230
movq %rax, -0x230(%rbp)
jmp 0xdd26
movq -0x208(%rbp), %rdi
addq $0x128c, %rdi           # imm = 0x128C
callq 0x6400
movl %eax, -0x234(%rbp)
jmp 0xdd41
movq -0x230(%rbp), %rdi
movl -0x234(%rbp), %eax
cltq
leaq 0x6b79(%rip), %rcx      # 0x148d0
movsbl (%rax,%rcx), %esi
callq 0x32d0
movq %rax, -0x240(%rbp)
jmp 0xdd69
movq -0x240(%rbp), %rdi
leaq 0x6cc6(%rip), %rsi      # 0x14a3d
callq 0x3230
movq %rax, -0x248(%rbp)
jmp 0xdd85
movq -0x208(%rbp), %rdi
addq $0x13b8, %rdi           # imm = 0x13B8
callq 0x6400
movl %eax, -0x24c(%rbp)
jmp 0xdda0
movq -0x248(%rbp), %rdi
movl -0x24c(%rbp), %eax
cltq
leaq 0x6b1a(%rip), %rcx      # 0x148d0
movsbl (%rax,%rcx), %esi
callq 0x32d0
movq %rax, -0x258(%rbp)
jmp 0xddc8
movq -0x258(%rbp), %rdi
leaq 0x6c6b(%rip), %rsi      # 0x14a41
callq 0x3230
movq %rax, -0x260(%rbp)
jmp 0xdde4
movq -0x208(%rbp), %rdi
addq $0x14e4, %rdi           # imm = 0x14E4
callq 0x6400
movl %eax, -0x264(%rbp)
jmp 0xddff
movq -0x260(%rbp), %rdi
movl -0x264(%rbp), %eax
cltq
leaq 0x6abb(%rip), %rcx      # 0x148d0
movsbl (%rax,%rcx), %esi
callq 0x32d0
jmp 0xde20
leaq -0x188(%rbp), %rdi
leaq 0x6c17(%rip), %rsi      # 0x14a45
callq 0x3230
jmp 0xde35
movq -0x208(%rbp), %rax
addq $0x800, %rax            # imm = 0x800
movq %rax, -0x1b0(%rbp)
movq -0x1b0(%rbp), %rdi
callq 0x6440
movl %eax, -0x268(%rbp)
jmp 0xde5d
movl -0x268(%rbp), %eax
movl %eax, -0x1b4(%rbp)
movl -0x1b4(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x1b8(%rbp)
cmpl $0x0, -0x1b8(%rbp)
jl 0xdf96
movq -0x1b0(%rbp), %rdi
movl -0x1b8(%rbp), %esi
callq 0x6500
movq %rax, -0x270(%rbp)
jmp 0xdea0
movq -0x270(%rbp), %rax
movl %eax, %ecx
movl %ecx, -0x1be(%rbp)
shrq $0x20, %rax
movw %ax, -0x1ba(%rbp)
movzbl -0x1bd(%rbp), %eax
movl %eax, %ecx
leaq 0x6a06(%rip), %rax      # 0x148d0
movb (%rax,%rcx), %al
movb %al, -0x1bf(%rbp)
movzbl -0x1be(%rbp), %eax
cmpl $0xff, %eax
je 0xdefc
movzbl -0x1be(%rbp), %eax
movl %eax, %ecx
leaq 0x69ee(%rip), %rax      # 0x148df
movb (%rax,%rcx), %al
movb %al, -0x271(%rbp)
jmp 0xdf06
movb $0x58, %al
movb %al, -0x271(%rbp)
jmp 0xdf06
movb -0x271(%rbp), %al
movb %al, -0x1c0(%rbp)
leaq -0x188(%rbp), %rdi
movsbl -0x1bf(%rbp), %esi
callq 0x32d0
movq %rax, -0x280(%rbp)
jmp 0xdf2e
movq -0x280(%rbp), %rdi
movsbl -0x1c0(%rbp), %esi
callq 0x32d0
movq %rax, -0x288(%rbp)
jmp 0xdf4a
movq -0x288(%rbp), %rdi
movl $0x20, %esi
callq 0x32d0
jmp 0xdf5d
jmp 0xdf5f
movl -0x1b8(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x1b8(%rbp)
jmp 0xde78
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1a0(%rbp)
movl %eax, -0x1a4(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x3190
jmp 0xe407
leaq -0x188(%rbp), %rdi
leaq 0x6aaa(%rip), %rsi      # 0x14a4e
callq 0x3230
jmp 0xdfab
movq -0x208(%rbp), %rax
addq $0x1160, %rax           # imm = 0x1160
movq %rax, -0x1c8(%rbp)
movq -0x1c8(%rbp), %rdi
callq 0x6440
movl %eax, -0x28c(%rbp)
jmp 0xdfd3
movl -0x28c(%rbp), %eax
movl %eax, -0x1b4(%rbp)
movl -0x1b4(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x1cc(%rbp)
cmpl $0x0, -0x1cc(%rbp)
jl 0xe0e9
movq -0x1c8(%rbp), %rdi
movl -0x1cc(%rbp), %esi
callq 0x6500
movq %rax, -0x298(%rbp)
jmp 0xe016
movq -0x298(%rbp), %rax
movl %eax, %ecx
movl %ecx, -0x1d2(%rbp)
shrq $0x20, %rax
movw %ax, -0x1ce(%rbp)
movzbl -0x1d1(%rbp), %eax
movl %eax, %ecx
leaq 0x6890(%rip), %rax      # 0x148d0
movb (%rax,%rcx), %al
movb %al, -0x1d3(%rbp)
movzbl -0x1d2(%rbp), %eax
cmpl $0xff, %eax
je 0xe072
movzbl -0x1d2(%rbp), %eax
movl %eax, %ecx
leaq 0x6878(%rip), %rax      # 0x148df
movb (%rax,%rcx), %al
movb %al, -0x299(%rbp)
jmp 0xe07c
movb $0x58, %al
movb %al, -0x299(%rbp)
jmp 0xe07c
movb -0x299(%rbp), %al
movb %al, -0x1d4(%rbp)
leaq -0x188(%rbp), %rdi
movsbl -0x1d3(%rbp), %esi
callq 0x32d0
movq %rax, -0x2a8(%rbp)
jmp 0xe0a4
movq -0x2a8(%rbp), %rdi
movsbl -0x1d4(%rbp), %esi
callq 0x32d0
movq %rax, -0x2b0(%rbp)
jmp 0xe0c0
movq -0x2b0(%rbp), %rdi
movl $0x20, %esi
callq 0x32d0
jmp 0xe0d3
jmp 0xe0d5
movl -0x1cc(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x1cc(%rbp)
jmp 0xdfee
leaq -0x188(%rbp), %rdi
leaq 0x695c(%rip), %rsi      # 0x14a53
callq 0x3230
jmp 0xe0fe
movl $0x1, -0x1d8(%rbp)
cmpl $0x7, -0x1d8(%rbp)
jg 0xe3d6
leaq -0x188(%rbp), %rdi
leaq 0x6934(%rip), %rsi      # 0x14a57
callq 0x3230
jmp 0xe12a
movq -0x208(%rbp), %rax
movslq -0x1d8(%rbp), %rcx
imulq $0x12c, %rcx, %rcx      # imm = 0x12C
leaq 0x800(%rax,%rcx), %rax
movq %rax, -0x1e0(%rbp)
movq -0x1e0(%rbp), %rdi
callq 0x6420
movl %eax, -0x2b4(%rbp)
jmp 0xe162
movl -0x2b4(%rbp), %eax
movl %eax, -0x1b4(%rbp)
movl $0x0, -0x1e4(%rbp)
movl -0x1e4(%rbp), %eax
cmpl -0x1b4(%rbp), %eax
jge 0xe296
movq -0x1e0(%rbp), %rdi
movl -0x1e4(%rbp), %esi
callq 0x64b0
movq %rax, -0x2c0(%rbp)
jmp 0xe1a5
movq -0x2c0(%rbp), %rax
movl %eax, %ecx
movl %ecx, -0x1ea(%rbp)
shrq $0x20, %rax
movw %ax, -0x1e6(%rbp)
movzbl -0x1e9(%rbp), %eax
movl %eax, %ecx
leaq 0x6701(%rip), %rax      # 0x148d0
movb (%rax,%rcx), %al
movb %al, -0x1eb(%rbp)
movzbl -0x1ea(%rbp), %eax
cmpl $0xff, %eax
je 0xe201
movzbl -0x1ea(%rbp), %eax
movl %eax, %ecx
leaq 0x66e9(%rip), %rax      # 0x148df
movb (%rax,%rcx), %al
movb %al, -0x2c1(%rbp)
jmp 0xe20b
movb $0x58, %al
movb %al, -0x2c1(%rbp)
jmp 0xe20b
movb -0x2c1(%rbp), %al
movb %al, -0x1ec(%rbp)
leaq -0x188(%rbp), %rdi
leaq 0x6835(%rip), %rsi      # 0x14a5a
callq 0x3230
movq %rax, -0x2d0(%rbp)
jmp 0xe233
movq -0x2d0(%rbp), %rdi
movsbl -0x1eb(%rbp), %esi
callq 0x32d0
movq %rax, -0x2d8(%rbp)
jmp 0xe24f
movq -0x2d8(%rbp), %rdi
movsbl -0x1ec(%rbp), %esi
callq 0x32d0
movq %rax, -0x2e0(%rbp)
jmp 0xe26b
movq -0x2e0(%rbp), %rdi
leaq 0x67e4(%rip), %rsi      # 0x14a5d
callq 0x3230
jmp 0xe280
jmp 0xe282
movl -0x1e4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1e4(%rbp)
jmp 0xe178
movq -0x1e0(%rbp), %rdi
callq 0x6440
movl %eax, -0x2e4(%rbp)
jmp 0xe2aa
movl -0x2e4(%rbp), %eax
movl %eax, -0x1b4(%rbp)
movl $0x0, -0x1f0(%rbp)
movl -0x1f0(%rbp), %eax
cmpl -0x1b4(%rbp), %eax
jge 0xe3c0
movq -0x1e0(%rbp), %rdi
movl -0x1f0(%rbp), %esi
callq 0x6500
movq %rax, -0x2f0(%rbp)
jmp 0xe2ed
movq -0x2f0(%rbp), %rax
movl %eax, %ecx
movl %ecx, -0x1f6(%rbp)
shrq $0x20, %rax
movw %ax, -0x1f2(%rbp)
movzbl -0x1f5(%rbp), %eax
movl %eax, %ecx
leaq 0x65b9(%rip), %rax      # 0x148d0
movb (%rax,%rcx), %al
movb %al, -0x1f7(%rbp)
movzbl -0x1f6(%rbp), %eax
cmpl $0xff, %eax
je 0xe349
movzbl -0x1f6(%rbp), %eax
movl %eax, %ecx
leaq 0x65a1(%rip), %rax      # 0x148df
movb (%rax,%rcx), %al
movb %al, -0x2f1(%rbp)
jmp 0xe353
movb $0x58, %al
movb %al, -0x2f1(%rbp)
jmp 0xe353
movb -0x2f1(%rbp), %al
movb %al, -0x1f8(%rbp)
leaq -0x188(%rbp), %rdi
movl $0x20, %esi
callq 0x32d0
movq %rax, -0x300(%rbp)
jmp 0xe379
movq -0x300(%rbp), %rdi
movsbl -0x1f7(%rbp), %esi
callq 0x32d0
movq %rax, -0x308(%rbp)
jmp 0xe395
movq -0x308(%rbp), %rdi
movsbl -0x1f8(%rbp), %esi
callq 0x32d0
jmp 0xe3aa
jmp 0xe3ac
movl -0x1f0(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1f0(%rbp)
jmp 0xe2c0
jmp 0xe3c2
movl -0x1d8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1d8(%rbp)
jmp 0xe108
movq -0x218(%rbp), %rdi
leaq -0x198(%rbp), %rsi
callq 0x3220
jmp 0xe3eb
leaq -0x198(%rbp), %rdi
callq 0x3190
movq -0x210(%rbp), %rax
addq $0x310, %rsp            # imm = 0x310
popq %rbp
retq
movq -0x1a0(%rbp), %rdi
callq 0x33d0
nopw %cs:(%rax,%rax)