{-# LANGUAGE RankNTypes, ViewPatterns, OverloadedStrings #-}
    
import Control.Monad.State
import Control.Monad.ST
import Data.Array.ST
import Control.Arrow
import Control.Monad
import Data.List
import qualified Data.ByteString.Char8 as B

main :: IO ()
main = inputs >>= putStrLn . uncurry solve
    where
        inputs = (,) <$> readLine <*> B.getLine 

solve :: [Int] -> B.ByteString -> String
solve [n, a, b, c, d] ss 
    | check0 0 ss = "No"
    | c < d = "Yes"
    | check1 (b - 2) ss = "Yes"
    | otherwise = "No"
    where
        check0 i (B.uncons -> Just (x, B.uncons -> Just (y, zs)))
            | i > max c d - 1 = False
            | x == '#' && x == y = True 
            | y == '#' = check0 (i + 1) $ B.cons y zs
            | otherwise = check0 (i + 2) zs 
        check0 _ _ = False

        check1 i s@(B.uncons -> Just (_, t))
            | i > d - 2 = False
            | "..." `B.isPrefixOf` s = True
            | otherwise = check1 (i + 1) t
        check1 _ _ = False


readLine :: IO [Int]
readLine = unfoldr (fmap (second (maybe B.empty snd . B.uncons)) . B.readInt) <$> B.getLine

readContents :: Int -> IO [[Int]]
readContents = flip replicateM readLine

type Table s a b = STArray s a (Maybe b)
type Memo s a b = a -> StateT (Table s a b) (ST s) b

evalMemo :: (Ix a) => (forall s. Memo s a b -> Memo s a b) -> a -> Table s a b -> ST s b
evalMemo f k = evalStateT (memoizeFix f k)

runMemo :: (Ix a) => (forall s. Memo s a b -> Memo s a b) -> a -> Table s a b -> ST s (b, Table s a b)
runMemo f k = runStateT (memoizeFix f k)

memoizeFix :: (Ix a) => (forall s. Memo s a b -> Memo s a b) -> forall s. Memo s a b
memoizeFix f k = get >>= (\arr -> lift (readArray arr k) >>= maybe (f (memoizeFix f) k >>= ((<$) <*> (lift . writeArray arr k . Just))) return)