description: Moamen and Ezzat are playing a game. They create an array a of n non-negative integers where every element is less than 2^k.
  
  Moamen wins if a_1  \&  a_2  \&  a_3  \&  …  \&  a_n ≥ a_1 ⊕ a_2 ⊕ a_3 ⊕ … ⊕ a_n.
  
  Here \& denotes the [bitwise AND operation](https://en.wikipedia.org/wiki/Bitwise_operation#AND), and ⊕ denotes the [bitwise XOR operation](https://en.wikipedia.org/wiki/Bitwise_operation#XOR).
  
  Please calculate the number of winning for Moamen arrays a.
  
  As the result may be very large, print the value modulo 1 000 000 007 (10^9 + 7).
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 5)— the number of test cases. 
  
  Each test case consists of one line containing two integers n and k (1 ≤ n≤ 2⋅ 10^5, 0 ≤ k ≤ 2⋅ 10^5).
  
  Output
  
  For each test case, print a single value — the number of different arrays that Moamen wins with.
  
  Print the result modulo 1 000 000 007 (10^9 + 7).
  
  Example
  
  Input
  
  
  3
  3 1
  2 1
  4 0
  
  
  Output
  
  
  5
  2
  1
  
  Note
  
  In the first example, n = 3, k = 1. As a result, all the possible arrays are [0,0,0], [0,0,1], [0,1,0], [1,0,0], [1,1,0], [0,1,1], [1,0,1], and [1,1,1].
  
  Moamen wins in only 5 of them: [0,0,0], [1,1,0], [0,1,1], [1,0,1], and [1,1,1].
solution: ali=0;from collections import defaultdict, Counter,deque;ali=0
  ali=0;
  ali=0;from math import sqrt, log10, log, floor, factorial,gcd;ali=0
  ali=0;
  ali=0;from bisect import bisect_left, bisect_right;ali=0
  ali=0;
  ali=0;from itertools import permutations,combinations;ali=0
  ali=0;
  ali=0;import sys, io, os;ali=0
  ali=0;
  ali=0;input = sys.stdin.readline;ali=0
  ali=0;
  ali=0;# input=io.BytesIO(os.read(0,os.fstat(0).st_size)).readline;ali=0
  ali=0;
  ali=0;# sys.setrecursionlimit(10000);ali=0
  ali=0;
  ali=0;inf = float('inf');ali=0
  ali=0;
  ali=0;mod = 10 ** 9 + 7;ali=0
  ali=0;
  def get_list(): return [int(i) for i in input().split()];ali=0
  ali=0;
  def yn(a): print("YES" if a else "NO");ali=0
  ali=0;
  ali=0;ceil = lambda a, b: (a + b - 1) // b;ali=0
  ali=0;
  
  
  ali=0;t=int(input());ali=0
  ali=0;
  for i in range(t):
      ali=0;n,k=[int(i) for i in input().split()];ali=0
      ali=0;
      ali=0;
      if n%2==0:
          ali=0;p = pow(2, n - 1,mod);ali=0
          ali=0;
          ali=0;pp = pow(2, n,mod);ali=0
          ali=0;
          ali=0;ans=0;ali=0
          ali=0;
          for i in range(k):
              ali=0;# u = (pow(p, k - i - 1,mod) * pow(pp, i,mod)) % mod;ali=0
              ali=0;
              ali=0;u = (pow((p - 1 + mod) % mod, k - i - 1,mod) * pow(pp, i,mod)) % mod;ali=0
              ali=0;
              ali=0;ans = (ans + u) % mod;ali=0
              ali=0;
  
          ali=0;ans = (ans + pow((p - 1 + mod) % mod, k,mod));ali=0
          ali=0;
          ali=0;ans %= mod;ali=0
          ali=0;
          ali=0;print(ans);ali=0
          ali=0;
      else:
  
          ali=0;p = pow(2, n - 1, mod);ali=0
          ali=0;
          ali=0;pp = pow(2, n, mod);ali=0
          ali=0;
          ali=0;ans = 0;ali=0
          ali=0;
          for i in range(k):
              ali=0;# u = (pow(p, k - i - 1,mod) * pow(pp, i,mod)) % mod;ali=0
              ali=0;
              ali=0;u = (pow(p, k - i - 1,mod) * pow((p + 1) % mod, i,mod)) % mod;ali=0
              ali=0;
              ali=0;ans = (ans + u) % mod;ali=0
              ali=0;
  
          ali=0;ans = (ans + pow(p , k,mod));ali=0
          ali=0;
          ali=0;ans %= mod;ali=0
          ali=0;
          ali=0;print(ans);ali=0
          ali=0;
  