#include<bits/stdc++.h>
using namespace std;
/*
ed_encrypt法
src: 明文
key: 密码
jz: 数据进制
encode: 是否变成16进制编码
*/
string ed_encrypt(string src,string key,int jz=128,bool encode=true)
{
y:;
if(key=="") key=" "; //以防崩溃
string k2(src.length(),' ');
for(int i=0;i<k2.length();i++)
{
k2[i]=key[i%key.length()];
}
s:;
for(int i=0;i<k2.length();i++)
{
int x=src[i];
if(i!=0) x+=src[i-1];
x+=k2[i];
while(x>=jz) x-=jz;
src[i]=x;
}
c:;
char codes[100]="0123456789abcdef";
if(encode)
{
string ec(src.length()*2,'_');
for(int i=0;i<src.length();i++)
{
ec[2*i]=codes[src[i]/16];
ec[2*i+1]=codes[src[i]%16];
}
return ec;
}
e:;
return src;
}
/*
ed_decrypt法
src: 密文
key: 密码
jz: 数据进制
decode: 解码16进制
*/
string ed_decrypt(string ec,string key,int jz=128,bool decode=true)
{
c:;
string src;
if(decode)
{
string tmp(ec.length()/2,'_');
for(int i=0;i<tmp.length();i++)
{
int a=ec[i*2];
if(isdigit(a)) a-='0';
else a=a-'a'+10;
int b=ec[i*2+1];
if(isdigit(b)) b-='0';
else b=b-'a'+10;
tmp[i]=a*16+b;
}
src=tmp;
}
else src=ec;
y:;
if(key=="") key=" "; //以防崩溃
string k2(src.length(),' ');
for(int i=0;i<k2.length();i++)
{
k2[i]=key[i%key.length()];
}
s:;
for(int i=k2.length()-1;i>=0;i--)
{
int x=src[i];
if(i!=0) x-=src[i-1];
x-=k2[i];
while(x<0) x+=jz;
src[i]=x;
}
e:;
return src;
}
int main()
{
int T;
scanf("%d",&T);
cout<<endl;
while(T--)
{
int mode;
string laji;
scanf("%d",&mode);
getline(cin,laji);
if(mode==1)
{
string data,key;
getline(cin,data);
getline(cin,key);
cout<<ed_encrypt(data,key,128,true)<<endl<<endl;
}
else if(mode==-1)
{
string data,key;
getline(cin,data);
getline(cin,key);
cout<<ed_decrypt(data,key,128,true)<<endl<<endl;
}
else cout<<"Invalid type!\n"<<endl;
}
}