#include <bits/stdc++.h>
using namespace std;
int n, m;
char a[60][60];
bool isRowChecked[60];
bool isColChecked[60];
bool doCheck(int r, int c) {
  bool isRowRegard[60];
  bool isColRegard[60];
  memset(isRowRegard, false, sizeof(isRowRegard));
  memset(isColRegard, false, sizeof(isColRegard));
  std::vector<int> rows;
  std::vector<int> cols;
  for (int rr = r; rr < n; rr++) {
    if (a[rr][c] == '#') {
      isRowRegard[rr] = true;
      rows.push_back(rr);
    }
  }
  for (int cc = c; cc < m; cc++) {
    if (a[r][cc] == '#') {
      isColRegard[cc] = true;
      cols.push_back(cc);
    }
  }
  for (int i = 0; i < rows.size(); i++) {
    for (int cc = 0; cc < m; cc++) {
      if ((a[rows[i]][cc] == '.') && (isColRegard[cc] == true)) return false;
      if ((a[rows[i]][cc] == '#') && (isColRegard[cc] == false)) return false;
    }
  }
  for (int j = 0; j < cols.size(); j++) {
    for (int rr = 0; rr < n; rr++) {
      if ((a[rr][cols[j]] == '.') && (isRowRegard[rr] == true)) return false;
      if ((a[rr][cols[j]] == '#') && (isRowRegard[rr] == false)) return false;
    }
  }
  for (int i = 0; i < rows.size(); i++) isRowChecked[rows[i]] = true;
  for (int j = 0; j < cols.size(); j++) isColChecked[cols[j]] = true;
  return true;
}
int main() {
  scanf("%d%d\n", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s\n", a[i]);
  memset(isRowChecked, false, sizeof(isRowChecked));
  memset(isColChecked, false, sizeof(isColChecked));
  for (int r = 0; r < n; r++) {
    if (isRowChecked[r]) continue;
    for (int c = 0; c < m; c++) {
      if (isColChecked[c]) continue;
      if (a[r][c] == '#') {
        if (doCheck(r, c) == false) {
          printf("No\n");
          return 0;
        }
      }
    }
  }
  printf("Yes\n");
  return 0;
}
