/*! JSFuck 0.5.0 - http://jsfuck.com */ const MIN = 32, MAX = 126; const SIMPLE = { false: '![]', true: '!![]', undefined: '[][[]]', NaN: '+[![]]', Infinity: '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])', // +"1e1000" }; const CONSTRUCTORS = { Array: '[]', Number: '(+[])', String: '([]+[])', Boolean: '(![])', Function: '[]["flat"]', RegExp: 'Function("return/"+false+"/")()', Object: '[]["entries"]()', }; const MAPPING = { a: '(false+"")[1]', b: '([]["entries"]()+"")[2]', c: '([]["flat"]+"")[3]', d: '(undefined+"")[2]', e: '(true+"")[3]', f: '(false+"")[0]', g: '(false+[0]+String)[20]', h: '(+(101))["to"+String["name"]](21)[1]', i: '([false]+undefined)[10]', j: '([]["entries"]()+"")[3]', k: '(+(20))["to"+String["name"]](21)', l: '(false+"")[2]', m: '(Number+"")[11]', n: '(undefined+"")[1]', o: '(true+[]["flat"])[10]', p: '(+(211))["to"+String["name"]](31)[1]', q: '("")["fontcolor"]([0]+false+")[20]', r: '(true+"")[1]', s: '(false+"")[3]', t: '(true+"")[0]', u: '(undefined+"")[0]', v: '(+(31))["to"+String["name"]](32)', w: '(+(32))["to"+String["name"]](33)', x: '(+(101))["to"+String["name"]](34)[1]', y: '(NaN+[Infinity])[10]', z: '(+(35))["to"+String["name"]](36)', A: '(NaN+[]["entries"]())[11]', B: '(+[]+Boolean)[10]', C: 'Function("return escape")()(("")["italics"]())[2]', D: 'Function("return escape")()([]["flat"])["slice"]("-1")', E: '(RegExp+"")[12]', F: '(+[]+Function)[10]', G: '(false+Function("return Date")()())[30]', H: null, I: '(Infinity+"")[0]', J: null, K: null, L: null, M: '(true+Function("return Date")()())[30]', N: '(NaN+"")[0]', O: '(+[]+Object)[10]', P: null, Q: null, R: '(+[]+RegExp)[10]', S: '(+[]+String)[10]', T: '(NaN+Function("return Date")()())[30]', U: '(NaN+Object()["to"+String["name"]]["call"]())[11]', V: null, W: null, X: null, Y: null, Z: null, ' ': '(NaN+[]["flat"])[11]', '!': null, '"': '("")["fontcolor"]()[12]', '#': null, $: null, '%': 'Function("return escape")()([]["flat"])[21]', '&': '("")["fontcolor"](")[13]', "'": null, '(': '([]["flat"]+"")[13]', ')': '([0]+false+[]["flat"])[20]', '*': null, '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', ',': '[[]]["concat"]([[]])+""', '-': '(+(.+[0000001])+"")[2]', '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', '/': '(false+[0])["italics"]()[10]', ':': '(RegExp()+"")[3]', ';': '("")["fontcolor"](NaN+")[21]', '<': '("")["italics"]()[0]', '=': '("")["fontcolor"]()[11]', '>': '("")["italics"]()[2]', '?': '(RegExp()+"")[2]', '@': null, '[': '([]["entries"]()+"")[0]', '\\': '(RegExp("/")+"")[1]', ']': '([]["entries"]()+"")[22]', '^': null, _: null, '`': null, '{': '(true+[]["flat"])[20]', '|': null, '}': '([]["flat"]+"")["slice"]("-1")', '~': null, }; const GLOBAL = 'Function("return this")()'; function fillMissingDigits() { var output, number, i; for (number = 0; number < 10; number++) { output = '+[]'; if (number > 0) { output = '+!' + output; } for (i = 1; i < number; i++) { output = '+!+[]' + output; } if (number > 1) { output = output.substr(1); } MAPPING[number] = '[' + output + ']'; } } function replaceMap() { var character = '', value, i, key; function replace(pattern, replacement) { value = value.replace(new RegExp(pattern, 'gi'), replacement); } function digitReplacer(_, x) { return MAPPING[x]; } function numberReplacer(_, y) { var values = y.split(''); var head = +values.shift(); var output = '+[]'; if (head > 0) { output = '+!' + output; } for (i = 1; i < head; i++) { output = '+!+[]' + output; } if (head > 1) { output = output.substr(1); } return [output] .concat(values) .join('+') .replace(/(\d)/g, digitReplacer); } for (i = MIN; i <= MAX; i++) { character = String.fromCharCode(i); value = MAPPING[character]; if (!value) { continue; } for (key in CONSTRUCTORS) { replace('\\b' + key, CONSTRUCTORS[key] + '["constructor"]'); } for (key in SIMPLE) { replace(key, SIMPLE[key]); } replace('(\\d\\d+)', numberReplacer); replace('\\((\\d)\\)', digitReplacer); replace('\\[(\\d)\\]', digitReplacer); replace('GLOBAL', GLOBAL); replace('\\+""', '+[]'); replace('""', '[]+[]'); MAPPING[character] = value; } } function replaceStrings() { var regEx = /[^\[\]\(\)\!\+]{1}/g, all, value, missing, count = MAX - MIN; function findMissing() { var all, value, done = false; missing = {}; for (all in MAPPING) { value = MAPPING[all]; if (value && value.match(regEx)) { missing[all] = value; done = true; } } return done; } function mappingReplacer(a, b) { return b.split('').join('+'); } function valueReplacer(c) { return missing[c] ? c : MAPPING[c]; } for (all in MAPPING) { if (MAPPING[all]) { MAPPING[all] = MAPPING[all].replace( /\"([^\"]+)\"/gi, mappingReplacer ); } } while (findMissing()) { for (all in missing) { value = MAPPING[all]; value = value.replace(regEx, valueReplacer); MAPPING[all] = value; missing[all] = value; } if (count-- === 0) { console.error('Could not compile the following chars:', missing); } } } function escapeSequence(c) { var cc = c.charCodeAt(0); if (cc < 256) { return '\\' + cc.toString(8); } else { var cc16 = cc.toString(16); return '\\u' + ('0000' + cc16).substring(cc16.length); } } function escapeSequenceForReplace(c) { return escapeSequence(c).replace('\\', 't'); } function encode(input, wrapWithEval, runInParentScope) { var output = []; if (!input) { return ''; } var unmappped = ''; for (var k in MAPPING) { if (MAPPING[k]) { unmappped += k; } } unmappped = unmappped.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); unmappped = new RegExp('[^' + unmappped + ']', 'g'); var unmappedCharactersCount = (input.match(unmappped) || []).length; if (unmappedCharactersCount > 1) { // Without this optimization one unmapped caracter has encoded length // of about 3600 characters. Every additional unmapped character adds // 2000 to the total length. For example, the lenght of `~` is 3605, // `~~` is 5600, and `~~~` is 7595. // // The loader with replace has encoded length of about 5300 characters // and every additional character adds 100 to the total length. // In the same example the length of `~~` becomes 5371 and `~~~` -- 5463. // // So, when we have more than one unmapped character we want to encode whole input // except select characters (that have encoded length less than about 70) // into an escape sequence. // // NOTE: `t` should be escaped! input = input.replace( /[^0123456789.adefilnrsuN]/g, escapeSequenceForReplace ); } else if (unmappedCharactersCount > 0) { //Because we will wrap the input into a string we need to escape Backslash // and Double quote characters (we do not need to worry about other characters // because they are not mapped explicitly). // The JSFuck-encoded representation of `\` is 2121 symbols, // so esacped `\` is 4243 symbols and escaped `"` is 2261 symbols // however the escape sequence of that characters are // 2168 and 2155 symbols respectively, so it's more practical to // rewrite them as escape sequences. input = input.replace(/["\\]/g, escapeSequence); //Convert all unmapped characters to escape sequence input = input.replace(unmappped, escapeSequence); } var r = ''; for (var i in SIMPLE) { r += i + '|'; } r += '.'; input.replace(new RegExp(r, 'g'), function (c) { var replacement = SIMPLE[c]; if (replacement) { output.push('(' + replacement + '+[])'); } else { replacement = MAPPING[c]; if (replacement) { output.push(replacement); } else { throw new Error('Found unmapped character: ' + c); } } }); output = output.join('+'); if (/^\d$/.test(input)) { output += '+[]'; } if (unmappedCharactersCount > 1) { // replace `t` with `\\` output = '(' + output + ')[' + encode('split') + '](' + encode('t') + ')[' + encode('join') + '](' + encode('\\') + ')'; } if (unmappedCharactersCount > 0) { output = '[][' + encode('flat') + ']' + '[' + encode('constructor') + ']' + '(' + encode('return"') + '+' + output + '+' + encode('"') + ')()'; } if (wrapWithEval) { if (runInParentScope) { output = '[][' + encode('flat') + ']' + '[' + encode('constructor') + ']' + '(' + encode('return eval') + ')()' + '(' + output + ')'; } else { output = '[][' + encode('flat') + ']' + '[' + encode('constructor') + ']' + '(' + output + ')()'; } } return output; } fillMissingDigits(); replaceMap(); replaceStrings(); /* ============================================= */ print(encode(readline()));