{-# LANGUAGE ScopedTypeVariables #-}

import Data.Array
import Data.Array.IO
import Data.IORef
import Data.List
import Control.Monad

main = do
    [h, w] <- map read . words <$> getLine :: IO [Int]
    str <- concat <$> replicateM h getLine :: IO String
    (grid :: IOUArray (Int,Int) Char) <- thaw $ (listArray ((1,1),(h,w)) str)
    res <- newIORef False
    forM_ [1..h] $ \i ->
        forM_ [1..w] $ \j -> do
            ((miny,minx), (maxy,maxx)) <- getBounds grid
            r <- readArray grid (i,j)
            ns <- filterM (\p@(ni,nj) -> do
                if (ni < miny || nj < minx || ni > maxy || nj > maxx)
                    then return False
                    else do
                        rn <- readArray grid p
                        return $ rn == '#' 
                ) [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]
            when (null ns && r == '#') $  modifyIORef' res (||True)
    readIORef res >>= \r -> putStrLn $ if r then "No" else "Yes"