var soup = new Array();
var cnt=0;
soup[cnt++] = " ";
soup[cnt++] = "a";
soup[cnt++] = "b";
soup[cnt++] = "c";
soup[cnt++] = "d";
soup[cnt++] = "e";
soup[cnt++] = "f";
soup[cnt++] = "g";
soup[cnt++] = "h";
soup[cnt++] = "i";
soup[cnt++] = "j";
soup[cnt++] = "k";
soup[cnt++] = "l";
soup[cnt++] = "m";
soup[cnt++] = "n";
soup[cnt++] = "o";
soup[cnt++] = "p";
soup[cnt++] = "q";
soup[cnt++] = "r";
soup[cnt++] = "s";
soup[cnt++] = "t";
soup[cnt++] = "u";
soup[cnt++] = "v";
soup[cnt++] = "w";
soup[cnt++] = "x";
soup[cnt++] = "y";
soup[cnt++] = "z";
soup[cnt++] = "A";
soup[cnt++] = "B";
soup[cnt++] = "C";
soup[cnt++] = "D";
soup[cnt++] = "E";
soup[cnt++] = "F";
soup[cnt++] = "G";
soup[cnt++] = "H";
soup[cnt++] = "I";
soup[cnt++] = "J";
soup[cnt++] = "K";
soup[cnt++] = "L";
soup[cnt++] = "M";
soup[cnt++] = "N";
soup[cnt++] = "O";
soup[cnt++] = "P";
soup[cnt++] = "Q";
soup[cnt++] = "R";
soup[cnt++] = "S";
soup[cnt++] = "T";
soup[cnt++] = "U";
soup[cnt++] = "V";
soup[cnt++] = "W";
soup[cnt++] = "X";
soup[cnt++] = "Y";
soup[cnt++] = "Z";
soup[cnt++] = "`";
soup[cnt++] = "1";
soup[cnt++] = "2";
soup[cnt++] = "3";
soup[cnt++] = "4";
soup[cnt++] = "5";
soup[cnt++] = "6";
soup[cnt++] = "7";
soup[cnt++] = "8";
soup[cnt++] = "9";
soup[cnt++] = "0";
soup[cnt++] = "-";
soup[cnt++] = "=";
soup[cnt++] = "[";
soup[cnt++] = "]";
soup[cnt++] = "\\";
soup[cnt++] = ";";
soup[cnt++] = "'";
soup[cnt++] = ",";
soup[cnt++] = ".";
soup[cnt++] = "/";
soup[cnt++] = "~";
soup[cnt++] = "!";
soup[cnt++] = "@";
soup[cnt++] = "#";
soup[cnt++] = "$";
soup[cnt++] = "%";
soup[cnt++] = "^";
soup[cnt++] = "&";
soup[cnt++] = "*";
soup[cnt++] = "(";
soup[cnt++] = ")";
soup[cnt++] = "_";
soup[cnt++] = "+";
soup[cnt++] = "{";
soup[cnt++] = "}";
soup[cnt++] = "|";
soup[cnt++] = ":";
soup[cnt++] = "\"";
soup[cnt++] = "<";
soup[cnt++] = ">";
soup[cnt++] = "?";

var encvigsq = new Array();
for (var vi=0; vi < soup.length; vi++) {
    encvigsq[soup[vi]] = new Array();
    for (var vj=0; vj < soup.length; vj++) {
        var letter = vi+vj;
        if (vi+vj > (soup.length - 1)) {
            letter = vi+vj-soup.length;
        }
        encvigsq[soup[vi]][soup[vj]] = soup[letter];
    }
}

var decvigsq = new Array();
for (var di=0; di < soup.length; di++) {
    decvigsq[soup[di]] = new Array();
    for(var dj=0; dj < soup.length; dj++) {
        decvigsq[soup[di]][encvigsq[soup[di]][soup[dj]]] = soup[dj];
    }
}

function decode(source) {
    // comments 
    var sourceString = source;
    sourceString = sourceString.replace(/[\t\f\n\r]+/g, " ");
    var outputString = "";
    var keyString = 'sawhorse';
    keyString = keyString.replace(/[\t\f\n\r\v]+/g, " ");
    var keyidx = 0;
    for (var i = 0; i < sourceString.length; i++){
        if (decvigsq[keyString.charAt(keyidx)][sourceString.charAt(i)]) {
            outputString += decvigsq[keyString.charAt(keyidx)][sourceString.charAt(i)];
            if (keyidx == (keyString.length - 1)) {
                keyidx = 0;
            } else {
                keyidx++;
            }
        } else {
            outputString += sourceString.charAt(i);
        }
    }
    //return outputString;
	return outputString;
}