#include #include #include #include #include #include #include #include using namespace std; typedef long long LL; const int N = 100005; int T, flag[N], p0, p[N], n, a[N]; int p1; int sum[N]; LL ans1,ans2,ans3,tot; map mp; struct Node { int x, y; }ans[N]; bool cmp(const Node &a, const Node &b) { return a.x < b.x; } int main() { scanf("%d", &T); memset(flag, 0, sizeof(flag)); for (int i = 2; i <= 100000; ++i) { if (flag[i] != 0) continue; ++p0; p[p0] = i; for (int j = i; j <= 100000; j += i) { flag[j] = 1; } } while (T--) { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); mp.clear(); p1 = p0; memset(sum,0,sizeof(sum)); for (int i = 1; i <= n; ++i) { int now = a[i]; int j = 1; while (j <= p0 && now != 1) { while (now % p[j] == 0) { ++sum[j]; now /= p[j]; } ++j; } if (now != 1) { if (mp.count(now) != 0) { ++mp[now]; } else { ++p1; p[p1] = now; mp[now] = 1; } } } for (int i = 1; i <= p0; ++i) ans[i].x = p[i], ans[i].y = sum[i]; for (int i = p0 + 1; i <= p1; ++i) ans[i].x = p[i], ans[i].y = mp[ans[i].x]; sort(ans + 1, ans + p1 + 1,cmp); tot = 0; for (int i=1;i<=p1;++i) { tot+=ans[i].y; } if (tot<2) { printf("-1\n"); continue; } ans1 = 0; ans2 = 0; for (int i = 1; i <= p1; ++i) { if (ans[i].y==0) continue; if (ans1==0) { if (ans[i].y>=2) { ans1=ans[i].x; ans2=ans[i].x; break; } else ans1=ans[i].x; } else { ans2=ans[i].x; break; } } ans3=ans1*ans2; printf("%I64d\n",ans3); } return 0; }