import java.io.*;
import java.util.*;

import static java.lang.Math.*;

public class Main {
    static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    }

    static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    }

    static int[] color;
    static ArrayList<pair>[] adj;
    static int[] Arrx, Arry;
    static int inf = (int) 1e9, n, w, h, x, y;
    static boolean[][] matrix;
    static int[][][] memo;

    public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    }

    public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    }

    public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    }

    public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
} import java.io.*; io.* java import java.util.*; util.* java import static java.lang.Math.*; import static java.lang.Math.*; import static java.lang.Math.*; public class Main {
    static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    }

    static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    }

    static int[] color;
    static ArrayList<pair>[] adj;
    static int[] Arrx, Arry;
    static int inf = (int) 1e9, n, w, h, x, y;
    static boolean[][] matrix;
    static int[][][] memo;

    public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    }

    public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    }

    public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    }

    public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
} Main static int[] color; color static ArrayList<pair>[] adj; adj static int[] Arrx Arrx Arry; Arry static int inf = (int) 1e9 inf (int) 1e9 n n w w h h x x y; y static boolean[][] matrix; matrix static int[][][] memo; memo public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    } dp {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    } if (x >= h || y >= w)
            return (int) 1e8; x >= h || y >= w x >= h x h y >= w y w return (int) 1e8; (int) 1e8 if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        } x == h - 1 && y == w - 1 x == h - 1 x h - 1 h 1 y == w - 1 y w - 1 w 1 {
            return matrix[x][y] ? 0 : crit;
        } return matrix[x][y] ? 0 : crit; matrix[x][y] ? 0 : crit matrix[x][y] matrix[x] matrix x y 0 crit if (memo[crit][x][y] != -1)
            return memo[crit][x][y]; memo[crit][x][y] != -1 memo[crit][x][y] memo[crit][x] memo[crit] memo crit x y -1 1 return memo[crit][x][y]; memo[crit][x][y] memo[crit][x] memo[crit] memo crit x y int ans = Integer.MAX_VALUE; ans Integer.MAX_VALUE Integer Integer.MAX_VALUE if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        } matrix[x][y] matrix[x] matrix x y {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } ans = min(ans, dp(x + 1, y, 1)) ans min(ans, dp(x + 1, y, 1)) min ans dp(x + 1, y, 1) dp x + 1 x 1 y 1 ans = min(ans, dp(x, y + 1, 1)) ans min(ans, dp(x, y + 1, 1)) min ans dp(x, y + 1, 1) dp x y + 1 y 1 1 {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        } ans = min(ans, crit + dp(x + 1, y, 0)) ans min(ans, crit + dp(x + 1, y, 0)) min ans crit + dp(x + 1, y, 0) crit dp(x + 1, y, 0) dp x + 1 x 1 y 0 ans = min(ans, crit + dp(x, y + 1, 0)) ans min(ans, crit + dp(x, y + 1, 0)) min ans crit + dp(x, y + 1, 0) crit dp(x, y + 1, 0) dp x y + 1 y 1 0 return memo[crit][x][y] = ans; memo[crit][x][y] = ans memo[crit][x][y] memo[crit][x] memo[crit] memo crit x y ans int x x int y y int crit crit public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    } isBadrome {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    } for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false; int i = 0; int i = 0; i 0 i <= str.length() / 2 i str.length() / 2 str.length() str.length str 2 i++ i++ i if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false; if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false; str.charAt(i) != str.charAt(str.length() - 1 - i) str.charAt(i) str.charAt str i str.charAt(str.length() - 1 - i) str.charAt str str.length() - 1 - i str.length() - 1 - i str.length() str.length str 1 i return false; false return true; true String str str public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    } main {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) PrintWriter pw = new PrintWriter(System.out); pw new PrintWriter(System.out) String str=sc.next(); str sc.next() sc.next sc int n=str.length(); n str.length() str.length str if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No"); isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)) isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)) isBadrome(str) isBadrome str isBadrome(str.substring(0,(n-1)/2)) isBadrome str.substring(0,(n-1)/2) str.substring str 0 (n-1)/2 (n-1) n 1 2 isBadrome(str.substring((n+3)/2-1,n)) isBadrome str.substring((n+3)/2-1,n) str.substring str (n+3)/2-1 (n+3)/2 (n+3) n 3 2 1 n pw.println("Yes") pw.println pw "Yes" pw.println("No") pw.println pw "No" pw.close() pw.close pw String[] args args static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    } pair int u; u int idx; idx int val; val public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        } pair {
            u = x;
            idx = i;
            val = -1;
        } u = x u x idx = i idx i val = -1 val -1 1 int x x int i i static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    } trp int idx; idx int val; val public trp(int v, int i) {
            idx = i;
            val = v;
        } trp {
            idx = i;
            val = v;
        } idx = i idx i val = v val v int v v int i i @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        } compareTo {
            return idx - trp.idx;
        } return idx - trp.idx; idx - trp.idx idx trp.idx trp trp.idx trp trp trp Comparable public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    } Scanner StringTokenizer st; st BufferedReader br; br public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        } Scanner {
            br = new BufferedReader(new InputStreamReader(s));
        } br = new BufferedReader(new InputStreamReader(s)) br new BufferedReader(new InputStreamReader(s)) InputStream s s public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        } Scanner {
            br = new BufferedReader(new FileReader(s));

        } br = new BufferedReader(new FileReader(s)) br new BufferedReader(new FileReader(s)) String s s public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        } next {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        } while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine()); st == null || !st.hasMoreTokens() st == null st null !st.hasMoreTokens() st.hasMoreTokens() st.hasMoreTokens st st = new StringTokenizer(br.readLine()) st new StringTokenizer(br.readLine()) return st.nextToken(); st.nextToken() st.nextToken st public int nextInt() throws IOException {
            return Integer.parseInt(next());
        } nextInt {
            return Integer.parseInt(next());
        } return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next public long nextLong() throws IOException {
            return Long.parseLong(next());
        } nextLong {
            return Long.parseLong(next());
        } return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next public String nextLine() throws IOException {
            return br.readLine();
        } nextLine {
            return br.readLine();
        } return br.readLine(); br.readLine() br.readLine br public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        } nextDouble {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        } String x = next(); x next() next StringBuilder sb = new StringBuilder("0"); sb new StringBuilder("0") double res = 0 res 0 f = 1; f 1 boolean dec = false dec false neg = false; neg false int start = 0; start 0 if (x.charAt(0) == '-') {
                neg = true;
                start++;
            } x.charAt(0) == '-' x.charAt(0) x.charAt x 0 '-' {
                neg = true;
                start++;
            } neg = true neg true start++ start for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                } int i = start; int i = start; i start i < x.length() i x.length() x.length x i++ i++ i if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                } if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                } x.charAt(i) == '.' x.charAt(i) x.charAt x i '.' {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } res = Long.parseLong(sb.toString()) res Long.parseLong(sb.toString()) Long.parseLong Long sb.toString() sb.toString sb sb = new StringBuilder("0") sb new StringBuilder("0") dec = true dec true {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                } sb.append(x.charAt(i)) sb.append sb x.charAt(i) x.charAt x i if (dec)
                        f *= 10; dec f *= 10 f 10 res += Long.parseLong(sb.toString()) / f res Long.parseLong(sb.toString()) / f Long.parseLong(sb.toString()) Long.parseLong Long sb.toString() sb.toString sb f return res * (neg ? -1 : 1); res * (neg ? -1 : 1) res (neg ? -1 : 1) neg -1 1 1 public boolean ready() throws IOException, IOException {
            return br.ready();
        } ready {
            return br.ready();
        } return br.ready(); br.ready() br.ready br public class Main {
    static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    }

    static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    }

    static int[] color;
    static ArrayList<pair>[] adj;
    static int[] Arrx, Arry;
    static int inf = (int) 1e9, n, w, h, x, y;
    static boolean[][] matrix;
    static int[][][] memo;

    public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    }

    public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    }

    public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    }

    public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
} public class Main {
    static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    }

    static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    }

    static int[] color;
    static ArrayList<pair>[] adj;
    static int[] Arrx, Arry;
    static int inf = (int) 1e9, n, w, h, x, y;
    static boolean[][] matrix;
    static int[][][] memo;

    public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    }

    public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    }

    public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    }

    public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
} Main
import java.io.*;
import java.util.*;

import static java.lang.Math.*;

public class Main {
    static public class pair {
        int u;
        int idx;
        int val;

        public pair(int x, int i) {
            u = x;
            idx = i;
            val = -1;
        }
    }

    static public class trp implements Comparable<trp> {

        int idx;
        int val;

        public trp(int v, int i) {
            idx = i;
            val = v;
        }

        @Override
        public int compareTo(trp trp) {
            return idx - trp.idx;
        }
    }

    static int[] color;
    static ArrayList<pair>[] adj;
    static int[] Arrx, Arry;
    static int inf = (int) 1e9, n, w, h, x, y;
    static boolean[][] matrix;
    static int[][][] memo;

    public static int dp(int x, int y, int crit) {
        if (x >= h || y >= w)
            return (int) 1e8;
        if (x == h - 1 && y == w - 1) {
            return matrix[x][y] ? 0 : crit;
        }
        if (memo[crit][x][y] != -1)
            return memo[crit][x][y];
        int ans = Integer.MAX_VALUE;
        if (matrix[x][y]) {
            ans = min(ans, dp(x + 1, y, 1));
            ans = min(ans, dp(x, y + 1, 1));
        } else {
            ans = min(ans, crit + dp(x + 1, y, 0));
            ans = min(ans, crit + dp(x, y + 1, 0));
        }
        return memo[crit][x][y] = ans;
    }

    public static boolean isBadrome(String str) {
        for (int i = 0; i <= str.length() / 2; i++)
            if (str.charAt(i) != str.charAt(str.length() - 1 - i))
                return false;
        return true;


    }

    public static void main(String[] args) throws Exception {
//        Scanner sc = new Scanner("kitchen.in");
//        PrintWriter pw = new PrintWriter("kitchen.out");
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        String str=sc.next();
        int n=str.length();
        if(isBadrome(str)&&isBadrome(str.substring(0,(n-1)/2))&&isBadrome(str.substring((n+3)/2-1,n)))
            pw.println("Yes");
        else
            pw.println("No");
        pw.close();
    }

    public static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public Scanner(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(s));

        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
}
