@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
123 lines • 22.3 kB
JavaScript
export class SHA256 {
static hash(msg) {
msg = SHA256.utf8Encode(msg);
// constants [§4.2.2]
const K = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6,
0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb,
0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee,
0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
];
// initial hash value
const hex = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];
// PREPROCESSING
msg += String.fromCharCode(0x80); // add trailing '1' bit (+ 0's padding) to string
// convert string msg into 512-bit blocks (array of 16 32-bit integers)
// length (in 32-bit integers) of msg + ‘1’ + appended length
const l = msg.length / 4 + 2;
// number of 16-integer (512-bit) blocks required to hold 'l' ints
const N = Math.ceil(l / 16);
// message M is N×16 array of 32-bit integers
const M = new Array(N);
for (let i = 0; i < N; i++) {
M[i] = new Array(16);
for (let j = 0; j < 16; j++) {
// encode 4 chars per integer (64 per block), big-endian encoding
M[i][j] = (msg.charCodeAt(i * 64 + j * 4 + 0) << 24) | (msg.charCodeAt(i * 64 + j * 4 + 1) << 16) | (msg.charCodeAt(i * 64 + j * 4 + 2) << 8) | (msg.charCodeAt(i * 64 + j * 4 + 3) << 0);
} // note running off the end of msg is ok 'cos bitwise ops on NaN return 0
}
// add length (in bits) into final pair of 32-bit integers (big-endian)
// note: most significant word would be (len-1)*8 >>> 32, but since JS converts
// bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
const lenHi = ((msg.length - 1) * 8) / Math.pow(2, 32);
const lenLo = ((msg.length - 1) * 8) >>> 0;
M[N - 1][14] = Math.floor(lenHi);
M[N - 1][15] = lenLo;
// HASH COMPUTATION
for (let i = 0; i < N; i++) {
const W = new Array(64);
// 1 - prepare message schedule 'W'
for (let t = 0; t < 16; t++) {
W[t] = M[i][t];
}
for (let t = 16; t < 64; t++) {
W[t] = (SHA256.σ1(W[t - 2]) + W[t - 7] + SHA256.σ0(W[t - 15]) + W[t - 16]) >>> 0;
}
// 2 - initialise working variables a, b, c, d, e, f, g, h with previous hash value
let a = hex[0];
let b = hex[1];
let c = hex[2];
let d = hex[3];
let e = hex[4];
let f = hex[5];
let g = hex[6];
let h = hex[7];
// 3 - main loop (note '>>> 0' for 'addition modulo 2^32')
for (let t = 0; t < 64; t++) {
const T1 = h + SHA256.Σ1(e) + SHA256.choice(e, f, g) + K[t] + W[t];
const T2 = SHA256.Σ0(a) + SHA256.majority(a, b, c);
h = g;
g = f;
f = e;
e = (d + T1) >>> 0;
d = c;
c = b;
b = a;
a = (T1 + T2) >>> 0;
}
// 4 - compute the new intermediate hash value (note '>>> 0' for 'addition modulo 2^32')
hex[0] = (hex[0] + a) >>> 0;
hex[1] = (hex[1] + b) >>> 0;
hex[2] = (hex[2] + c) >>> 0;
hex[3] = (hex[3] + d) >>> 0;
hex[4] = (hex[4] + e) >>> 0;
hex[5] = (hex[5] + f) >>> 0;
hex[6] = (hex[6] + g) >>> 0;
hex[7] = (hex[7] + h) >>> 0;
}
// convert H0..H7 to hex strings (with leading zeros)
for (let h = 0; h < hex.length; h++) {
hex[h] = ('00000000' + hex[h].toString(16)).slice(-8);
}
return hex.join('');
}
static utf8Encode(str) {
try {
return new TextEncoder().encode(str).reduce((prev, curr) => prev + String.fromCharCode(curr), '');
}
catch (e) {
// no TextEncoder available?
return unescape(encodeURIComponent(str));
}
}
/**
* Rotates right (circular right shift) value x by n positions.
* @private
*/
static ROTR(n, x) {
return (x >>> n) | (x << (32 - n));
}
/**
* Logical functions
* @private
*/
static Σ0(x) {
return SHA256.ROTR(2, x) ^ SHA256.ROTR(13, x) ^ SHA256.ROTR(22, x);
}
static Σ1(x) {
return SHA256.ROTR(6, x) ^ SHA256.ROTR(11, x) ^ SHA256.ROTR(25, x);
}
static σ0(x) {
return SHA256.ROTR(7, x) ^ SHA256.ROTR(18, x) ^ (x >>> 3);
}
static σ1(x) {
return SHA256.ROTR(17, x) ^ SHA256.ROTR(19, x) ^ (x >>> 10);
}
static choice(x, y, z) {
return (x & y) ^ (~x & z);
}
static majority(x, y, z) {
return (x & y) ^ (x & z) ^ (y & z);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY29yZS9saWNlbnNlL2FsZ28vc2hhMjU2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxNQUFNO0lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFRO1FBQ2hCLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLHFCQUFxQjtRQUNyQixNQUFNLENBQUMsR0FBRztZQUNOLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDbE8sVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUNsTyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO1lBQ2xPLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFV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QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckYsQ0FBQztZQUVELG1GQUFtRjtZQUNuRixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFZiwwREFBMEQ7WUFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxD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R0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ08sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLENBQU07UUFDeEMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTTtRQUMxQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTSEEyNTYge1xuICAgIHN0YXRpYyBoYXNoKG1zZzogYW55KTogYW55IHtcbiAgICAgICAgbXNnID0gU0hBMjU2LnV0ZjhFbmNvZGUobXNnKTtcbiAgICAgICAgLy8gY29uc3RhbnRzIFvCpzQuMi4yXVxuICAgICAgICBjb25zdCBLID0gW1xuICAgICAgICAgICAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNixcbiAgICAgICAgICAgIDB4MjQwY2ExY2MsIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsXG4gICAgICAgICAgICAweDgxYzJjOTJlLCAweDkyNzIyYzg1LCAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLCAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLCAweDc0OGY4MmVlLFxuICAgICAgICAgICAgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIGluaXRpYWwgaGFzaCB2YWx1ZVxuICAgICAgICBjb25zdCBoZXg6IGFueSA9IFsweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLCAweDUxMGU1MjdmLCAweDliMDU2ODhjLCAweDFmODNkOWFiLCAweDViZTBjZDE5XTtcblxuICAgICAgICAvLyBQUkVQUk9DRVNTSU5HXG4gICAgICAgIG1zZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODApOyAvLyBhZGQgdHJhaWxpbmcgJzEnIGJpdCAoKyAwJ3MgcGFkZGluZykgdG8gc3RyaW5nXG5cbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgbXNnIGludG8gNTEyLWJpdCBibG9ja3MgKGFycmF5IG9mIDE2IDMyLWJpdCBpbnRlZ2VycylcbiAgICAgICAgLy8gbGVuZ3RoIChpbiAzMi1iaXQgaW50ZWdlcnMpIG9mIG1zZyArIOKAmDHigJkgKyBhcHBlbmRlZCBsZW5ndGhcbiAgICAgICAgY29uc3QgbCA9IG1zZy5sZW5ndGggLyA0ICsgMjtcblxuICAgICAgICAvLyBudW1iZXIgb2YgMTYtaW50ZWdlciAoNTEyLWJpdCkgYmxvY2tzIHJlcXVpcmVkIHRvIGhvbGQgJ2wnIGludHNcbiAgICAgICAgY29uc3QgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuXG4gICAgICAgIC8vIG1lc3NhZ2UgTSBpcyBOw5cxNiBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnNcbiAgICAgICAgY29uc3QgTSA9IG5ldyBBcnJheShOKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICAgICAgTVtpXSA9IG5ldyBBcnJheSgxNik7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAgICAgICAvLyBlbmNvZGUgNCBjaGFycyBwZXIgaW50ZWdlciAoNjQgcGVyIGJsb2NrKSwgYmlnLWVuZGlhbiBlbmNvZGluZ1xuICAgICAgICAgICAgICAgIE1baV1bal0gPSAobXNnLmNoYXJDb2RlQXQoaSAqIDY0ICsgaiAqIDQgKyAwKSA8PCAyNCkgfCAobXNnLmNoYXJDb2RlQXQoaSAqIDY0ICsgaiAqIDQgKyAxKSA8PCAxNikgfCAobXNnLmNoYXJDb2RlQXQoaSAqIDY0ICsgaiAqIDQgKyAyKSA8PCA4KSB8IChtc2cuY2hhckNvZGVBdChpICogNjQgKyBqICogNCArIDMpIDw8IDApO1xuICAgICAgICAgICAgfSAvLyBub3RlIHJ1bm5pbmcgb2ZmIHRoZSBlbmQgb2YgbXNnIGlzIG9rICdjb3MgYml0d2lzZSBvcHMgb24gTmFOIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIGxlbmd0aCAoaW4gYml0cykgaW50byBmaW5hbCBwYWlyIG9mIDMyLWJpdCBpbnRlZ2VycyAoYmlnLWVuZGlhbilcbiAgICAgICAgLy8gbm90ZTogbW9zdCBzaWduaWZpY2FudCB3b3JkIHdvdWxkIGJlIChsZW4tMSkqOCA+Pj4gMzIsIGJ1dCBzaW5jZSBKUyBjb252ZXJ0c1xuICAgICAgICAvLyBiaXR3aXNlLW9wIGFyZ3MgdG8gMzIgYml0cywgd2UgbmVlZCB0byBzaW11bGF0ZSB0aGlzIGJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzXG4gICAgICAgIGNvbnN0IGxlbkhpID0gKChtc2cubGVuZ3RoIC0gMSkgKiA4KSAvIE1hdGgucG93KDIsIDMyKTtcbiAgICAgICAgY29uc3QgbGVuTG8gPSAoKG1zZy5sZW5ndGggLSAxKSAqIDgpID4+PiAwO1xuICAgICAgICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKGxlbkhpKTtcbiAgICAgICAgTVtOIC0gMV1bMTVdID0gbGVuTG87XG5cbiAgICAgICAgLy8gSEFTSCBDT01QVVRBVElPTlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgVyA9IG5ldyBBcnJheSg2NCk7XG5cbiAgICAgICAgICAgIC8vIDEgLSBwcmVwYXJlIG1lc3NhZ2Ugc2NoZWR1bGUgJ1cnXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDE2OyB0KyspIHtcbiAgICAgICAgICAgICAgICBXW3RdID0gTVtpXVt0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAxNjsgdCA8IDY0OyB0KyspIHtcbiAgICAgICAgICAgICAgICBXW3RdID0gKFNIQTI1Ni7PgzEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBTSEEyNTYuz4MwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0pID4+PiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAyIC0gaW5pdGlhbGlzZSB3b3JraW5nIHZhcmlhYmxlcyBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoIHdpdGggcHJldmlvdXMgaGFzaCB2YWx1ZVxuICAgICAgICAgICAgbGV0IGEgPSBoZXhbMF07XG4gICAgICAgICAgICBsZXQgYiA9IGhleFsxXTtcbiAgICAgICAgICAgIGxldCBjID0gaGV4WzJdO1xuICAgICAgICAgICAgbGV0IGQgPSBoZXhbM107XG4gICAgICAgICAgICBsZXQgZSA9IGhleFs0XTtcbiAgICAgICAgICAgIGxldCBmID0gaGV4WzVdO1xuICAgICAgICAgICAgbGV0IGcgPSBoZXhbNl07XG4gICAgICAgICAgICBsZXQgaCA9IGhleFs3XTtcblxuICAgICAgICAgICAgLy8gMyAtIG1haW4gbG9vcCAobm90ZSAnPj4+IDAnIGZvciAnYWRkaXRpb24gbW9kdWxvIDJeMzInKVxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCA2NDsgdCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgVDEgPSBoICsgU0hBMjU2Ls6jMShlKSArIFNIQTI1Ni5jaG9pY2UoZSwgZiwgZykgKyBLW3RdICsgV1t0XTtcbiAgICAgICAgICAgICAgICBjb25zdCBUMiA9IFNIQTI1Ni7OozAoYSkgKyBTSEEyNTYubWFqb3JpdHkoYSwgYiwgYyk7XG4gICAgICAgICAgICAgICAgaCA9IGc7XG4gICAgICAgICAgICAgICAgZyA9IGY7XG4gICAgICAgICAgICAgICAgZiA9IGU7XG4gICAgICAgICAgICAgICAgZSA9IChkICsgVDEpID4+PiAwO1xuICAgICAgICAgICAgICAgIGQgPSBjO1xuICAgICAgICAgICAgICAgIGMgPSBiO1xuICAgICAgICAgICAgICAgIGIgPSBhO1xuICAgICAgICAgICAgICAgIGEgPSAoVDEgKyBUMikgPj4+IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDQgLSBjb21wdXRlIHRoZSBuZXcgaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgKG5vdGUgJz4+PiAwJyBmb3IgJ2FkZGl0aW9uIG1vZHVsbyAyXjMyJylcbiAgICAgICAgICAgIGhleFswXSA9IChoZXhbMF0gKyBhKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFsxXSA9IChoZXhbMV0gKyBiKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFsyXSA9IChoZXhbMl0gKyBjKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFszXSA9IChoZXhbM10gKyBkKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFs0XSA9IChoZXhbNF0gKyBlKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFs1XSA9IChoZXhbNV0gKyBmKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFs2XSA9IChoZXhbNl0gKyBnKSA+Pj4gMDtcbiAgICAgICAgICAgIGhleFs3XSA9IChoZXhbN10gKyBoKSA+Pj4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnZlcnQgSDAuLkg3IHRvIGhleCBzdHJpbmdzICh3aXRoIGxlYWRpbmcgemVyb3MpXG4gICAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgaGV4Lmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgICBoZXhbaF0gPSAoJzAwMDAwMDAwJyArIGhleFtoXS50b1N0cmluZygxNikpLnNsaWNlKC04KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGV4LmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHV0ZjhFbmNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY3VyciksICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gbm8gVGV4dEVuY29kZXIgYXZhaWxhYmxlP1xuICAgICAgICAgICAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgcmlnaHQgKGNpcmN1bGFyIHJpZ2h0IHNoaWZ0KSB2YWx1ZSB4IGJ5IG4gcG9zaXRpb25zLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgUk9UUihuOiBudW1iZXIsIHg6IGFueSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoeCA+Pj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9naWNhbCBmdW5jdGlvbnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIM6jMCh4OiBhbnkpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU0hBMjU2LlJPVFIoMiwgeCkgXiBTSEEyNTYuUk9UUigxMywgeCkgXiBTSEEyNTYuUk9UUigyMiwgeCk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIM6jMSh4OiBhbnkpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU0hBMjU2LlJPVFIoNiwgeCkgXiBTSEEyNTYuUk9UUigxMSwgeCkgXiBTSEEyNTYuUk9UUigyNSwgeCk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIM+DMCh4OiBhbnkpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU0hBMjU2LlJPVFIoNywgeCkgXiBTSEEyNTYuUk9UUigxOCwgeCkgXiAoeCA+Pj4gMyk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIM+DMSh4OiBhbnkpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU0hBMjU2LlJPVFIoMTcsIHgpIF4gU0hBMjU2LlJPVFIoMTksIHgpIF4gKHggPj4+IDEwKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hvaWNlKHg6IGFueSwgeTogYW55LCB6OiBhbnkpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKHggJiB5KSBeICh+eCAmIHopO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBtYWpvcml0eSh4OiBhbnksIHk6IGFueSwgejogYW55KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KTtcbiAgICB9XG59XG4iXX0=