1111011010000001111110110011101101111001010001100100010111101110100001110100000101101011111100000111111101110100000011000001011110000000000011011000011110111000001110011101010001001011100110110100010110110110101010111000001110010110010000001010110111111010111110010001101000110001010000111111000101011011000100001111110010000100001111011001000101011110011000011111101110110011011101111010010110010001 1001101001111111000100100001011101010001010010010100010000111101100111000001010000110001110100100011000110111001000000001111000010000111000001100100100000110000001001001010000001101100100111000110001101101111000111101000110011100111101001010010101111010001111011110101100110010110101100011111110000101111111100100110110111001010110011111110001111011100100001010100011001110001001100010011000101011110 1011000100101110000110001011110100010100010001100010110001000101100000110000000000010010101011010101011010101110000011101000010000100001110000110100100010011110000000101111000000010110110010010011111011010011010100011110011010110011010000011101010001010010010011001110000101001001110110010001110111110101101010101100001101100000110011111001111000101000000111001000010000100110100111101110001001100101 0101110011101010000010111000110010000110000110010011101101010000001100111110010010110010100010010111000100110111001100001110001010101010001110001110010000000100110010110101011001111110100100010010000111110001011000010010111100110111100111010000010101011010001000100000000100011011011100010111000001110000111100010010000001001100010001110010010101001010101101101110100100111011101101101010011111010000 1001100111110010010101001110011101010100010111110101001111110110001011001111111000010111010000110111000011010001011101111110110011101001110000100101111101011010000011100100101000010011010000111001000000101000000101001100111000111110101010101011011010111101111011110000010100001010100001010001100111111111011101011000000000001110000011100100011000111111101001001101111100011001000100111011101010000110 1110000111110011111101100011101001010110011010111110101101101010001110010111100101100000001000001011000111011101110000011001011010011001000110110010100010001100010110100000000110101010101001110000000011111011001101111101100100000001010100110111110111100001110001000100000100000001100101100101110111001001010111010111001111010110001011111001000000010010000110100010010100001000001101000000001101000101 1101111100100110010001010010001100011000111010011100101001110011010001101010000001101101101000010111000111101101101101010100110111000110010010101000001101010111110011000010100011100110000001001001011011000111111101100101001110100000111110001110010011101000100000111100001010001000001111011111110101110011010010000110101100110010010110001100111000110001101110010001101011100000000001110011011000111101 0000100100011100101100000101100011111000010011101111011111100000001100000110011110010001110100100111010000100000000100001010111100100010111010010001001011010000010111011011011001001110000001011010111011001001100100111111111010010110110100000110100001111011000100001101011001110111110100100000001011000010001101010010100010110100000011011001100101110010011100011101101001000000101110101000011101010000 0111111111100100101110000110111011100110011000110000111101011101010000001000000000110011110000000000000000010100100010010111100010010010000111001001110101100011011011100101110010110100101010001111010001010110111100000100000111011100101011011010011110000010000110110110100010110001101111100110010110111001101001100110111010101001010101110010001111110100111010100110111101001001101001000111000111001011 1101000001010011010000110111110111001101010100000101011111001100000001001010111100111111011110000101001010110011000000101010111100110010111111001011100101110010111001111111001010111101100101000111100001001100100101010011101110110110111100111000101110100111110111010101000100110010110000000101011000000110010001111111110011101101010011000110001110010000010000010001111001011110101111010010110010000110 0000011010101010000000101110011100010011110010111011110100010010011100001101010001001011110101110001100110010001000101000011010101101001010011101010000101100101110011010010111010000001111110101011000100100110010010110111011011100110000010001011010010111000000000110001011000010001001001011001001111011101110100110110010000100100100111010101111000101111000100011110001000010001100000001001011011000011 1011111110000101011111000001100011100100010000011100110010110010010110010111101101011111000001100111011011110100010001101101101010010011111010111011000010011000111001011010110001001011000001110011010101000111001011011010110010011000000010011110111111010101000001011010010101010101001000011111101001000011101001100001101101001110111011010010101111100000101101101110111001011111111110110110100100111110 0010010101110001000110011101000110110000111010011010101110000010100001000001100001100010010010111101001011011101001100000001010111101001001101011011011110000000110110011100100110011011111001101010011010000000011111011110100010000110111001001100011100011101011000011010001110010111010000100011111101011011110100111000110001100100100100101011000111110011101101100001111000110011001110100101000110110011 1011110000011001101101011000010101000110110001001100000010001110100111100100010101011111001010010000000101110110010001001001000001100110100101001110011011001001100010100010110011111101010111010101111110000100111101011000101111100011111011001011110111110000000001010110010011110101011010010010100101110110000110100001110011110110001110011011001100101001111110100110111100010010001011010101000100000010 1111111110000100100000010110100001111011111010101101001010001000111000100101110110100101110011110011011111111110100010000001011001001110001101001110101000111110010111101111110110001110100010010111100111011011110010110101011011110100000010110000011011011100110010001110000000100011011110000100100010110110100010001010110010010111011011010111100111110110100100110010000010000011001110100111011110101111 1000000011110001000111100011100110001110111011111010101101011001011001011000001111001000110011010101011011110011101100101010101100001011011100100111010101001101100101001011011101110001100100100000101011100111111010100101110001011111111001110011110110100111100011101000100001001011100000111101111111101001111000111000010011001111110111010101011010001100111001000110000000111101011111010011100111011101 1010010100011100111100110111101000100101110101110100010110010010101000000110001001101111111110001100111100100001110101111101000011100011010101110000101000101010101111101011011100001110110000001011111010110110111000010001010001101011110100001001011001001001100101011010100110100110101010011001111101011110111011011111101001101111100101101101000111110000111000110111101111010011111010000010110101110111 0101001011111010001001000110110011001100101010101000100101001110101110000011100001100101001100001001000111010000001100001001100111111111110100001000011101000111001010101100100010111111111101110111100100001001101100001001010111100011111001000110110011001111011101000111010111000110100000100101100011101110110101110100010011101100111000101001100000101011001001100101111110010101100000010110110000010001 1110011000111101000000011111000010011010100011110100100010101110000111101110111011111000111100100001010001101111100010010110000010110011101110100110100100010110111101110001110101000110010001110110101000001110001001000101101010010100000111001101110111110011000001101001001100010011000111101001100101011000101010010001001110000010110111000110100011100001010111110011100011100000111101111101100001011101 0100100110001000000011101000010101100000111011110101011100001011010101101000000111101010111101111010010111110111110011110110110000010111010010101111101110000100000110110010001100001011001111000000010101111010001011011100101101100001111001101010111001100010111010101000010000011010011011100110011101110001110000011110000001011011000000111011000000011100111110111100101001010110100111110110101100111100 0010101101001100010000110100100001111110100001100100110000111000111101111101111011111001100011011010100110101100111011010111101011011110001010110110110000110010001101100110101110000010100010011110001000010100111001100100100101101011000000001101010110110010010110001110000100101111000101101110000001000001100101100100100101001000011001110101110111010001110110000010100000010000100111110100001001001100 0010000000001001100100101100011011101101110110010100000101110000110011001000001011101110111011110110001011001111010101100000100011111101010001101001111011101111110011110010100000111100111101001010011001111111000111101111010101010010001100100100111001010000110001011001010111011001110111110101110110010101111101001100010000010001010101000011110000001101010001101001111000100101000110111001111011101100 0011100111001000110111101011011111101101011100001000001001101101110001111110001101101001010001000010111000010111010001111101000110011011111010001110011101110111011111101101101000001000111000100000100010001001000000101101110100101000011101101101101010001111100000111111001111101101111101101101000100100010110100001101000001011010100110100101110011101011110001111001000000010111000000111101101101000100 1100101001111000110000010110010001101101111100101110000011100011111011010111100110001011101111101111001011101001110110100001100100110010101001011101110100011111000111110111011000000001101101000110100010000110010110001000000110001011100011101100110101000100111101001011111101001110001111110011001010100100100010010110011010011110100001100101000000010001000110011010011101110101101001101111001100000001 0010001000010100100001000010100100011101010000010100010101000110001110101011100100010100000101100011101000001010010111110101010100110110001110010000010100100010101000011001010110100011100000011110101111101001010111100011001000111111010000011010001000001100010111011011101110000101001110111000101110001111000011111101100011010110000000110011100000000110101011110000001010000000000001010010000100010100 1000100101010001011111011110111100101001100000100001010100111111000111001000011110111111001001011000000010110111011101111000010000000011100010101110100110010111010101000010010011000110111011001100000101110001101010000110100000100000010011101111001111111000011111111011001111100110010000111011111110101111011001110100101000111110010101111010011100111000101010011010101001100001010001101110101011001000 1100000111110101011110010001010101001010010110000000000010011010001000111110110100010100001100111111111001100001011010101101110001101110110110011010101111001110100011100100001011110000101001101101010001010000000101001100100110100000011111000110001010111100110010011010100011111011100110001011100110101001111011010001110111101011110010100000010101110010111001010000010110010100110111110101000101101001 1001010101011110110010001101000101111100001111000000101111111101011011110000000101101001000000101110001010010010100111011101110000101101101101111010110001011010110010001101011101001110101101000111110100010101110010010001011101100101101000000000101000110000111111110010100000111101000111100101000010111100101100000111011011001001111111000010000101110000100001000100001101111101011010100111000000101101 1101100001000010011001111111111010111100000110100110001000101111000101100110100010110011010010001101001101010110100100000011010100101011010101101110000110101101110001000000010000000011001111101010001011110100101010100111011110001010111010000010110010100000001101101000010111011010010000000110010101011001100110001111111000011100111101010010100001100010111101011111101110101000000011001100111000001000 0001111100000110000001000101101010110011111101010001000011110011011000000000110110001001000011100001100010001110000101101000011011101001110011111101110101011011111111000000011010110101011001010111101001011111000111001011010100000000010111100110111000010011010010011101110001010111100111011110011010110110000110001001000101111010111001011110001100101110000101111101111100011011000000011011101010010100 1011011010100101000011011011110100110001011111101011001110111000100011101101111010011100011111010110111111000101000110100000000110001100111011000001011001101101011001011001101010000000001001101111010111000001101011111111011010011100011011001110110001111101100101011111110110101000110100111110110110111111110011111010100010010001101000100111110000110101000010101100101001111001001010001100000110100110 1011010101000110000111001101110000000001101110110111101110010001111110111110101011010110001011000010000110010000001010001101011100010001001111111011100111011001011101001110001010001000001011111010110110101000110101110001000011011010100001000110000111000001010101101100010101011111011010101111000100110111111001111110110001011001100010000111011100110110001001011100100011000111101101000010000001100001 1011010000100100010010111011000010001010110011100000011110110111111111101101000110000110111111011110011100010000111100001011011010110111110001111011010101110110110110100000011101011111111011000011011100101001010011101110000110000111111101000010111110000110101110001111011110011011000101100000110110101101110010101000000101011110010010101111000111001011011000111001100011100100011101111101101011011010 0101111010110101010010101000000101111010010010110101011001100110000000010000010001111110110100111010010001010011000101001110001011000100111111101010110010110100110110111000010100100001100110001101001001001110010101101101100101001101100000000011001010010011100110101000010111101010101100011010101010010101110010111011101110110011000101010101000101010000011100001111011111101011101010110010110000100100 0101111100101100101111001010000000101100001000110011000001001100001011010111110011000000001110001010001011011110010111110001010100110100100100011111111010000010001110011101111100001011100001001111001100000001110001101100101111001001100101110010111100010010101100100101010100110100101110110000111100101010101010111001010101100011010111101011100101100010110100011001100101000010110101100110010111001011 1000011011110101011100111101110010001101100100100000101011001100000010011111010110100011111001100100110100110101000110001001100011011110101100011010010100110001011101010010111010101001010110101010011101110000100010100100010010000010011101000000010110000110100010011100010101011001001110100100110010001100101110001010111000000101101001001011110011100010111000100111101111001100111110010001111001100000 0010001100101010001100010011000111101000100110001100110110000101101100100100101001011000001101011110111111110000010101100001100011010100010000000010100000100111011100011000001110111100101000110000000111110110001000011111010100000010010111001011000100100011010010001100111000011101000001010110000110000011001101011011100110001100110101100100101100011101010001000000110110011000101001011111110101010010 0000000110001000011111001111111011010100010100000010111001011110100100000100001110101011111110100000110111100010100010010001110011001011101100111110001000110000100100000001011100000000100100010001100110101110011000010010010100010001011011011000111111100010010011110101100001011010000100011100010101101000001011100111011100111010011011101010110111010011110001101100111110100100100100101011001011101101 0000010100010111101100010010011001011000000100111001101111010111001111100000010011000000001000011111110001000001111000001101111100011001011100101111001000101111010100101101110001101100101100000000010110111110011000101011011010001010000001000101101101010001110110110111100001010111110011001100100011110111100010000111100101011001110111000011001001011001110010000111000011100100110111011101110011111001 0000100010111111101001100011000010000100011010000111100111010010000011101001011000100111011111111000101011100100010001101110110110000101100010101001010001100100010001001010011000110100101110001111011110010111001101011010000001010100010000110001001111111110010110001011000110010000000011101000011000101110010010011010010000001000010010011011011010110001110110011011111110011111110101111110010101111001 1110111101000000010010001111111111010101001110001000011010111101001110100110101000011100111110000001101100100001011011101001110111111001101000001101011010100000011100001111110100011011111010011111110011100001000111111011101011011001011001010111101110101000111011110100000100110100111110010011011100100001010011011110001101100000010111100110011001110001110001111110100001010110111111011011111101101001 0101001110110110001000000011001110111110000101100100000000101001100111001010100111000010011111010001011111010101111011101010111000001011110010110010101010010000011101100101110010111000010111000001100010110011001011011110111110111000111001110100011100110110110110011010011001100011000001110011111000000001001001100100101101011001001001010110001001111011110110011101011010110010110101011011000011101111 0010001011101111111111010010000001000001000001100100111101010011111011101000001100000011000101111001111011001100100111010111000100111000010010110000111011011011001110110010001100001011100111010100011101100001111011010101001011010110111000100001011110101011100111100101001100001110011111101010110000000011001011010000011101100001010101001100010001010111010100000101011011001101010011100010000110011010 0110111110101010111101111100010101010011110010011001010101010110010101000010110011111100111110101110011010011011001110001100110110100001100101110000110010111100000100011000010111101110011100100101001110010110001010010100110000110001000001101000111101110101101010111001010001101110101100111001110000000110110001001110100110011100001000110010110100000101111100000011111111001000101010111010111100000100 1001100010111001011111001100111010101101101011101110011011110010111100101011001111001110101010100010111111001011011011100001100101000000111010011010001101110001001100100000000000001000000000110001100111001100100011000110011100111110111111100010011010011110110011110101001010010011001111110101011010100111101100001100100101111101110001000001110000111110011010010001000101100100001111000010000001011111 1010110101110000001110111010100001010111101011100010100111110000101110101100111011111101110101111010010100010011001010100011010100010101100001011000110101001111101111001001111011010100101101000111101111001001110001100010000010101000001000001111101100000100100001100000000110011110100010011001101101000001011111011110001101111110100011010010100011001011011000110000111010111010100110101110011001010100 1000100101000000001101001001111001111001010110111110100010011011111000011111001110011111100101000000000001101001110010110000011111110000110110010100100101101000001011111101001111111010110001011000111110100000000101100000010001001101100000010111010010110000001101011100111101111110011111110001001001000101100011110001111101100110110011101001111011001001011000100001011000101011101110110001000101010100 0000110100010010000001000010101001010011001101001010011101110101001011100110011010000111000101000100110001100011100010101010100011010101101111101100001000010010110110010100000010000101000111011001101111011100001001000100100101111100100000011000000111100100110101011010110100001000011001001111101101000100000001000101101111101110011110110100101010011010110101100001110010100010010111110111110101001000 1001000010001110100010010000100001010110100000011010110011111011111101111001100100111010110110001001101111101001000010010011010101110111001010110101001111110001000011000110000111011100010011011010100110111001101010111000110110000111001001110111101101010000010110111101100000000101111001101010001000111000010100010010100010100010001101000010100011101011011101111110110011111011101101100111001101100000 1101100111001001111011010100110010001101101111011000101100001000001110001100000100011011001010001000010100101000100100101101010101011110001100100011111001111001000001010010101000011111100011101100001010111110100101100100001001101101011100001001110101010111000011101000101011001001110011101100100100011010110100000110000000110101111010011101101110001100100111001101010111110000000111011101010111001100 1001111101000110100101111010101110001011010010000011011110000001100111001100000101100110100010010110011101111001100011011110011111100011010010001100011111000101100011110111110000101100110111011001101110101001001001011001000010111101011000100010011110100100000000110010001001000111110110110010110101011101000001100101011111111010010110110111100100010010000100000110111111000000101011111001010011110111 1011110010110001111011111010100001111011100001101000011011000001100010011111000001010000101111101110000001111010101001100011011100101000111101110100110000001001010111011111100001000110110000101000111101011010111010011100110000111001000001000110100101100101011110011100011111001110001101011000100111110110010011101110011110001011001100101110010011110000000110000011000100110101010111101100101000001111 1100110110110111110100001111011000101011110001011111010100001110101010001011101110010111110111010110010010000000011011110010111111011001000010100100001000000111110000001000110100010100111011111110010101100111001011011001110111100000101111011111011101010101000010101011001111000001000110011101010110011111000001111110110100111101111101001001100110111100000110110010100101100001110111100010110011100100 1010001011100110000000101111010001111010000001100011111011110101001111010010100110001101110001110110010010010000000000011001010111000110111110111100101001010011101101100010101010101100101001111001001001111111100010001001111000000001111111110000110111101000111011011011011110011011111100010000101110111001111111000101001001001000100111000011111110111111000001001011111110011100110001010001000110101010 1001100000100111011011100100110010111101001110000110111001110100011001110101101010010000011010100011101110111011001101001110101011101010011110100100011010010011000110101001011101011111000000101000001000111011010010000010010000100111011000000000111110111101011101110110101101111110100011010001001011111011100110011000000111000000000010001000000001000010110010000101000101011010100001010000100110101011 0011110001011110110010101011110010111011000110101000001110110010111010101001111000111000100010100100110000011101101010001001010100101000000001111111101100101100110100010001000000100101001010110111101001001000000100000010111010000111000000000111010011010110100110100011100001111011001101001010011011100110111000100001000000010101000110010000000110100110011011101010000100000010110010000010010101000001 0011011010011110101101101100110101010010011100110110000100010100101001011111101010001001001110010111110010000101111000101101011001100100010001011101110100100011011111011111111010000001010110011110101100101000010010111100010101100111110110011011110001111010001111110100010001101001000100000001000101101000011110010011001100101110111110100110011110000011110010010101110010011001100111111010110000111000 0000110101000100001010100111010001100100000110100010000001000001001010100110011011100101100010101110010011100111001011010101011110111101111011110001010000100100100000001101000110011110101101011101000000101000111100011011011111110010010100110000111000011000010101101011101110110111000011100010111100101001111111001111000110111101101111100000101001100110000010110001011111011000000011011110011100111010 1000010101010100101110011101100011111110001010000111001101011000010110001101010010111001011001100111110011001011100001000001101011010111100111000110000101101110101000011001110110101011100100010010101101111101110011100001100011110000100011000111001010110011010010111010111101010011101000111100001001011100000000011010110100111010000010001001111010011001100110011101010010001011011110001011111011010001 1100100011101110011001001011100010000100000000100110100111110010011001000110000100010010010011101010100011001010011001101001111001000000100010101000100000000111011100001111111101010111000110110001001111100011000010001001000100101101110111101110000110010101010100000110011100010101010111111010111101000001111100011111000001111100011011101011001001101010110010101110001100011001111101100100100110111000 1111101011101101100000011111110011010111110101110001110010110100001111100110011000100010110001010101010010111011000011111011001010000100100101011111011000000010000110111000111111111011011011111100001000111110110110001001000010100010110110101011111011111011011111100000000101011110010011010011010010101110000011001100101101001101000001111110100001010000101110011000000010100111001011010101111001101011 1000110001011010111001111111111011111100111111110100111110110010110001100101111010110100011100001111011110010111011010010111001101101001010100111011001100000110010111001000100011110101101000000010001000011010101011000101001010000100001011110111001111001111100000010000101000100101001111001000010111001100111010111110001000111100010111000111101010101011010111110110000010101011011001011110110000110000 0100100000101010011100001111111110111101000111000101001001010000001011110001000000001001000110001000111011101010111001000011001110101010110010010010000111001011001011010001000000110110111110000001011100011000001001110111011011001000111011001100100110011000000011011000001110000010110011110000111011010000000011001000111000101011111001101010001010110011101011100001000010111001000011011111000100101011 1000111110010011111001110001011011100101011001110001011111101101100101010111001000001010011111101000110110111011110111010101001010011110111111011000111001110100000010100010111100111011011001000101101001110101110011101011010010011111100110100110111010111111110111110010100010100011001011111111000101000101000101110110101101111111011101100110000001101101001001100001100011011111000111111000000100100011 0001001001100101100100100010011011101110111101011111100100000101010101000101111010010111100110111010001110111010001010001110101010000011100110100100110001011110110010110010100001001110011111000111100000101011101010010101000010110010010011101110011001101101001100110010101011001010010101110110011000000000000100111110101100110011001100011101110100001100000110110101101001000010100000000011011101110110 0011110000111010010111101110011001100111011000111110100001000000101110000100101010111101101111101001111010101001101010000011010101011010001001001100110110000101110111001111011100001100110101011001101110000001101110001011011100000000000111100111111111001101111001010010011111010011000010000101100000011011111001111001000100011011111110000110000000011111110101010001011011101110100001100000010111000110 0010110010011011110101111110000011001101010110101000110101100000011000011011100001011001111101010000101100100111110010000001011000101010001100010010100001010101000111010110001010100100000111110101000101000110000110001000110001011010011011011011101101011100111110110101101111000001101110010100100000111001101111010101011110011000001110001101010111001110101001010000101111111101100000001001011010011010 1010000110111101011101011001010101101111000110111110101100001111110100001110010111101111111011111101000000100101010000100111101111101010001100100011111011011100101100010000111010001000010110100011011110100000000011000110000011010100101101010011000111010000100101111111001101001000110000010100010000001111101101100110010110100000011111010101101010011000001000100111100101100101011111100011010110011010 0100010110111011101100010011011011010010100011100101110100111011000111100010011101001100101110011101111010110111000010011101011110101010101011110111000000011111101111011010000110101011000010101100010001100111111111001101110101011011011010101101000100011100101011101011010001000100010111111001000101000010110101111101010001000011010101110000111100011100011100111110011001100010110000101000000110100100 0000001001011001101110000010010001010100010011000101101010000110011110010110000111100010001000110101001000110100100101101110000100100111101011001101001001011101010101001100101101011110111011011011001011010110000011111001010001011101100011111011010111101001011001001111100111000110101011111101000010100000100000001000101010010011111001001100110010100000001111100100101000100001101101100111100100111001 0010101111110111111001100011101100011111010000111101010000110001111110010011101101110111010111110000001110001111011011100010100001101110110000111110110101110101111101100010100100000111011101011010110100100101100011000111111000111000110010000101001111100000010101110111001001100010101100000010010010100110111001010000010000111011011001000000010010111010010001000011101111111110110100011010111010011101 1011100001111001011100110101011010001000011011010110001100101001100100110100000101000111101011111001111001000001011001101010010010111010110100111001111111101100011001001111111101100001101110001000011111100101010010100000111001001101010111000100111101001010111100110000001001110010101000010000010000010101100110011011111011011100100101110010001101011011010011110100000000111001000100010110111100000101 1000011101011000111100011011001000100101101010101010111101101001101010000110010101101100101011001010110001100110001110101001100101101111011111000101010111000101010010000101110110001110001001111101101011110000000101100001010001111010011011011111100101111100110000110110010001011111011010100010011000110101001000100010000101000111101101011111001100101011000000010100000001010101111100010110010001001011 1110001011001000010110111000011001101001101101110010100001101010010110010011000110011110000010011110010100100001001110100011100110011011010010101110011010111000110010101111111000010001011101000000110110100101101110110110100100110010011001100110111000101100011101100101111010110010001110001000101001100110010010100100001111000001101011001011111101001110101011100101000110010111011100010000001010101001 0101011010101101100111010011110000000101011010001001011001011000000011000101000111100101010101011001011100111010101000011010101100000000101111110001100000101101000001001101000000000011001101001000011111100001111101110000010110000001001010110011001000101100010100011001100001010111010101001111001111110101101101100011010110111110110101111101010011010010011101011011000101110110100001011101000010011000 1011001101000110011000001000100011000010110101111001101111111111100001110100111110110001101100100000110100010100011011010100101101111001010100011110100011110010100101100101010011110011110110001110110000111001010010110101110010000111111111001111111010011101100010001010101010111110101001101100100110100010010101010110100011010100111001000000110010111001000011001000100100000010111111111100000110010101 1111101100000010000000110110100110001110001101101011011010111010111101101010001000011001100011000001111100010110110110000111000111110011001100001001110111110001001110110010001010111101110100001111000010101111101010110000100101110011111000000001001011101101011100000001011100010000001111111100000011101010101100010111101001011101011111011101100100110101001001100000000001000001001000010010000000100010 1110000011010011001111011101010110000100011011011001110101011010001110100000111110100010011111111111011100101101000111011010010111101001001010000101011111111101010010111011111100101011011001111000100111111010000100011100100001011010111000000001101010011000000110001101011010000110110011111110100100011000101000010000000001110111100010000111101101011011111101101010010101000101110000100000011000000100 1001101100000010001111000010101001110101100101111100011101010100001011101100011011000100010110101010011101101011011001101000110101010010100111001001100000000001100100010010011001001110101000100100100011011100111101100011001110010000100110101100011010000001010011011111010001100000001010110110000011011101011011000000011110001110000110101000010101000000111111101100111101110000011101100001110010110101 1110110111010010011001101111111011111011001101111010100000100000011100100011111101100100010110100110011110110001111110111011101110101001110000100100101011100000011101100101001000100000111001010101000111111001011010111100101010000111011001110110110101011101011110101111101111101000000100000111101011100010011000001100100010100100101010000011011110010000111101011001100101011111110001100010010101111010 0100011111001111010100011000100001010100011111110000100000111001011111010010111011001001100111100000111111001111001100110101100000001001001101100101101100011011011100000110101010011010001011010101101010010010000111011111110010001100011010111111000000111011010111011111111110000001000001010001011110111100111110110011010010000111001011011101000000001010100100010111111011011111010111111000110111110011 1101100010100100010011100111001000110101011101110011100110011111010111110111111100011110100101000000111011010011000011000000001000011000001011101001011001001101110010111011101100101110101001001011110110101001010011110101011100101001100100000010010111100000011101010000100111110011010111100010011010011110000000100011100010011101110000000011001010100000000101000110110011010100011110010111100001000110 0101011010100110001111101011010110011000001010001010011101001011111111001001001000100001000100110111000000100011010100110101111010110110000001111100110011000110000011101011010100110010000110100101110010001011101101011111111001010000100110010101011100110000001010011010110111000111100011000111100000110000011010000100101010100100010010000110001111110001011001110110010000011100001000010001010001011000 1101010011110101110011101100100101001110001000011110111010110100100100011010010011101111001110100111010001101011000110010010000110000101111000010010001011110010110001001100111001011101001010001111000110011111001001111101011000011010100101110010111000100100111011111011000011001000000010110000011001100111111111111000111001110111010000111111101101100011010101101010001000000101111001100110000011101100 1101011000010100001010100110110000010101110010011011000100000001010010111101001110010001001010001010000001010101100111011000001100111000111110111101111100110100100100000101000110110101010011111100111001001010011111110001011100010111100011100100010100010001110100111000110010011101010000101101101001000011110000110011010100001001010001111110001111010001101100111001011110100011101110011001100000101101 0100000010011010000011000001111101010011011011111011011000010011111101011001100000001000000011001011010011100101111100111101111100010101010000111010110001010010000101010010101100010101110101000000100110110000111110100001100111110111000111101001111111011101111001001001000111101011011111011110000101001010100011111100100011111001011010001000001001010101011110111110111001011000111011010101000001101100 0010110100100010001100101001011000010011110001110110101101111100100100100001110000001010010111101111110001001101100010100000000001101110000110111011011111011011001110100011111111111111011100010100000000110101111001100111001111111010001111000010110110001001100101101110110010001111000000101000001000111110011101111011010010001000001101111110011101101110010010100110100001011111010100101010010000010110 1111110010000101100110110110001001010111001110111011111011010111011101011011000101101111000001000010111000000000000110111011011001011001000111101001011101011001000000011011111110111000001011100110011000101010100011000110111011001100010101101011010010111100110100011100000100000010100010011011110111111001110000011101010000000000111011010011011001000010110010111111001101011001110000010000100101101011 0010001100111001111000001011001111010010000001001000001110011110000100001010010010100100001001110001110100110100010111001101010100101110011001100011101011110101101101011101111011001011001001000011011110011100001000100100101101101111000000110111100001111000011110000001111101101111100110011000110000111100101111100100010010101111010011010111110100000011101111000010001101011000100111100100011011110111 1100111111100010110011011000111101100010011001111000101101011001001100110111001010100010100101110110010001100011001100001010100010011011000010101010000001010111011011110001001000010011111100111110001110111011110111111001100100100000010110110011101000101101001101000011110101100001011000110110001100010000111001001111101010101011100100101110000111001101110000011010011110100000010000111011001000000001 0010001010110000000111100111010000111001010010100110100011100000011101100001010100100001000110010001110000001100101111001011011011110100000000111110100110110100010001110010010100011011100010101010100110110111011111110101101111110001001011101000001011001010001101011011101111110100110101010001010011010110100011000110011110001000000001001110111101001000001001000101101110110101001111111010111100001100 0101101110111111011100000011010010010100110100101001101000011011001001010101101110110011010011001011100111010001111110000100011010110010100010000011100100101010010011111010100100101110010000001000111001001110001100010001001101010011001001101110010001000001100010110010101100011111000111001001000100000010011101000100110010110111100101001000010110101000010000001111100010011101000110000010100001000101 1111000011111010010011100001111101001011101111010011110111011100011010101000111000111001111010011111011011110001001001110010111100100011000111100100011010010010110010101001010100010110101101011001011110010011011001000101011100011101111101000101100001000100111010111100110011000000110111110111101001110010011011111011001001111000010001010100001000111000010101010111110101100101110000101011000011110010 0001101000001001010111000111011100000010111011010001100011000010001110011001011010100111001010011100000001000001110111100000111110100110110000010100011111011101110001011110110101101101010110100011011110100011010010001010110001011100111000001011101111110101110001000110110110111101001100010101011011100011101000011101011111101001011100010001011000011101000100110110011011110111100101111011011111101100 1000111011111101000111110001010110010111000000101010010101010011000101101011110010100011101010110001101110100101000100111110110001001100100011001011010101101110000111001000000111111100001111010101000110100111101101011101001101110011001001111100100010101010110110110001000000010001000101001001000111010010011001100001101000000000010111100011101001010010011100011000001100111110010100000101111010100110 0111001100100010101010110100010000110110111001010110010101010001011101111101100001100110010100011011100101110001111011100001111111100011001101100001110101011111101111110001011011000001000011000000111000000001111110000101100010000110000000101111010101001111000111011011111000010110011011110011111100010101000110110011001000010010000011001110111011101001110011010000100110001010110100011000000000101011 1101000001110101000001001111111000111101101100000000101000000000101011110000101011001010000101010101101100110110011011011110100001001010111110100111011010111001110011000100001111011010011100010000011100110101110010110000111011101101110000010101011110011011011101100011010000001010011011000000011111101001111101111111000011110010011010011101001010011100101000001001101100000011101100000011111011000001 0110000111111111101111010010101000011110011100000001110001100101001001000011001101010111100011000011111010011000010011000010011010000110010000111110010101001111111111000110101111111000101010001011010011000000000000111010111100101001111001011001001001010100000001110110101011111101100011100110010100101011100101111100001010000001011110011001100010101000101101000111001000111010100001101011011110001101 0001111001000010001010101111010100110000110010111111101011011111110010110011111111010010110000100100000011100110100111011010001001101010010000001101101101000001111000011000111001001001111001001000001000011100010000000101000100111010101001100001111110011100001011100010011100100101001001010001110001010011110101000010010111100000011101011001110010111110011101011000000111101100110100111011000000110100 0101101111100101111010101110111110101101000111011110111000010100100100101111101000100001101111010001101111000010111000110011001010111110100111110111010110110010011100001100001111100001000100010000011000000001100110101111110100010110101000101010111110000101011110000000000010101100100010110000111110110000001011100011000101001110010011110111000000101111000011011110111110011011001100000001001000111001
C#cTrader Algo

【cAlgo】cBot開発でも新しめのC#機能を使いたい!【Tips】

7/30/2021

3年以上前の記事です。内容が古くなっている可能性があります。

cTraderのcBot開発にはC#4.0の機能までしか使えない?

cTraderフォーラムを見てるとときどきこんな話を目にします。これはある意味正しいのですが、正確ではありません。

確かにAutomate画面から右クリックで「VisualStudioで編集」した場合、そのままではほぼC#4.0までの機能しか使えません

ただ、新しい機能を使う方法がないわけではないのです。少し詳しくみてみましょう。

 

C#の機能とは何を指すのか

「C#の機能」といってもちょっとざっくりしすぎてて何を指すのかわかりにくいので、ここでは2つに大別して考えます。

①言語自体の機能

いわゆるC#の新機能というとこっちを指すのが普通かもしれません。「こんな文法が追加され、こんな書き方がこんなことができるようになったよ!」みたいなのです。

たとえば文字列補完式。変数priceの中身を出力したいときはこんな風に書けます。

    Console.WriteLine($"価格は{price}円です。");

この文字列の中に{}で変数を埋め込むというのはC#6.0から使える機能です。

同じことをC#4.0でやろうとした場合、こんな風に書く必要があります。

    Console.WriteLine("価格は{0}円です。",price);

微妙にわかりにくくて不便。WriteLineで使うならまだいいのですが、普通に文字列生成したいときにはstring.Formatを使わなければならないため余計に面倒です。

実際(普通にやったら)cBotやIndicatorの開発では文字列補完式は使えません。これは実は使ってるC#のバージョンが低いわけではなく、C#4.0以上に相当する機能はcBot開発用拡張機能によってエラーとしてはじかれるようなのです。

逆に言えばこれら新しめの言語機能は拡張機能にさえ邪魔されなければ、コンパイルもできるし動作も問題ないといった機能なのです。

 

②.Netフレームワークの機能

例えばWeb接続なんかをしたい場合、現在だとSystem.Net.Http名前空間のクラスを使うのが一般的だと思いますが、cBot開発においては(そのままでは)使えません。

using System.Net.Httpと冒頭に書いてもエラーになりますし、参照追加しようとしても選択肢に出てこないのです。

「C#4.0までの機能しか使えないから仕方ない」とあきらめるのは早いです。これはC#の機能ではなくて.Net Frameworkの機能でして、.Net Frameworkのバージョンが古いのが問題なのです。

cBot開発時のターゲットフレームワークはデフォルトは.Net Frammework4 Client Profileですが、System.Net.Http名前空間は.Net Framework4.5で追加されたものなので使えないというだけです。

ターゲットフレームワークさえ変えられれば利用できる機能ということです。

 

フレームワーク依存の機能だけでも使えるようにする

先に簡単な②を解決する方法を紹介します。一応簡単にフレームワークの説明しますが、方法だけ知りたい方はこちらへ。

 

そもそもフレームワークってなんだ?

C#やVBといった言語は.Netのフレームワーク上で動きます。要は.NetのフレームワークというのはC#やVBを動かすために必要な基盤です。JAVAのプログラムを動かすためにJAVA仮想マシンが必要なのと同じように、VBやC#のプログラムを動かすには.Netのフレームワークが必要なのです。

例えばcTraderの場合は.Net Framework 4.0上で動くため、.Net Frameworkのバージョン4.0以上がPCにインストールされていないとcTrader自体動きません

「そんなもんインストールした覚えがないぞ!」という方もご心配なく。.Net FrameworkはWindowsのインストール時に一緒にインストールされています。Windowsのバージョンによってインストールされてる.Net Frameworkのバージョンも異なります。

この.Net Frameworkが色々な機能をもったクラスを提供してくれるおかげで、C#のプログラムではネットに接続したりみたいな実際は複雑な処理が必要なことが、たった数行のコードを書くだけで手軽にできるわけです。

(なお、今では.Net Framework自体がすでに古いフレームワークです。.Net Frameworkはバージョン4.8で更新が終了しており、現在はWindowsのみならずMacやLinuxでも利用できる.Net Coreが主流となっています。)

 

C#と.NetFrameworkの関係

C#のバージョンと.Net Frameworkのバージョンというのは確かに密接な関係にはあります。例えばC#4.0であれば対応する.Net Frameworkは4.0です。

(それぞれバージョンの対応はQiitaのこのページが参考になります。必ずしも同じ番号が振られてるわけではありません。)

こういうと、「C#4.0機能しか使えないのだから.Net Frameworkも4.0までしか使えないのは仕方ない」と思ってしまいそうですが、そういうことではありません。

あくまでC#4.0の機能が.Net Framework4.0までの機能をベースに設計されているというだけの話です。C#4.0の機能の中には.Net Frameworkが4.0以上じゃないと動かないのもあるよ、ってことです。

 

ターゲットフレームワークは変更できる

cBot開発で一見.Net Framework4.0までの機能しか使えないのは、ターゲットフレームワークが最初からそう設定されてるからというだけです。

別にcTraderが.Net Framework4.0で開発されていたからといって、新しい.Net Frameworkさえ用意できる環境であれば、cBotやインジケーターまでcTrader本体に合わせる必要はありません。

cTraderのcBotやインジケーターを作る場合、ターゲットフレームワークとしてはデフォルトで「.Net Framework 4 Client Profile」が指定されていますが、そもそも今cTraderが動いてるPCで.Net Framework 4 ClientProfileしか入ってないなんてことはそうそうありません

少なくともWindows10であれば必ず.Net Framework4.6以上が入ってます。ターゲットフレームワークは新しいものに変更してしまいましょう。(自分が使うだけのcBotやインジなら選択肢に出てくる一番新しいものにして大丈夫です。)

VisualStudioの「プロジェクト」メニューの一番下、「 (プロジェクト名) のプロパティ」を開いて、「対象のフレームワーク」を変更します。

これだけで「〇〇というクラスが使えない」「〇〇が参照に追加できない」といった問題は解決することが多いです。

 

 

C#言語機能の新しいものも使う方法

次に①の新しめのC#言語機能を使う方法。要はcBotの拡張機能が邪魔なだけなので、拡張機能が動いてないところでcBotを作ってしまえばいいのです。

 

C#の新しい機能使いたいなら、メイン処理は別ライブラリとして作るべし

結論としてはこれだけなんですけどね。ライブラリを作る際はターゲットフレームワークは自分で指定するため、これもできるだけ新しいの選んでおきましょう。

これによりC#7.0までの機能はすべて使うことができます。以下で手順を詳しく説明します。

 

手順

ライブラリとして作っても、cTraderで使えないと意味がありません。ライブラリの機能をcBotやインジケーター本体のalgoファイルから呼び出す必要があります。

そのため、こんな手順で作っていきます。(cBotで説明しますが、インジケーターでもRobotクラスがIndicatorクラスに変わるだけで、ほぼ同じです。)

①ライブラリ側でRobotクラスをメンバに持つMyTestLogicクラスを作る。

②ライブラリ側でロジックを実装する。

③algoファイルからはライブラリを読み込み、MyTestLogicオブジェクトを作り、メソッドを呼び出すだけ。

では一つずつ見てみましょう

 

①ライブラリ側を作る

VisualStudioで新規プロジェクトを作成します。

新しいプロジェクトの作成で「クラスライブラリ(.Net Framework)」を選んでください。

次の画面で名前やターゲットフレームワークを設定します。

名前はなんでもいいです。フレームワークは自分で使うだけであれば、一番新しいものを選んでおけば、上記②の機能も問題なく使えます。(デフォルトで新しいものが選ばれてると思います。)

あとでcBot本体から参照するときに作成した「場所」が必要になりますので覚えておいてください。そのままであれば自分のフォルダのsource\reposの中だと思います。

続いて、cAlgoのクラスを使えるようにcTrader APIのDLLを読み込みます

ソリューションエクスプローラの参照を右クリックしてして、「参照の追加」。cAlgoAPI.dllファイルを探して、追加します。おそらく PC>ドキュメント>cAlgo>APIにあります。

あとは冒頭にusing文を追記すれば

using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;

これで、cBotを作っている時と同じ感覚でcAlgoのクラスが使えるようになります。

あとはClass1の名前をMyTestLogicとでも変更して、こんな感じの雛形を作ります。パラメータを持つcBotの場合は、コンストラクタの引数にでも追加しておいてください。(インジケーターの場合はOutput属性のIndicatorDataSeriesも)

namespace MyLogic {
    public class MyTestLogic {
        // --- フィールドにrobotを持たせる
        private Robot _robot;

        // --- パラメータがあればこんな感じで
        //public int Period { get; set; }

        // --- コーディングしやすいようにプロパティ化しておく
        public Chart Chart => _robot.Chart;
        public Bars Bars => _robot.Bars;
        public double Bid => _robot.Bid;
        public double Ask => _robot.Ask;
        public Symbol Symbol => _robot.Symbol;
        public string SymbolName => _robot.SymbolName;
        public Positions Positions => _robot.Positions;
        public PendingOrders PendingOrders => _robot.PendingOrders;
        public DateTime Time => _robot.Time;
        public History History => _robot.History;
        public MarketData MarketData => _robot.MarketData;
        public IIndicatorsAccessor Indicators => _robot.Indicators;
        public void Print(string msg, params object[] parameters) => _robot.Print(msg, parameters);
        public void Print(params object[] parameters) => _robot.Print(parameters);
        public void Print(object value) => _robot.Print(value);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips, comment);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment, bool hasTrailingStop)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips, comment, hasTrailingStop);

        public MyTestLogic(Robot robot) {
            _robot = robot;
            // --- パラメータがあれば引数で受け取ってセットしておく
            // Period = period;
        }

        //------------------------------------------------
        // 下記をそれぞれ本体の同名メソッド内で呼び出す
        //------------------------------------------------
        public void OnStart() {
        }
        public void OnTick() {
        }
        public void OnBar() {
        }
        public void OnStop() {
        }
    }
}

Robotクラスのプロパティやパラメータはほとんどpublicなので_robot.の形でアクセス可能ですが、いちいち書くのが面倒なので直接呼び出せるようにプロパティ化しておきます。

Robotのpublicメソッドも、PrintやExecuteMarketOrderなど頻繁に使うものは直接呼び出せるようにしておくと便利です。(他にも必要なものあれば加えてください。)

 

②ライブラリ側でロジックを実装する

中身を好きに作ります。ここはいつもと全く同じ。上記のOn~にロジックを書くだけです。必要なら別メソッドや別クラスも自由に作ってください。

一通りプロパティやメソッドを用意しておけば、普段cBotを作ってるときとほぼ同じ感覚でコーディングできると思います。

動作確認がてらこんなコードを書いてみました。毎ティックスプレッドをログに出力するという特に意味のないcBotです。

    public void OnStart() {
        Print($"{SymbolName}のチャートで開始しました。");
    }
    public void OnTick() {
        Print($"スプレッド現在値{(Ask - Bid) / Symbol.PipSize:f1}pips");
    }
    public void OnBar() {
        Print($"{Time}:ローソク足が更新されました");
    }
    public void OnStop() {
        Print("停止しました");
    }

ここまでできたらCtrl+Shift+Bを押してビルドしてライブラリ側は完成です。

 

③本体(algoファイル)を作って呼び出す

algoファイルを新しく作成します。MyLogicMainとでもしておきましょうか。

作成したらVisualStudioで開いて、参照に今作ったライブラリを追加します。

上記ライブラリを作った場所を開いて、MyLogic\bin\debugの中にMyLogic.dllがあると思うのでそれを参照します。

今回はこれだけでも動くのですが、あとあとのことを考えるとターゲットフレームワークも変更してライブラリ側に合わせておく方がいいでしょう。(上記参照

あとは簡単、using MyLogicを冒頭で宣言して、本体側でMyTestLogicオブジェクト作って、各所でメソッド呼び出してあげるだけです。

using cAlgo.API;
using MyLogic;

namespace cAlgo.Robots {
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class MyLogicMain : Robot {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        MyTestLogic _logic;

        protected override void OnStart() {
            _logic = new MyTestLogic(this);
            _logic.OnStart();
        }

        protected override void OnTick() {
            _logic.OnTick();
        }

        protected override void OnBar() {
            _logic.OnBar();
        }

        protected override void OnStop() {
            _logic.OnStop();
        }
    }
}

上記の通り進めているのであれば、algoファイルの方はこれをコピペでいけるはずです。

基本こっちのファイルはパラメータを追加するときくらいしかいじることはありません。ここまでできたら閉じてしまっていいです。

注意点としては、ライブラリ側を変更してビルドしたら、本体(algoファイル)もビルドしないと変更が反映されません

面倒に感じるかもしれませんが、本体(algoファイル)側のビルドはcTrader内のボタン一つで済むため、大した手間ではありません。。

 

お試しあれ

最初だけ少し面倒ですが、簡単なcBotやインジケーターならともかく大掛かりなものを作るときはこの方法を使った方が結果的に効率は上がります

もしこの丸投げ型を頻繁に使うのであればライブラリ側のひな形をもう少し作り込んでおいた方がいいかもしれませんね。この辺はまた気が向いたら別で投稿します。

 


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori