#include <bits/stdc++.h>
using ll = long long;
using ld = long double;
using namespace std;
//map<int,vector<int>> tree;
//map<int,vector<int>> rooted;
//map<int,int> primes;
void debugi(vector<int> & vec){
    int n=(int)vec.size();
    for(int i=0;i<n;i++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;
}
void debugd(vector<long double> & vec){
    int n=(int)vec.size();
    for(int i=0;i<n;i++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;
}
void debugl(vector<ll> & vec){
    int n=(int)vec.size();
    for(int i=0;i<n;i++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;
}
void debugmap(map<int,int> & mp){
    for(auto x:mp){
        cout<<x.first<<" "<<x.second<<" , ";
    }
    cout<<endl;
}
void debugset(set<int> & st){
    for(auto x: st){
        cout<<x<<" ";
    }
    cout<<endl;
}
void debugparri(vector<pair<int, int>>& arr){
    for(int i=0;i<(int)arr.size();i++){
        cout<<"["<<arr[i].first<<" : "<<arr[i].second<<"]"<<" ";
    }
    cout<<endl;
}
void debugpi(pair<int, int> &pi){
    cout<<pi.first<<" "<<pi.second<<endl;
}
void debugq(queue<int> q){
    while(!q.empty()){
        cout<<q.front()<<" ";
        q.pop();
    }
    cout<<endl;
}

bool check(int n,int i,int j){
    if((0<=i & i<n) && (0<=j & j<n)){
        return true;
    }
    return false;
}
ll MOD = 1e9+7;
// ll mod = 1e9+7;
ll powab(ll a,ll b,ll mod){
    if(b==0){
        return 1;
    }
    ll z=powab(a, b/2, mod);
    ll res=(z*z*1LL)%mod;
    if(b&1){
        res=(res*1LL*a)%mod;
    }
    return res;
}
// char s[100006];
// int m=200005;
// int p;
//int mod(int x,int mod){
//    if(x<0){
//        return mod-(x%mod);
//    }
//    else{
//        return x%mod;
//    }
//}
ll modinv(ll a, ll mod){
   ll ans=powab(a, mod-2, mod);
   return ans;
}

// int lim=10;
// int n;
// vector<vector<pair<int,ll>>>g(lim);
// vector<int> vis(lim);
// vector<ll> dp(lim),a(lim);
// int dia=0,node=0;
// int ind = 0;
ll gcd(ll a, ll b){
    if(b==0){
        return a;
    }
    return gcd(b,a%b);
}
void upd(int k, int x,vector<ll>& tree,int n){
//    cout<<k<<" k "<<endl;
    if(k==0){
        return;
    }
//    cout<<k<<" k "<<endl;ks
    while(k<=n){
//        cout<<k<<" kk "<<endl;
        tree[k]+=x;
        k+=(k&-k);
    }
}
ll sum(int k,vector<ll>& tree,int n){
    ll s=0;
    while(k>=1){
        // if(k >= tree.size()){
            // cout << "PROBLEM " << k << " k " << endl;
        // }
        s+=tree[k];
        k-=(k&-k);
    }
    return s;
}
// vector<ll> dps(31), dpc(31);
// ll mod = 1e9+7;
ll mod = 998244353;

void solve(int tt){
    int n, m;
    cin >> n >> m;
    string s;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    int tot = 0;
    for(int i = 0; i < n; i++){
        cin >> s;
        for(int j = 0; j < m; j++){
            if(s[j] == 'o'){
                grid[i][j] = 1;
                tot += 1;
            }
        }
    }
    ll res = 0;
    int nax = max(n,m);
    vector<ll> f(nax+1);
    f[0] = 0; f[1] = 0;
    for(int i = 2; i <= nax; ++i){
        if(i % 2 == 0){
            f[i] = 2*f[i-1]+1;
            f[i] %= mod;
        }
        else{
            f[i] = 2*f[i-1];
            f[i] %= mod;
        }
    }
    // cout << nax << " nnax " << endl;
    // debugl(f);
    vector<ll> pre(m), pre1(n);
    for(int i = 0; i < n; i++){
        // cout << "I: " << i << endl;
        ll s = 0, w = 0;  
        for(int j = m-1; j >= 0; j--){
            // cout << j << "  j " << endl;
            if(grid[i][j] == 1){
                w += 1;
                s += 1;
                pre[j] = s;
            }
            else{
                s = 0;
                pre[j] = 0;
            }
        }
        // debugl(pre);
        for(int j = 0; j < m; j++){
            int dis = pre[j], sub = 0;
            if(j+dis < m){
                if(grid[i][j+dis] == 1){
                    sub += 1;
                }
            }
            if(j > 0){
                if(grid[i][j-1] == 1){
                    sub += 1;
                }
            }
            ll mul = powab(2, w-dis-sub, mod);
            ll add = (mul*f[dis])%mod;
            // cout << mul << " mul " << add << " add " << w << " w " << dis << " dis " << sub << " sub " << endl;
            ll mulf = powab(2, tot-w, mod);
            add = (add*mulf)%mod;
            res += add; res %= mod;
        }
    }
    // cout << res << " RES " << endl;
    for(int i = 0; i < m; i++){
        ll s = 0, w = 0;
        for(int j = n-1; j >= 0; j--){
            if(grid[j][i] == 1){
                s += 1; w += 1;
                pre1[j] = s;
            }
            else{
                s = 0;
                pre1[j] = 0;
            }
        }
        for(int j = 0; j < n; j++){
            int dis = pre1[j], sub = 0;
            if(j+dis < n){
                if(grid[j+dis][i] == 1){
                    sub += 1;
                }
            }
            if(j > 0){
                if(grid[j-1][i] == 1){
                    sub += 1;
                }
            }
            ll mul = powab(2, w-dis-sub, mod);
            ll add = (mul*f[dis])%mod; ll mulf = powab(2, tot-w, mod);
            add = (add*mulf)%mod; res += add; res %= mod;
        }
    }
    cout << res << endl;
    return;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    // ofstream file;
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    int t;
    // cin >> t;
    t = 1;
    for(int tt = 0; tt < t; tt++){
        solve(tt);
    }
    return 0;
}