package main

import (
	"fmt"
)

func main() {
	var str string
	var desired bool
	for {
		n, _ := fmt.Scan(&str, &desired)
		if n == 0 {
			break
		} else {
			if isValid(str) {
				fmt.Println(process(str, desired))
			} else {
				fmt.Println(0)
			}
		}
	}
}
func isValid(str string) bool {
	if len(str)&1 == 0 {
		return false
	}
	for i := 0; i < len(str); i += 2 {
		if !(str[i] == '0' || str[i] == '1') {
			return false
		}
	}

	for i := 1; i < len(str); i += 2 {
		if !(str[i] == '&' || str[i] == '|' || str[i] == '^') {
			return false
		}
	}
	return true
}
func process(str string, desired bool) int {
	// base case 所在位置,不可能压中逻辑符号, 只能为0,1
	truedp := make([][]int, len(str))
	falsedp := make([][]int, len(str))
	n := len(str)
	for i := 0; i < n; i++ {
		truedp[i] = make([]int, n)
		falsedp[i] = make([]int, n)
	}

	for i := 0; i < n; i += 2 {
		if str[i] == '1' {
			truedp[i][i] = 1
		} else {
			falsedp[i][i] = 1
		}
	}
    mod := int(1e9+7)
	for row := n - 3; row >= 0; row = row - 2 {
		for col := row + 2; col < n; col = col + 2 {
			for i := row + 1; i < col; i += 2 {
				if str[i] == '&' {
					truedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
				} else if str[i] == '|' {
					truedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
					truedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
					truedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
				} else if str[i] == '^' {
					truedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
					truedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
				}
                truedp[row][col] = (truedp[row][col])%mod

				if str[i] == '&' {
					falsedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
					falsedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
					falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
				} else if str[i] == '|' {
					falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
				} else if str[i] == '^' {
					falsedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
					falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
				}

                falsedp[row][col] = (falsedp[row][col])%mod
			}
		}
	}

	if desired {
		return truedp[0][n-1]
	} else {
		return falsedp[0][n-1]
	}

}

// 1^0|0|1
// func process(str string, desired bool, l, r int) int {
// 	// base case 所在位置,不可能压中逻辑符号, 只能为0,1
// 	if l == r {
// 		if str[l] == '1' {
// 			if desired {
// 				return 1
// 			}
// 			return 0
// 		} else {
// 			if desired {
// 				return 0
// 			}
// 			return 1
// 		}
// 	}

// 	ans := 0
// 	if desired {
// 		for i := l + 1; i < r; i += 2 {
// 			if str[i] == '&' {
// 				ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// 			} else if str[i] == '|' {
// 				ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// 				ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// 				ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// 			} else if str[i] == '^' {
// 				ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// 				ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// 			}
// 		}
// 	} else {
// 		for i := l + 1; i < r; i += 2 {
// 			if str[i] == '&' {
// 				ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// 				ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// 				ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// 			} else if str[i] == '|' {
// 				ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// 			} else if str[i] == '^' {
// 				ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// 				ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// 			}
// 		}
// 	}
// 	return ans
// }