Problem: Mike has a string s consisting of only lowercase English letters. He wants to change exactly one character from the string so that the resulting one is a palindrome. 

A palindrome is a string that reads the same backward as forward, for example strings "z", "aaa", "aba", "abccba" are palindromes, but strings "codeforces", "reality", "ab" are not.

Input

The first and single line contains string s (1 ≤ |s| ≤ 15).

Output

Print "YES" (without quotes) if Mike can change exactly one character so that the resulting string is palindrome or "NO" (without quotes) otherwise. 

Examples

Input

abccaa


Output

YES


Input

abbcca


Output

NO


Input

abcda


Output

YES

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;

public class Main {

	// make it false if Multiple test case is not in the question
	static boolean multipleTC = false;
	int TestCase = 1;

	// for pre processing if needed
	void pre() throws Exception {
	}

	public static void main(String[] args) throws Exception {

		new Main().run();
	}

	// input output handled here
	private String solve() throws Exception {
		String s = nln();
		int n = s.length();
		int count = 0;
		for (int i = 0; i < n / 2; i++) {
			if (s.charAt(i) != s.charAt(n - i - 1))
				count++;
			if (count > 1)
				return "NO";
		}
		if ((n & 1) == 1 && count == 0)
			return "YES";

		if (count == 0 && count % 2 == 0)
			return "NO";

		return "YES";
	}

	void run() throws Exception {
		// long start_time = System.nanoTime();

		try {
			in = new FastReader("in0.txt");
			out = new PrintWriter("out0.txt");
		} catch (Exception e) {
			in = new FastReader();
			out = new PrintWriter(System.out);
		}
		pre();
		StringBuilder print = new StringBuilder("");

		int T = (multipleTC) ? ni() : 1;
		for (int t = 1; t <= T; t++) {
			this.TestCase = t;
			print.append(solve()).append("\n");
		}

		p(print);
		// long end_time = System.nanoTime();
		// System.out.printf("Running Time in sec : %2.10f", (double) (end_time -
		// start_time) * (double) 1e-9);

		out.flush();
		out.close();
	}

	PrintWriter out;
	FastReader in;

	void p(Object o) {
		out.print(o);
	}

	void pln(Object o) {
		out.println(o);
	}

	void pnf(Object o) {
		out.println(o);
		out.flush();
	}

	void deb(Object x) {
		System.out.println("#" + TestCase + " = " + x);
	}

	void deb2(Object x, Object y) {
		System.out.println("#" + TestCase + " = " + x + " , " + y);
	}

	String n() throws Exception {
		return in.next();
	}

	String nln() throws Exception {
		return in.nextLine();
	}

	int ni() throws Exception {
		return Integer.parseInt(in.next());
	}

	long nl() throws Exception {
		return Long.parseLong(in.next());
	}

	double nd() throws Exception {
		return Double.parseDouble(in.next());
	}

	class FastReader {
		BufferedReader br;
		StringTokenizer st;

		public FastReader() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}

		public FastReader(String s) throws Exception {
			br = new BufferedReader(new FileReader(s));
		}

		String next() throws Exception {
			while (st == null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					throw new Exception(e.toString());
				}
			}
			return st.nextToken();
		}

		String nextLine() throws Exception {
			String str = "";
			try {
				str = br.readLine();
			} catch (IOException e) {
				throw new Exception(e.toString());
			}
			return str;
		}
	}
}