1110111000101010101111101101110000101111100000101100111100110000000001100111111011110110101110001010011110011000001110100011000001011101101011010111100001100000000010011111111011111011101011110110010001001101011101111100011111010001000100010101101101000100010110101111010010100000100100010001100001111101101100011001010111100010101000101010110010100111100111011010101101111100100110011110001010000010 0101100000000101110010011001110011010011001101000110111000100011011111011110010010011001000010100001101010000010110100011111010110110101100000001100101010101111000001110100011000100111010010001111001011110111111010110001101010101011001000111010001001010101011001010000100010011110111110011010001110000111100101101111001010001001111110100110101110110001011100000111101000010101111010001001010010110111 0110001111011100010101001100010011000111011100101111111101101111100110001010011010010011101111111000111000111010011100110001111101010011101111101100101110100000111111111000000001111010010100100100111111101010000000001111010000010101000101001101001110000011100000000001111101101111001111111011101011101100100110100111010010100101000011100111110011111111000111111000010000100000100000011000000101011001 1110011100010010001010010010101001000101010010010001000110110101001011001001101001101100001110110010010000100100100111011111011001010001011010011100110111101000111010100000010000011000100010010010001011100110010110001111001011100001111110101011110101100001000000011100101001110100111100000101010010101011001100011111011110100110111000101000011111110111010100001100011000111110100000101001101001011010 1100101100111000110010110100110101011111001011100100100110110000100101110001111010000110001011000000111101000010111110011010111010100101010111111000001100010011101001011100110111100010010100011011101000000001111001010001000110000100101000100010010110111111100001100111100010101001011100000010000110000011011000110101011110001110000000011000001001111110111000101011011110100011011110001110100010100010 0111100011100001001101110110100010110111000011001110011000011111110000010000011000011100000000110110101100011011011100000100000010001101011011011001100011000110010010101101011110111010110011101101111001011101011111110011010111100110110101000000001111010110100000011110101101111000101110010111100000111101010110101100101110101110010001101010000101000001111100100100010111011110000001011010110110000100 0100011000000001011010010000100101111010110001001000001011101111100010000100001111000001000100100011000010111000101111000110111000000111000101000110010111111101100111010110011000001011111101100011110011001111001111001011001010100011101011111010011011111101110111001000001001100101001111111000100000011110110010010010000101011100100001010100011111000100000100110011010010101011111010100101100111011101 0110111001011011001111110010100010110101110000111111110110111010111101010010111010010000011001111110000110011011000101011000110000110010010111000001101111000101000011111111101111010010000110101000011100110111010011100110111011101001011100111011101011011111110011000100000100011101001011001011111110110000000100111101010010000001111110110100100001001110111011100011101111101100001110000111100110101101 1101110100001001110111001000110111010011101101010010100101110111001101100111110110101110011111111111100000000100100001111110001010011000101100000100000101100000101111010101001010000111101000110000111110111000101100011011010010010010001111010000001110000101000100000001111111010011100010111110111000101011101000110100001010100011001101011101010111111010000011110100111101011100101110111011011101111100 0001001000000111101011111101110110111110010100000101010011110100111001111111010011100111111101011110110110100011010000010010000000100000000011110011010011111011110111100001001010010000010010000011000110000111011001101001111100010100100100001101000111100110111111110101001101000001110011110011101101110101001100000001001110101111100010000001100001111111100111111101000101111001000110110100100100011100 1010101110101010010000000000001111010100010111010100011110101001100000110000011010010100001000000011100011110100000010001110011001110001110110101000101010011101111111100101111011111011110010000111111011001110010100100111000000001010111010010000101010100101010101010110000010011011011101001111110011011001001001101100000011000100001111111010111011001110001010111001010010010100111101110011010101000001 1110101001110100100100110110001001101110001101000011010101100000010011001011100000001010000010011111001010011011010110110001101001110110101010010100111011010000010111011000100111110111011001001001011111110010000101101101010000101001111101000111101111111011111100110101100010001111011010000110100110011110110110111010001110000101000101101010000101000000110110001101100101001000110111001101001001001111 0001101000011110010101110010101000010100100110101111110011011101011110101001010111110101111101000011111111110100101001100110000111110001010110110101101011001111000100011101000111011010100001011110101001111011011000000001001011101011000001010000110111001101010001101100110100010011011010100000101001001110101010111000101001110010101000001010101010100000010100000110111101100101111011110010100111000010 1100000010110000000111001000111100000001100001111100100000101100011100100100001100010101110001101000011000011001101110111001111101010010000010010000001011010111001101000110111010000001000001011101000010001100011001010000011001011111011111000010011101100010010001001001100100000111010001010110001011011101101101101001101111010010111011101101011011001101111111011001010011010111010011110001011100010100 1111000111000010111011100110111010000110011110000000110101111101000111001111101011000001001011111011000001100010011100111000110100000011001101110110110001110001100001100011111001111111001010010010011010100101111101010010011010101000110000000010111000110000001111011110111101100001010010100101111010101001000001111110101010110010000100111111111110111101101110110000110011011011101101110001100001011101 1100100100010010110100001100011110100110000101011111111011010000111001100000010011010010111101101011010100110000111001010111111111101100100110000001110101111001001100011001100111001101110100001011011011100001010010011000111000110110100011111100101100101001000010101000100001110001001010011101001110101010110011010100010000010010111101010111001100000011011001110000101110101100111000110111001010100001 0010010100011011110111001110100110001100011111010111100011000010000111001010100001100100001011101001101100110110101100101101110110101110001110101110001000001010100101010100011111111110010111000100001000011101111101010100001011111010010011011011111000010100000111110100001001100000100100010110100101010000000101011100010101100110111110001010000101000011101001110000110001100101100000110111000111001110 1111010000010000100111110000001001010111100110001000100101101110000100001010110100001101101001111100110001101001011010000001001010100010011001100100010101100001001001110100100100000010000101110110010010011010010101011101001111110100010111011110110010101011010101011110001000001001111000110100000110111101001101011011110001100011010110111001000001001000001001010101000110110001000001101111011001110100 1000110000011001111100001101000111111100010100100000101011001100110100110000001100101001100010001001011010010110010101011110010010011111101011110000111101000000000001100110110110101101111101100111000000011111101111100000100011011111000101111000010011111111001000100000111100111100000010001110001001001111110011010010110100011011110111011111111100000110001001000000001011101010011111101101100111110111 0110101000000111111001011101000111011110000111111011010111100011010010100110101011000101101101111000000011000001100101000110101010100110101000101001101011110001101111010110011001000000001011000111001111111101111111101110000111101101000101011000111110101100111101001001010111001111000001000100001000110101000110111011101101011111101011010111101111011101001110001100000100001100100110111010100100001101 1010011000111011001110011001001000111001101001011101010100011111001010000000110010000100010001101010000011111110011100011101100111001011111101001111000101011011111011010011000111001011001000010100100110011010011000110111000100001100100010111111010111010001111000010001000110110010000101111000110110000000110101000111101010011111011100000101001010000001010001001110011110000101001111111111111101110110 0000101110111111010100101001111100000010101110010000111010011010000100111000101110001010111000010101000000110011000001100001111100011101011001100010001011001010100011101101000100001111000101000010010000110000111100010001011110010111101100100101010111001101000011101101101111110011110111000111010010010100110111010101110111100001111010011110100101101101011001100110101101110101011000001100011001011100 0100000101000010100100111100111111001010100101111011001010100011000100000100100110001010111011010110101010011000111111110011100101110000101000001000001000110100100101000010010000011011001100111001011000101101000101100001000101000101011011101101101111111001111111100001001011101111101101010101000011011010110110100000100101000101100001110110100100100111001110100110111011111111000100010111010110111011 0000011010011010001011100111100011011111110110101111001110010000011011001000000010111100101111010111101010001000111110111001010100111001001010011010010101110110110110011100101100111010110110000100110110110100100110100001010000000100011111000111001100100001010111010010101000011011000110010100001110011110111110010101101101001101110110000111001100101010000111100110111011110000001001110011011111001000 1011011101011110001011000001100011001110110000001101100100001110100001000001111110001011000101011011101001111110010111111111010010010111010000010000101000101100100000111111011000111101101010011011111010110101110010100001011011101001011100010110011001011010101111011111010111010001011010011000101111011001010100111001001001101001011111100000111000100101100111100110100101110101111001010101101010000000 1100011110001111000010010010110011100100111100001011011010111001010000100001101110001111101010101111000110111000100001001001010000001000011000000011011101001111011000010101100010000000011001101010000110000111000101000101000110011101111101101001101111000111011001010111101001010010001001101010000111000000000000110111011111001000100010100011010000100010100001111101101010010001010001100010011010110000 1001011001110000001000101101101010001101011100101010000110111011111000101101001101001111101001100100101011001101011101100000010011011100011110100100001010011101110111001110101011001111111100110001100010111011110100101011011011010110001101001001100101011100011111010100010101111100111000001001100011011101111011000100011110000101101000101001101011111011110011100100000010100000010000011110111010101000 0011100110100100011011110110101011000100001111111001101001010010010000100001010110110001100111110000110100000101100010010010111101101110110001010000100001100001010000000000111000111010111001100100000110101010010100111010011110001000010010110011100111111001010010111000100010100011101001110111001001101100000101111001010010010010010100100100110111100001110110101010011110001010001011010010000111110011 0010010000111110000100111101101111111010011100010000110011000011111100100110100101111101010111000011110111000001000011011111011100101001010100011101010111010111011000011001101011011001110010101101111000011010000101000011010101011011011110010011111011101110100110010110110111001011000011001011000111100111000000010000011101011111100011001110111011110100110110010000101011101110111000110110010110110110 1011111000100110111011010110011110101000011001001100101011001001110010110110011010000110001111111100010000111110101010111110110111000101011111110010001111001010101111101100001111110011110011001110111010011011110000001101101111110101011101000010110001010010000000101000110000111101111100010000111110010101001101100110011001110101101000000001010111111111100111011000001001010000101000101111000001000100 0010010100110100001010111101001111101011000100001010100111110010010101011110101000111110101001001011111111100011101011110011101000111110000011100100100000100111110001010011110101101001100110011001101000101110010100001011000100110000110111111111001000101111100001111011011100110011001110101101010111011110100000001000010010010001110110011101010011000010011111111011000001100100000011011001001111111011 1000011100100110101100001001110100010010000100101001101100001110010010001100110111010010011100100101001011100110100001101110111010110101011101001110101100000010101010111010111011010001011000011011110011000001111001101000101100000111111000011010010010111011010100110000101001110010110100001011110000101110110010010101011010000110111100001111010011011010001000001101010100101111110000000110100011110001 0111100101100101111001011101001110011100100111101001011001101110111000111100010011000010100001110110111000100000101000101001011100001111110101000011001001011101001100100101101110101011001010000010010111010111011010011010010100001010111001000011011001111101010000100010100000010111000100001101001101100101101010001000101010101000000000110101001000000010110001010111011010000101001011000110010101100000 0011110101000000011110111011010000110011111111101011001011010010110111011100011011010001110001111010011010100011000101111001110110111110101100000110110010100011011101110000000111011100010110001101110011101101010011001111001000100001110010101010000100001101001001000111001110000001001101110011001110111010100110011100100101000010000101011111111000011000111001000111001010010100111011010101000001000000 0101111000001000101010001000111111110010001001110011010101000111101001011101110010001100101011011011010101111011010000000010110001010000101010011011011101001101000001100110101000100100111111000101000100111100110000111100011101111111101101100111111101011110011100011100100101100000111011111011000010001000000000100011100100000010111101101111111011101110100101111101000011010101011111011111001000111111 1000000010100110001011001000101110010110000100000101000011110011010001011110111001010101100100100110011100000010000000011010110010011111010101011101011001110111011010011010010000001100110101010011110010001000101000001111101011000000100010000010011000000010101001101111100100100111001110111111101001101011100110010000010111011101011110101010110110011100110100000010111101100111001010110110010110011010 1010101011011110010010100011111100001011001100000111011101011101000000101010111100000100111111001110100011001010001110101000110001001110001001111001001011101100010010001010111011010011010110000100110000000110000001100001001001110110110010001001010101110011100110100110101010110010100010001101001100010100101010000011000110010101101110000010100001011011110000010001011110110010101111001000000110000101 1111110100111101110110110010011010011000010110111111001100001111001010001001110100110011101101001011100011100101010101011000000000001010000111010010101110100010001100100111110110010001011011001011010111101110101110011000001011101110100011001011110011010001000001000100010010011110011010101011101111011110101010000101111100011101001111110011000101101001100101001001011100010000001011110011010110001010 0001101111000011100010101001000010111001110001000101010011010010011011111010000100000101111110111001000100101001000011000111010100111110101111110010110110001010110010010010100011101110110101010100000110000101011010110010001110110000110111010010010000011001011010100101101101100101101000110110110010101001100100110001011101000101000110101011101001000001100000001000110010101010111010101010001011000100 1100010100000111100100111110000101100101100011000001001111100111011010110101110001100010100101000100111011001011110101111111110111011001101101111101000110101000101010110000000011101000001010000111010110101000000010001100010110111011000110000111000101011110011111001000111110010110010011100011111011111111101100010010011101001011000111000110111000100111010101001101100111011000101111001010110100001101 1111010101111110111001101011100011001110110001100011110101110111000111000101011111001010000110000000000100100000011110011111001100010001000101001110100101010011001011000111100001111100110000101100111011001110110010100011100110001010101100101101001001111111101000011000000010111001111010000000101000011100110001010100001011011011001101011010100110101011010110110010101110001010100001101000001010100000 1001011011111111100001010011010100010101011110101101101010010100000010100111011000101010110001110100111011010110010001100011111000111000000011010100010110000010001001010010011010000001010011011001001100111110101010110001101100000001101101111100011110100100100111001010001101110010001000010000110110110100001010000011110100000000001100110101111011110110000101011000001001110111100110111000111011010110 1001001110000010000011001010100010001000101111000111010001101101110111001011100110101001111011000100000000001101001111001010010101011011111010100111001000001000100011010101110101100001010100101001101100110011001010100000110010010000011101111100101110011000001000010111101000010100111111000000110010100111110000101010100101001100100111010011110001010000111010110000011101010110001011110010000110110101 1101110010100000100001100010011010101001111001110000001010101010111100001110011111001101011110100111111000110111011010011011011101001101010101110111011111001100001100110001000011010010100110111010100011101110101010110111010100101011111110110010111011000101000010101000010110101110101101110100110111100000111011100001001111100001000110100011111001110000110110010011001111100110111000100001010110001101 1010000011110011010110110001000000110100111011000100011101010111011001100000101010100100001101010111110110100111000100001001010111100000010101100100001001000100010000010001110011101111101011111001101110101001111000100100111101001111010011000011100110010111000101100100001000001111000110010110001110000011001011110111100011110011101001110001110101001100011111100110111001000100001010001000000000001011 0011101110011110010101010111001100010000001101111010110111000011010010111001111000011011000110111110110011111010111111110100101110111101111011011000100101111000101000111011000010111000110101000010010110100100100011001010110100000000110101001001111010011011111010011100111000011100100101001000111000111001000110111010000101010101111100100110001011001001000111100111100111010101110101101010010110011000 0011000000011100011111011100101010010010011110111000011101110111000011101111100101100010000011000000000010101001011001101100011010001110111110111111000100000000001010000011001101111010101000011101101111101011100000101010100110110000110010101000000111101011000111010000001111001011011111011000010001000110110011101110111001000111011001001010010111011100001101110011001100111110011011101111011111011100 0111010100001110110100001101111101111011111101011110111110010111101100010100101001101000011000110101110010110110100101001010000100010000011110011111011101011100001011000111111010100001011001110110100100010011011010011101011011111011000101110011010011100111001000011011001011110100000100100010100000110010110000011011101101101001100000011001100001110101011101110111001100101010011111001100000000010010 1000110001111101110101111111001111011000101010110000001000111000100110011010010001110101110111001000011001001110010110111111110111001010100101011010111110111101011011101111101010000110010000111011111110111011000110000011111010001010110011100110111011111010101001011111000100100011110001100100011010011010010101101011001100000101011000001011101010110000000000000110110110010101000111100001110000100000 1111011010101110101011010111110000000111011110101010100100111011001011001110110100010011100010001100011011100011010001000100110001100110001110100101010011110100110011100010101110010110001001010000100110101001100000010101101101110000100110110110111001111010001001001001000101101110111001010000111111011110001011001111001010110101000011111001101000001101100101000101001010100110111100010110111001011000 0001011001011000101000100010100100111000011010100111110000001010110110110000110100010000101100011010111011000010000010000000101110101011000001001111010011001010011110101111001101011000000110101010101010000111110111011011100111111101111101000110100100100010101011000100110010101111001000011101110101000011110110001001100100100111111111111001100000111011000111100010010100011001010011100010110111100110 0000101110000010011010111011111010100101010100010011110101010111010001011100010010110100010101111100101111010101011100011110111110011101000011000011111010110101001001111001001010110011100101110110000001011010010110000101011110011001011110011010101110010000010101110101110110111011011000011101111001100100010111101000010001010111001110010001011010101110101110100011011001011111001110101011101100001001 1010111001110100000101000011011111011111111101110101101011110011011010101001101010000000000111010010000110011001110111111100100001100011000011101001100110111000100011000101101100111101100110001010111000101000110000010101010111011110110100101000111101100000110001000011001111101000100011001000110100101001011000110101010001000011100101010110011001111011011110001100111110001111011111101010010101101001 0011100110111100010010000100100100100010001101101010110100111111101010101010010111010110111010011010101111010011101110010001111010001000100111011011010011101100110011101100000010001100101010001001001100010111111111111000000011111111100001110000100001001101000100011100100100111000010100111001111001100100100000000100011010000011010101010100000011010111101100101100010001010001001101101100001010011110 1010000111010111101000111111000011000001000100100011011101010001100011110000100100101100001011101000110111000010000001010010000101101001011100010000110110011000010111000101110101110101111110000001100000000001001010100010001100001010011111111001111101100101000000010101101101111100010010110010110010100000100001000101010010010111001100010110100011001110110001101000011101011100101010000110000101100000 1001110001100100010110011001110101111000011111010101111101001110010101101111100011011111110001011000011110110011100000000111000001001110110011011001101010001001100100100011001101101000000000101010001111110100110101010000011011000101111110001000001111101001000111001100010101100001010010011010011111001011001110010100001000110101100110100111100110001100110011000011000000010101001111110101110111110001 0110001111010011110111000110110111001000010111010011111111101100101000001000000011110010011010000011101000000110110101001011001101001011010010001101011101000111000110010001011111110101110101101100111100110100100010110101000011001101011011010110001010101001001001010010101110000011101000001101101110011001000010111001111000010011001110010111110110001100011101000000101000101111001111001101010110000000 1110010110101010100110000100000111110001010110101111001111000111110011110000110100011110111010000010011111101011100110101111100101110111011010001010111111101110010110011001110101011011111000100011010011110011000100110111000010000001100011000100101000000100001000010011100100000110000000011001110000001001100010111110011001101110100100111101010011111000111011001011001000000000001111101010100101111111 0101000100000100001010011000101100100111011000001111010010100111110001000100011010100011101101000100011111010010010010100101110001010011010110011000011011110000001010100010000111111000001111000111000111010011001100111100010011011100101011110010101010111101010100011010110100100110110010000010011110011111111101001101010111010010001111001110100000010010100110110100001001001101111110111011010011001010 1001101110101100100111111110010111110110110011001111010111100010010111000000101000001011101101110100101111110111010001001001001101011010111110101111011010011101110101111101000010100100111111000011010111011011000111100001101101101111110010111011100100100011100001111110011110111011000001010001100101100110101100010010000100011000001101111011101010111001100010000000001010001001000000100100111000011110 1011011001010001000010000110100001010100101000100100010011011001111011000001000111111111001000111101100101110101100000000111101111111010111000011011110011101100001011011000100011101110000110001100101001111010000011100001100000001101001100101110010100000111000100011010010001110001000001110010111011110000101000101010010000010001101110101001110110101001110011000010001111101100101010111100001001000011 0101000000011001000010100111101000110100100011100001111010001010001010000001001101010010100101110011011101011010011010101010010101011010111111100111000011110101110111010100111010111010001101010101010000010110110011010000100010100110000010010001000010001110001011011110010100001100111100010101001100000001110011010111101110111111111111110100000101110000001000110001111111110010110111111100000101111010 0101111101011101101110000101111011100000001101101100010110110100111100110110100111101101001110010000000010000100011010011011000001000001111010011001010101101011110111111111000110111011111101001111011001101011111001100101001111001100001010011100011110110110010100100100000001100111001101000101010001001111110111010101110100010011000000001010010001110011001101100101110010000011001011011111100111110001 0001011101011101001000000100101101110110100001000111101010000011010100101001011000100010101010100001000111110101001110101000011010100101111110001001000010000010100001100000000010101111010100101110001101101100010110111110110111001011101110001111001010001110000001111100011000011100111010111000101111101001010001001100111111001011101101110000100011001101010101001010111010111100111111101000101010101100 1110011000111100111110000010011011011100110110101100011001100110101111001100110110011000000000101011001111011010010000010111101111111001001000011010101011000010111100101100011101000001101110000110011011010010110110011000001101010001011010101100010100011111010111001100100101000101000011011010010011111110000011001010001011000011000001001001011101100101010111010000100000101011001011010100010011110010 1101000011011001001100101000010001110010100001110100000100111111001111000110010100111010110000101011100110011001011111010110100010000011111010011000010110001000100000111000101000010010100000001100100000111111010001100101000011111101010001011110110010110101110100100001111001110011100001111000111101100001101111001100001110111011010000101100001011100000010101001100100110111000110111101011100001110000 0001000000111111001100011101001111001111111000110000100101110100101101101001011000010101001111100111111001010010111101101100000000011110100001101101000001000010101100110100011011010111101100001011001001100011111111010101000000000010001100000100010110001101000101111000010000000011001111010000111111011110110111111010000000111111001011100110100110011101101011100101101100000110110110100001111110011111 1000101000110111111011011111011110100011100011110011111011111011001000011010110101110011001100110010010100101101000111011000011010100101011010111000001001100010110111110100011100101001100110100000010101000010001011011011000010001111010010101011011001111110111101111111110100110011000011011010011001110011100000100100000110110100001000100001110011111111111011010010011110011010101111011100010011110101 0000010010101111000011000110010010110011011011001000001000101011111001010001110100101011111101000110011100111000111110101100001100001001101111100100010100101100101000010111011000110111010111001110101101001001010101001110001010110100001011010010000001100111001011100111000110101010110101011011011000000101010001001000101100100010110100001110001001101111001110101100100000001011000100011000110110000010 1010010101010000000111001000101100110111111000000000101011001000110010001010101111110111101010101101101001110000011010011011010010111100001110010010010111000110010110010111110000001010110110100010100011001100111010010111100111100101110001001101110001010100011100011101110110111100111011111010000111111110011111010100111110111000010001000011000001100101111101000100000010000011001001111011000111100001 1011101100011111100100000111100110110100110000000000010111001100011011001001110110100010001000010011000001000011001111100010011101101110000100011110001101001111010000111011011000100110000101100110000011010001110101011111100001101001110001001110010011000000011001111111111110011001101001001111011000001000100110001000110110100010111111000010100100110100110101110011101110001110110100101011001000010110 0111100000101101000010011100000001111100111111111001011010011100000010011011111010110101000001111111100111101101010000111100001111000100100011000111110011100111100111001000100100001000111110000000110001011111001000100010010011110010000011101101111110101000001001110111001101101101110010000000011100110100111111100011001111100011101110111000010111001101111100000000110010111011101100001100000010110000 0001110010011111101010110101001101100001110000101010000101010001110101101010111000001110011100111010010010111110101011010110001000000111011001001001000101100110011100001011110010010110101110111111000100011101011101110101011000111111110101110110000100001001001001101101000101010000001101001011111010111100111001111011011101101001100011010100111010100101001101101001010010000011101000100110101000100110 0000011111000101000011100110100110101101110100001100010000010111010000111011001010110101110010111010100100111001101011011011010111011111001000010011101100110011010001001111011001111100001011101000000100011000101011011011100001100011100111000100001110111000011001000011001100101111111000101011010101101101111110001111000011011110111101001110110110011000000000001101110000101111011010010010100110101111 1101111001110111110111111011111111001111100110110101010000000011010001001000001100111101001001000110011010010111011010111001101000101001100101100111100011100100110110001001100100010101111110011111010110100110111011100010101011011000010100010000001111000010111101011101001110100001011001011010110111001100001001001001101010101110110000110101000101000100011011000100001111101110010001000001011010101110 0000111101011010101110101001100011110011011000011011110101101000101010000100011010010101000100110000111010001111100011111110101101110100011110000111101110111000110100111010000100001100100001101011111100011001100000101000010000110101010100001101101011010000001110101110010011000100111011010011010000100001100011011001100010101011111111000001100001011100111010110010111000101000000001100100110100001111 1010000011011011110000001100001011011100100110000100000111101010111101011100100100011010111000101110100001010001110001001101100010011010001110000110011111110001101111101010110100110100010101000110111001000010111100001100000110001110011000000101100110111100110101001101101001011010001111010000000000011000110101101011011001111010011001111001100011001000011110110100111110111001100111101001101110000001 1110001110000100110010101011111101100101101001011001100111011000010011010111011000111000000000101000100111101001000011000010011001010000010101110100001001111010000010101001101100011011101110010110010100110101101001101111011000100011011011111100010111000110001111111110111111110001111111111010001101011000011111101001101100010101010110010101011010101101101010110100110001110011111001100010001101111100 0110101011011110110000010011101111100000101111110000001011111110010011101010000111101100100000111011010000101100011000100011111000011110100011111101110111001000111010011101001000101000101010100001111111001110001001100010101000110001000100101100111000111000111011010010110000011000010100100000001100010111000100110010010000001110011001001001110010111101011101101010111011100110001010010000101000010100 1101010111000110011000010011101010000010101110011000001010011111100001001100110110101001011110100110100111010101010011000101100011110100110000010110001101011000100100011001001001110000000011111011100101000000001001111011100001111011000000100111111110110110000011010011101001100100101011000001010111001111101011101110111111001000100101110111001101010101011000011100000000001010101010010010101111101001 1000010011110011010101111110000001101110010100110110111111111100100111110011101000100001000101011011001010101111001110111000010000011000101010111110000111110101001001011110110010011101000100000111000100010111011001100111111001101100100100001010110001100101100100110110110010000000010111101111001011010000101110110010010010010011100000010100100010101000010111000010100001100000001100011101100101100111 1111111100110010010111001111001010001111010101001111110111001011100011000000101011010100100010000110011100111111011010011101111011110000011011110110111000011010111000111101100011110011011000001011011100111011111011110111010111111100100011110010100101110111101110100101001101111100111010001001000000101011000101100010001000000011000010001001000000001101010100000011011100000010011010110100001111110001 1000000100010110100100100111011101111010110010001110100110010010000101101001101110011001101100111101011001011110000111101011110000110011001100101101000101001001001010011111010011010110000110001111011111010110000111101110010000001111001110011010100110110010101111000010011010001101000001010101000111011010100111011101010001110011001011110011001110000010101001101101000110111100111100100100111100111000 1101111011111001011010100110010100000000011010001101010000001000100111011000100110000000001010011001111110110001100100010010010100000111000010001100010001111011000111011111110011101111000100010100110001000110001001110111111100110101101110010011011100000001110101101101011111101100011011101000010001100110011010010010010100101000101011110111100100100101101111110001011000111101001100001110001100010100 0111100001111101100101000111011100111000010011110001110010010110000010011111011100001001110110101001111110001101100011111001101100110010110111000100011001101100001001100100011001110100001001110100111100101011111010000110101110000010010010111111001100000110011001010001111001110100110010101011100111000110101000001000111001011110111110001110101010100101101110001001000111011001100110010011110111111001 0100100101101010010110110000010000011110111111101110111100111001110010110010101001010011001010010111101111010011110101011101101111101010010000001111010101100001000000110011101011111100010101110101011100001001001000010011100010000000010000110011110001001101001111101101010111010101100101111000110000011101010010000101001010111001010100110111101100101001110111110101010110110000101001001110011011100110 1110001101000110010110111001000111010101010110100000101111101101111000111001011111101011001001011000010100000001001110010000100010111001010001000000010000010010000110100011111111100000001110100011101011011110111110111111111011000011000111011111010011101011110101111111101010010000000101011101011011111011100011010110101000001100111010001000001110110011000010111111110000100110111001110010111000100110 1001110001110000010001110100111100110001101100110100110100000000101111001010001101011111100100100110100000001001000100110100111110101111111010110101111000011010011101100100101010010000010000110001010101101011000101111101110001001010010111000011000010011011101110100000000111001111100000010111001110110010100100100011011000111101100010001110111000010010101110001101100111011110101010111111110111100011 0011100100111100011011101011011100111101001110011100101100011111110011001001011100110101010100011100100000111110011111101010011011000010000110000011011001011011001101001011000010101100010000001101100111010110010000010011111001100101000011011010011001100101110010001111110111011011000101010101010101100011100011100011000001000100110100001111000011101101010111001010000010100110000111010111001000000010 0101000100101000100110010001110110101101010100111111000110001100110101101001011110110111011111111011101011100111101100111110101001010101110110110000110101111001110110011001111110111101001111001110111110100101111110110000000100001000010110110011010100000010101100111000110001100000000001110001100110010011001000100001010010111101010110010110111111011100110100010101110111011000101000011110110010100110 1101011000011111110010101110110101010001000001111001100001011001101000011111101100000100110011011010101000001000101101000100010000101011000110111000000000001000001110111101101010011011010101001000101001001111000000010101100111000010110011111001000000110011011110101001111100011010100000011000110110011011100010101011001010011101101010101111101011110010010000100100100101011011000101011111010010110101 1100100100010000100100000010100010001101110100001100110010110101001100100111010010011101001001011011000010111101010011110010010100000110001001110000110011101101000001111111001111111110101110001011001101011000001100101000101110000100110010000101010000110000010111110111011010000011001011001010111100011100110010011001011100000100111100111101000100100101111000001010000100001001110101100100000110111011 0110110101100100000100101111110111110111111000011100111001000010100010001111010111000111100100101101000111110011111101010101000010100010110101110110011101100000111000010111111100000111000100010010001101010111111101111100101100101101000011100001110111010011000110010010100110111010101010011101000010100001111011011001101100001011001000100100000000100000000111111011100100000001101111011010111001011110 0000001000101101100110111010010010101110010000111001111000111010101011110100010100110010111000101010110101111101101111011010100001101001100100101010000111010100000111110010001100111011000000011101100100010010100101100001101110111100111110010110101110101010011010000111100010011000111010110111010010101011101111010101011100101001011101100001101111110011101110100100011000010000101010111101101010011011 1001011100100001101001100100010001100100001001110011011110010111001011010101001000111000001100011100001111111110010001101100101001000111111100000110001100011010111111010000100000111101010000011000110000010011100101111110100010110010010000101110011011101110010001110111100011111111100000001001001101010111001000010000010000010010011100111010011111110110110011101011001100011000111101111000001010010001 1001110110110011110001100101010011001000000100100011011101111100001101111100110010110000111111110101011001000001000001100001001000100010011100101110000010110001111000101111011000000101101011111101100001111010001111001101011001000101010101110111111000100010101111010111111110000111111001100000010100000001010000101000000100100100000101101011100010110111110111010000111100111001010100001101010110101110 0000010100100110011001011100011010110011001011110010000101010000001011100101001010101111110011111110000010100011010010000101111100010100011110001100100001100111000011100100000001010111101110001110100011101101000000111010111100010111101011111110001111101000001000001111011000100111111111100000010011101010110011101010010001011101010001000101101101001110100010010010101011111010100011001000101111000100 1000000100000100010100101001100110000101111100110101011101000010100110100001110101000101111101101001101101100000001111110001100000110010000010011011001110010110000010001100111010000100101110011101011000010110111010100110001010011111001000111110011001010011110010000110010000110001100101011000000011111100011100010101110001001000101110100101000100010101010101111100101010010010111001111110101110100001 1000101000100101101111111011000001001001010011111110010111111011011010001001101000000111001001010100001011010110011001101010010100011111001100111100100111010010011011010101000011010000101100110101111110010000010011000100010010010100100111111101011100010110000101111101010010111101100000101010011100100101001011011110000010000010000101101000010111101111010011001010010110110000011010111001010100110100 1100001101010100000110101010100111101111111011011001010000010000100011001011010001100111110000100110001101100100000000001110100000001010001000000100010000111000011111100101111100010110100011001011111011011101110010101000001101110001001010110011111111111101101110100100011001010101100110000101001010110001110100000100101110001001110010111001000101001001110110000100010011001101110010011111110010010110
cTrader AlgocTrader

【cTrader】LineAlert【Tools】

2/22/2021 3/12/2021

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

ラインに価格が触れてから考えたい

水平線やトレンドラインを使ってトレードしてる方にはわかってもらえると思うのですが、こう目安となるラインを引いたところで現在の価格がまったくラインにからまないと何もしようがなかったりしますよね。

とりあえずライン触れるまで待つんだ、話はそれからだ」と自分に言い聞かせてそっとチャートを閉じるわけです。

でも結局ライン触れたかどうか気になってちょくちょくチャートを見てしまったり、見るたびに「ラインからは遠いけど入れそうだな」とか邪念が湧いてきたり・・・ばかばかしいことこの上ない。

もうね、こんな無意味なこと考えなくてもすむように、ライン触れたら自動でお知らせしてほしいわけですよ。

 

LineAlert

というわけで、水平線やトレンドラインに触れたら音鳴らして教えてくれるインジケーターを作成しました。単純なインジケーターなのでソースコードも公開します。好きなようにカスタマイズして使ってください。

 

機能概要

チャート上のすべての線を見張って、どれかに価格がタッチしたら音を鳴らしてお知らせします。

どの音を鳴らすか、水平線とトレンドラインどっちかだけを対象にするか両方対象にするかも選べます。

即時Alertの場合はローソク足当たり1回しか音が鳴りません。次にローソク足更新するまでは複数回タッチしても、別のラインにタッチしても鳴りませんのでご注意ください。

 

パラメータ

TrendLine

トレンドラインをアラートの対象にするか指定します。

HorizontalLine

水平線をアラートの対象にするか指定します。

SoundFile

サウンドファイル名を指定します。ファイル名のみの場合はC:\Windows\Mediaを探します。それ以外の場合は必ずフルパスで指定してください。また.wavじゃない場合は必ず拡張子まで指定してください。

BarWait

ローソク足確定を待つか、タッチ後即アラート出すか指定します。Yesならローソク足確定を待ちます。

 

ダウンロード

(2021/3/12 修正済み 下記参照)

 

ソースコード

using System;
using System.Linq;
using System.Collections.Generic;
using cAlgo.API;

namespace cAlgo {
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class LineAlert : Indicator {
        [Parameter(DefaultValue = true)]
        public bool TrendLine { get; set; }
        [Parameter(DefaultValue = true)]
        public bool HorizontalLine { get; set; }
        [Parameter(DefaultValue = "Alarm01")]
        public string SoundFile { get; set; }
        [Parameter(DefaultValue = false)]
        public bool BarWait { get; set; }

        private List<double> _targets;
        private string _soundFile;
        private bool _isTouched;
        private double _exBid;
        private DateTime _exOpenTime;

        //---------
        // init
        protected override void Initialize() {
            //--- soundFileセット
            if (SoundFile.Contains("\\")) {
                _soundFile = SoundFile;
            } else {
                _soundFile = "C:\\Windows\\Media\\" + SoundFile;
            }
            if (!_soundFile.Contains(".")) {
                _soundFile += ".wav";
            }

            // 最初はこうしようと思ったが、AccessRights.FileSystemが必要っぽいのでやめた
            //if (!File.Exists(_soundFile)) {
            //    _soundFile = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Media\\" + _soundFile;
            //    if (!File.Exists(_soundFile)) {
            //        Print(_soundFile + " is not found!");
            //        throw new FileNotFoundException();
            //    }
            //}

            // --- ターゲット設定、更新
            _exBid = Bid;
            _exOpenTime = new DateTime();
            _updateTarget();
            Chart.ObjectAdded += _ => _updateTarget();
            Chart.ObjectRemoved += _ => _updateTarget();
            Chart.ObjectUpdated += _ => _updateTarget();
        }

        //------------------------
        // update target
        private void _updateTarget() {
            _targets = new Listt<double>();
            if (HorizontalLine) {
                var hls = Chart.FindAllObjectst<ChartHorizontalLine>();
                _targets.AddRange(hls.Select(hl => hl.Y));
            }
            if (TrendLine) {
                var tls = Chart.FindAllObjectst<ChartTrendLine>();
                _targets.AddRange(tls.Select(tl => tl.CalculateY(Bars.Count - 1)));
            }
        }

        //-----------------------
        // Calculate でタッチ判定
        public override void Calculate(int index) {
            if (!IsLastBar) return;
            // OnBar
            if(_exOpenTime != Bars.LastBar.OpenTime) {
                _exOpenTime = Bars.LastBar.OpenTime;
                if (_isTouched) {
                    _isTouched = false;
                    if (BarWait) Notifications.PlaySound(_soundFile);
                }
            }
            // OnTick
            if (!_isTouched && _targets.Any(t => ((_exBid < t && t <= Bid) || (_exBid > t && t >= Bid)))) {
                _isTouched = true;
                if (!BarWait) {
                    Notifications.PlaySound(_soundFile);
                }
            }
            _exBid = Bid;
        }
    }
}

本当は最初にサウンドファイルの存在確認したほうがいいです。今回はAccessRights.FileSystemが必要っぽかったのであきらめました。

ポイントらしいポイントもないんですが、線の追加、更新、削除時に対応するため、Chart.Object~のイベントでターゲット更新を行うようにしておきます。チャートオブジェクトを使う場合はこの辺の処理を忘れないようにしましょう。

あとはCalculateでOnBar的な部分を作ってるところでしょうか。最後のローソク足のOpenTimeで確認してます。TickVolumeは値が飛ぶことがあるのであてになりません。確かMT4のEAでも同じでしたよね。if(TickVolume==1)とかしないようにご注意ください。

 

(2021/3/12追記)

たぶんバグあります

申し訳ありません、アップデート用にいじってて気づいたのですが、このコードだとトレンドラインのアラートがうまく機能しないと思います。OnBarでのターゲット更新処理が抜けてます

上記のダウンロードリンクは修正済みです。すでに自分用に手を加えている場合は下記のように1行追加してください。

        public override void Calculate(int index) {
            if (!IsLastBar) return;
            // OnBar
            if(_exOpenTime != Bars.LastBar.OpenTime) {
                _exOpenTime = Bars.LastBar.OpenTime;
                _updateTarget();//←この行追加
                if (_isTouched) {
                    _isTouched = false;
                    if (BarWait) Notifications.PlaySound(_soundFile);
                }
            }

 

(2021/3/2追記)

他のツールにも組み込んでみた

この前作ったMTFストキャスティクスでも音なるようにしてみました。


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

新しいコメント

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

cTrader's Life

© 2026 ajinori