Деобфускация одного скрипта с попапами

habr.png

Тяжело найти человека, который не сталкивался бы с таким отвратительным явлением на сайтах, как рекламный попап. Откровенно не понимаю зачем их делают, но, судя по всему, это работает. И это печально. В своё время данное явление достало даже разработчиков браузеров из-за чего на тот же window.open были наложены ограничения, не позволяющие открывать новые окна без спросу пользователя. К сожалению их было недостаточно и в борьбу включились баннерорезки. К сожалению API, предоставляемые браузерами, не идеальны и потому периодически обнаруживаются новые пути ухода от блокировки, которые как-то приходится затыкать. Вот только довольно сложно заткнуть брешь не зная как она работает и разработчики рекламных скриптов это тоже прекрасно понимают. В результате код обфусцируется всё новыми и новыми способами. Здесь я попробую разобрать один такой скрипт и техники обфускации кода, применяемые в нём, крайний раз обнаруженный на средней популярности сайте хентайной мангой (японские порнокомиксы).

Пожалуй сразу начнём со внешнего вида пациента
  
      
  

Выглядит устрашающе. На практике всё не на столько плохо как может показаться, но понять что тут происходит решительно невозможно. Разве что видно, что в зависимости от того грузится или не грузится рекламный скрипт с go.onclasrv.com вызывается та или иная функции. Не густо. Давайте приведём это хоть в сколько-то читабельную форму. Нам в этом поможет jsnice.org. По крайней мере теперь есть форматирование кода и числа в нормальной форме, а не смесь из разных систем счисления и форм записи. Бонусом будем считать разметку типов переменных и параметров функций, пусть и не совсем точную в некоторых ситуациях.

Текст скрипта с форматированием
/** @type {Window} */
var e4Z6h = window;
var P6h;
for (P6h in e4Z6h) {
  if (P6h.length === ((39, 10) <= (571, 36) ? (40, 9) : (41, 73) >= (3, 356) ? 115 : (491, 125)) && (P6h.charCodeAt((40, 448) >= (82, 427) ? (1496, 6) : (1074, 336)) === (638 > (502, 465) ? (983, 116) : (209, 985) < 471 ? 134 : 798 <= (1408, 185) ? 908 : (426, 579)) && (P6h.charCodeAt((1285, 201) > (337, 74) ? (6, 8) : (129, 1081)) === ((368, 262) >= (906, 3) ? (115, 114) : (62, 284) >= (539, 397) ? (864, 22) : (50, 1128)) && (P6h.charCodeAt((547, 23) >= 1013 ? 114 : (405, 133) > 306 ? (192, "com") : 
  (435, 146) <= 158 ? (97, 4) : (119, 981)) === ((701, 59) >= (138, 249) ? (12, 400) : (40, 73) <= (94, 169) ? (53, 103) : (131, 426)) && P6h.charCodeAt((444, 138) < (430, 5) ? 269 : (103, 350) >= (579, 412) ? (289, "k") : (60, 229) <= 1128 ? (124, 0) : (235, 113)) === (1035 > (149, 136) ? (17, 110) : (410, 94) >= 232 ? (533, 957) : 98 <= (1355, 1) ? "A" : (56, 45)))))) {
    break;
  }
}
var O6h;
for (O6h in e4Z6h) {
  if (O6h.length === (106 >= (208, 6) ? (1, 8) : (1097, 90)) && (O6h.charCodeAt(5) === 101 && (O6h.charCodeAt(7) === ((103, 581) > 52 ? (576, 116) : 370 < (144, 293) ? 456 : 520 <= (317, 511) ? 138 : (75, 20)) && (O6h.charCodeAt(3) === (653 >= (316, 733) ? "e" : (1313, 306) < 566 ? (109, 117) : (148, 198)) && O6h.charCodeAt(0) === 100)))) {
    break;
  }
}
var G6h;
for (G6h in e4Z6h) {
  if (G6h.length === 6 && (G6h.charCodeAt(3) === 100 && (G6h.charCodeAt(5) === 119 && (G6h.charCodeAt(138 < (206, 584) ? (807, 1) : 519 <= (135, 278) ? (1268, "|") : (41, 320) <= 40 ? (9, "|") : (213, 717)) === 105 && G6h.charCodeAt((31, 106) <= (312, 326) ? (129, 0) : (111, 139)) === 119)))) {
    break;
  }
}
"use strict";
var I3x = {
  /**
   * @param {number} a4
   * @param {number} b1
   * @return {?}
   */
  "O2h" : function(a4, b1) {
    return a4 * b1;
  },
  /**
   * @param {?} newVal
   * @param {?} oldVal
   * @return {?}
   */
  "R5h" : function(newVal, oldVal) {
    return newVal !== oldVal;
  },
  /**
   * @param {(boolean|number|string)} a
   * @param {(boolean|number|string)} b
   * @return {?}
   */
  "j6h" : function(a, b) {
    return a > b;
  },
  /**
   * @param {?} deepDataAndEvents
   * @param {?} el
   * @return {?}
   */
  "L2h" : function(deepDataAndEvents, el) {
    return deepDataAndEvents === el;
  },
  /**
   * @param {?} i
   * @param {Object} arr2
   * @return {?}
   */
  "V6h" : function(i, arr2) {
    return i in arr2;
  },
  /**
   * @param {?} newValue
   * @param {?} oldValue
   * @return {?}
   */
  "Q6h" : function(newValue, oldValue) {
    return newValue !== oldValue;
  },
  "Y2h" : "t",
  /**
   * @param {?} v02
   * @param {?} dataAndEvents
   * @return {?}
   */
  "M6h" : function(v02, dataAndEvents) {
    return v02 !== dataAndEvents;
  },
  /**
   * @param {number} object
   * @param {number} backoff
   * @param {number} value
   * @param {number} data
   * @return {?}
   */
  "G2h" : function(object, backoff, value, data) {
    return object * backoff * value * data;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} obj
   * @return {?}
   */
  "H5h" : function(dataAndEvents, obj) {
    return dataAndEvents * obj;
  },
  /**
   * @param {?} callback
   * @param {?} value
   * @return {?}
   */
  "S6h" : function(callback, value) {
    return callback === value;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} obj
   * @return {?}
   */
  "a5h" : function(deepDataAndEvents, obj) {
    return deepDataAndEvents <= obj;
  },
  /**
   * @param {number} to
   * @param {number} from
   * @return {?}
   */
  "J5h" : function(to, from) {
    return to - from;
  },
  /**
   * @param {(boolean|number|string)} a
   * @param {(boolean|number|string)} b
   * @return {?}
   */
  "u5h" : function(a, b) {
    return a > b;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} v00
   * @return {?}
   */
  "z6h" : function(dataAndEvents, v00) {
    return dataAndEvents & v00;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} n
   * @return {?}
   */
  "N5h" : function(deepDataAndEvents, n) {
    return deepDataAndEvents <= n;
  },
  /**
   * @param {?} regex
   * @param {?} timer
   * @return {?}
   */
  "T5h" : function(regex, timer) {
    return regex === timer;
  },
  /**
   * @param {string} dataAndEvents
   * @param {string} deepDataAndEvents
   * @return {?}
   */
  "e6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents == deepDataAndEvents;
  },
  /**
   * @param {number} _id
   * @param {number} dataAndEvents
   * @return {?}
   */
  "K6h" : function(_id, dataAndEvents) {
    return _id < dataAndEvents;
  },
  /**
   * @param {number} value
   * @param {number} regex
   * @return {?}
   */
  "C2h" : function(value, regex) {
    return value * regex;
  },
  /**
   * @param {(boolean|number|string)} res
   * @param {(boolean|number|string)} dataAndEvents
   * @return {?}
   */
  "c5h" : function(res, dataAndEvents) {
    return res > dataAndEvents;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} regex
   * @return {?}
   */
  "u6h" : function(deepDataAndEvents, regex) {
    return deepDataAndEvents >> regex;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} xs
   * @param {number} v00
   * @return {?}
   */
  "a2h" : function(dataAndEvents, xs, v00) {
    return dataAndEvents ^ xs ^ v00;
  },
  /**
   * @param {?} a
   * @param {?} b
   * @return {?}
   */
  "P5h" : function(a, b) {
    return a === b;
  },
  /**
   * @param {?} name
   * @param {?} index
   * @return {?}
   */
  "U2h" : function(name, index) {
    return name === index;
  },
  /**
   * @param {(boolean|number)} i
   * @param {(boolean|number)} regex
   * @return {?}
   */
  "B5h" : function(i, regex) {
    return i >= regex;
  },
  /**
   * @param {(boolean|number|string)} a
   * @param {(boolean|number|string)} b
   * @return {?}
   */
  "e5h" : function(a, b) {
    return a > b;
  },
  /**
   * @param {?} name
   * @param {?} index
   * @return {?}
   */
  "A5h" : function(name, index) {
    return name === index;
  },
  /**
   * @param {number} v02
   * @param {number} regex
   * @return {?}
   */
  "r6h" : function(v02, regex) {
    return v02 >> regex;
  },
  /**
   * @param {?} dataAndEvents
   * @param {?} deepDataAndEvents
   * @return {?}
   */
  "z5h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents === deepDataAndEvents;
  },
  /**
   * @param {number} k
   * @param {number} n
   * @return {?}
   */
  "m5h" : function(k, n) {
    return k - n;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} v00
   * @return {?}
   */
  "r5h" : function(dataAndEvents, v00) {
    return dataAndEvents & v00;
  },
  /**
   * @param {string} deepDataAndEvents
   * @param {string} args
   * @return {?}
   */
  "o2h" : function(deepDataAndEvents, args) {
    return deepDataAndEvents == args;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} deepDataAndEvents
   * @return {?}
   */
  "f6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents | deepDataAndEvents;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} wait
   * @return {?}
   */
  "p5h" : function(deepDataAndEvents, wait) {
    return deepDataAndEvents <= wait;
  },
  /**
   * @param {?} a
   * @param {?} b
   * @return {?}
   */
  "E6h" : function(a, b) {
    return a === b;
  },
  /**
   * @param {number} _id
   * @param {number} n
   * @return {?}
   */
  "x6h" : function(_id, n) {
    return _id >> n;
  },
  /**
   * @param {number} value
   * @param {number} end
   * @return {?}
   */
  "M5h" : function(value, end) {
    return value <= end;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} opt_attributes
   * @return {?}
   */
  "X6h" : function(dataAndEvents, opt_attributes) {
    return dataAndEvents & opt_attributes;
  },
  /**
   * @param {string} deepDataAndEvents
   * @param {string} value
   * @return {?}
   */
  "i5h" : function(deepDataAndEvents, value) {
    return deepDataAndEvents == value;
  },
  "H2h" : false,
  /**
   * @param {number} value
   * @param {number} regex
   * @return {?}
   */
  "C6h" : function(value, regex) {
    return value >> regex;
  },
  /**
   * @param {number} value
   * @param {number} execResult
   * @return {?}
   */
  "W6h" : function(value, execResult) {
    return value <= execResult;
  },
  /**
   * @param {string} dataAndEvents
   * @param {string} deepDataAndEvents
   * @return {?}
   */
  "J6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents == deepDataAndEvents;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} opt_fromIndex
   * @return {?}
   */
  "n6h" : function(deepDataAndEvents, opt_fromIndex) {
    return deepDataAndEvents <= opt_fromIndex;
  },
  /**
   * @param {string} el
   * @param {string} value
   * @return {?}
   */
  "S5h" : function(el, value) {
    return el == value;
  },
  /**
   * @param {?} deepDataAndEvents
   * @param {?} val1
   * @return {?}
   */
  "k2h" : function(deepDataAndEvents, val1) {
    return deepDataAndEvents !== val1;
  },
  /**
   * @param {number} i
   * @param {number} regex
   * @return {?}
   */
  "q6h" : function(i, regex) {
    return i < regex;
  },
  /**
   * @param {string} deepDataAndEvents
   * @param {string} result
   * @return {?}
   */
  "K2h" : function(deepDataAndEvents, result) {
    return deepDataAndEvents == result;
  },
  /**
   * @param {string} dataAndEvents
   * @param {string} value
   * @return {?}
   */
  "G5h" : function(dataAndEvents, value) {
    return dataAndEvents == value;
  },
  /**
   * @param {?} dataAndEvents
   * @param {?} deepDataAndEvents
   * @return {?}
   */
  "H6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents === deepDataAndEvents;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} opt_attributes
   * @return {?}
   */
  "K5h" : function(deepDataAndEvents, opt_attributes) {
    return deepDataAndEvents & opt_attributes;
  },
  /**
   * @param {number} _id
   * @param {number} dataAndEvents
   * @return {?}
   */
  "x5h" : function(_id, dataAndEvents) {
    return _id < dataAndEvents;
  },
  /**
   * @param {number} far
   * @param {number} near
   * @return {?}
   */
  "y5h" : function(far, near) {
    return far - near;
  },
  /**
   * @param {number} el
   * @param {number} value
   * @return {?}
   */
  "V5h" : function(el, value) {
    return el == value;
  },
  /**
   * @param {number} _id
   * @param {number} v02
   * @return {?}
   */
  "b6h" : function(_id, v02) {
    return _id < v02;
  },
  /**
   * @param {string} deepDataAndEvents
   * @param {string} collection
   * @return {?}
   */
  "A6h" : function(deepDataAndEvents, collection) {
    return deepDataAndEvents == collection;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} obj
   * @return {?}
   */
  "D6h" : function(deepDataAndEvents, obj) {
    return deepDataAndEvents <= obj;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} value
   * @return {?}
   */
  "g6h" : function(deepDataAndEvents, value) {
    return deepDataAndEvents <= value;
  },
  /**
   * @param {number} v02
   * @param {number} dataAndEvents
   * @return {?}
   */
  "o5h" : function(v02, dataAndEvents) {
    return v02 & dataAndEvents;
  },
  /**
   * @param {number} keepData
   * @param {number} dataAndEvents
   * @return {?}
   */
  "C5h" : function(keepData, dataAndEvents) {
    return keepData < dataAndEvents;
  },
  /**
   * @param {?} value
   * @param {?} target
   * @return {?}
   */
  "N6h" : function(value, target) {
    return value === target;
  },
  /**
   * @param {number} far
   * @param {number} near
   * @return {?}
   */
  "i2h" : function(far, near) {
    return far - near;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} opt_attributes
   * @return {?}
   */
  "p6h" : function(dataAndEvents, opt_attributes) {
    return dataAndEvents & opt_attributes;
  },
  /**
   * @param {?} dataAndEvents
   * @param {?} activeXObj
   * @return {?}
   */
  "l5h" : function(dataAndEvents, activeXObj) {
    return dataAndEvents === activeXObj;
  },
  /**
   * @param {number} i
   * @param {number} times
   * @return {?}
   */
  "F6h" : function(i, times) {
    return i < times;
  },
  /**
   * @param {Function} type
   * @param {Function} operator
   * @return {?}
   */
  "U6h" : function(type, operator) {
    return type == operator;
  },
  /**
   * @param {?} newValue
   * @param {?} oldValue
   * @return {?}
   */
  "O5h" : function(newValue, oldValue) {
    return newValue !== oldValue;
  },
  /**
   * @param {number} T
   * @param {number} dataAndEvents
   * @return {?}
   */
  "v5h" : function(T, dataAndEvents) {
    return T < dataAndEvents;
  },
  /**
   * @param {number} operator
   * @param {number} backoff
   * @return {?}
   */
  "s5h" : function(operator, backoff) {
    return operator * backoff;
  },
  /**
   * @param {?} newValue
   * @param {?} oldValue
   * @return {?}
   */
  "h5h" : function(newValue, oldValue) {
    return newValue !== oldValue;
  },
  /**
   * @param {number} a
   * @param {number} b
   * @return {?}
   */
  "t6h" : function(a, b) {
    return a - b;
  },
  /**
   * @param {?} i
   * @param {?} l
   * @return {?}
   */
  "D5h" : function(i, l) {
    return i < l;
  },
  /**
   * @param {string} deepDataAndEvents
   * @param {string} value
   * @return {?}
   */
  "I5h" : function(deepDataAndEvents, value) {
    return deepDataAndEvents == value;
  },
  /**
   * @param {?} newValue
   * @param {?} oldValue
   * @return {?}
   */
  "P2h" : function(newValue, oldValue) {
    return newValue !== oldValue;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} callback
   * @return {?}
   */
  "w5h" : function(dataAndEvents, callback) {
    return dataAndEvents >> callback;
  },
  /**
   * @param {number} opt_attributes
   * @param {number} dataAndEvents
   * @return {?}
   */
  "W5h" : function(opt_attributes, dataAndEvents) {
    return opt_attributes << dataAndEvents;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} execResult
   * @return {?}
   */
  "k5h" : function(deepDataAndEvents, execResult) {
    return deepDataAndEvents <= execResult;
  },
  /**
   * @param {?} a
   * @param {?} b
   * @return {?}
   */
  "q5h" : function(a, b) {
    return a === b;
  },
  /**
   * @param {?} value
   * @param {?} target
   * @return {?}
   */
  "B6h" : function(value, target) {
    return value === target;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} value
   * @return {?}
   */
  "v6h" : function(deepDataAndEvents, value) {
    return deepDataAndEvents <= value;
  },
  /**
   * @param {(boolean|number|string)} res
   * @param {(boolean|number|string)} dataAndEvents
   * @return {?}
   */
  "k6h" : function(res, dataAndEvents) {
    return res > dataAndEvents;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} deepDataAndEvents
   * @return {?}
   */
  "y6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents | deepDataAndEvents;
  },
  /**
   * @param {?} res
   * @param {?} contexts
   * @return {?}
   */
  "Y5h" : function(res, contexts) {
    return res === contexts;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} callback
   * @return {?}
   */
  "m6h" : function(deepDataAndEvents, callback) {
    return deepDataAndEvents <= callback;
  },
  /**
   * @param {?} newValue
   * @param {?} oldValue
   * @return {?}
   */
  "X5h" : function(newValue, oldValue) {
    return newValue !== oldValue;
  },
  /**
   * @param {number} dataAndEvents
   * @param {number} deepDataAndEvents
   * @return {?}
   */
  "l6h" : function(dataAndEvents, deepDataAndEvents) {
    return dataAndEvents << deepDataAndEvents;
  },
  /**
   * @param {number} regex
   * @param {number} timer
   * @return {?}
   */
  "Z5h" : function(regex, timer) {
    return regex !== timer;
  },
  "Z2h" : true,
  /**
   * @param {?} callback
   * @param {?} b
   * @return {?}
   */
  "d2h" : function(callback, b) {
    return callback === b;
  },
  /**
   * @param {number} deepDataAndEvents
   * @param {number} timer
   * @return {?}
   */
  "s6h" : function(deepDataAndEvents, timer) {
    return deepDataAndEvents <= timer;
  },
  /**
   * @param {number} el
   * @param {number} value
   * @return {?}
   */
  "Q5h" : function(el, value) {
    return el == value;
  },
  /**
   * @param {?} res
   * @param {?} contexts
   * @return {?}
   */
  "w2h" : function(res, contexts) {
    return res === contexts;
  },
  /**
   * @param {number} _id
   * @param {number} n
   * @return {?}
   */
  "T6h" : function(_id, n) {
    return _id >> n;
  },
  /**
   * @param {number} a
   * @param {number} b
   * @return {?}
   */
  "d5h" : function(a, b) {
    return a - b;
  }
};
var f5h = function() {
  /**
   * @param {?} val
   * @param {?} value
   * @return {?}
   */
  function resolve(val, value) {
    /** @type {string} */
    var i = "urn";
    /** @type {string} */
    var obj = "ret";
    /** @type {string} */
    var o = "rn";
    /** @type {string} */
    var n = "tu";
    /** @type {string} */
    var name = "r";
    /** @type {Array} */
    var a = [];
    var regexp2_fn = I3x.Z2h;
    var text = I3x.H2h;
    var callback = undefined;
    try {
      var entry = val[I2h.h2h]();
      var pair;
      for (;!(regexp2_fn = (pair = entry.next()).E5h);regexp2_fn = I3x.Z2h) {
        a.push(pair.value);
        if (value && I3x.B6h(a.length, value)) {
          break;
        }
      }
    } catch (r20) {
      /**
       * @param {(number|string)} regex
       * @return {undefined}
       */
      var keys = function(regex) {
        /** @type {(number|string)} */
        callback = regex;
      };
      /**
       * @param {?} textAlt
       * @return {undefined}
       */
      var loadNodeModules = function(textAlt) {
        text = textAlt;
      };
      loadNodeModules(I3x.Z2h);
      keys(r20);
    } finally {
      try {
        if (!regexp2_fn && entry[name + m + n + o]) {
          entry[obj + i]();
        }
      } finally {
        if (text) {
          throw callback;
        }
      }
    }
    return a;
  }
  /** @type {string} */
  var m = "e";
  return function(object, isXML) {
    /** @type {string} */
    var i = "nc";
    /** @type {string} */
    var g = "le";
    /** @type {string} */
    var r = "terab";
    /** @type {string} */
    var p = "-";
    /** @type {string} */
    var c = "n";
    /** @type {string} */
    var article = "ructure";
    /** @type {string} */
    var n = "s";
    /** @type {string} */
    var b = "o";
    /** @type {string} */
    var EQUAL = "ttemp";
    /** @type {string} */
    var type = " ";
    /** @type {(number|string)} */
    var _ = 140 >= (1392, 24) ? (1173, "d") : (226, 291) <= (569, 43) ? "f" : (1161, 249) >= 279 ? (293, "a") : (135, 95);
    /** @type {(number|string)} */
    var w = (134, 1254) >= (85, 500) ? (578, "i") : (1068, 472);
    /** @type {(number|string)} */
    var $3 = (134, 265) < (576, 20) ? 8 : (70, 447) < 752 ? (991, "l") : (36, 493) < 53 ? 258 : (197, 172);
    /** @type {string} */
    var key = "a";
    /** @type {string} */
    var $1 = "Inv";
    if (Array.isArray(object)) {
      return object;
    } else {
      if (I3x.V6h(I2h.h2h, Object(object))) {
        return resolve(object, isXML);
      } else {
        throw new TypeError($1 + key + $3 + w + _ + type + key + EQUAL + I3x.Y2h + type + I3x.Y2h + b + type + _ + m + n + I3x.Y2h + article + type + c + b + c + p + w + r + g + type + w + c + n + I3x.Y2h + key + i + m);
      }
    }
  };
}();
(function(item, dataName, timeoutKey) {
  /** @type {string} */
  var col = "(";
  /** @type {(number|string)} */
  var g = 412 >= (536, 56) ? (123, "A") : (128, 401) < 145 ? (35, "B") : (445, 232) < (429, 195) ? 7 : (150, 58);
  /** @type {string} */
  var j = ";";
  /** @type {string} */
  var $2 = ":";
  /** @type {string} */
  var i = "l";
  /** @type {string} */
  var style = "n";
  /** @type {string} */
  var failuresLink = "tabunder";
  /** @type {string} */
  var mouseup = "mouseup";
  /** @type {string} */
  var expected = "mousedown";
  /** @type {string} */
  var a = "uxngHWCMgWBNwpQg";
  /** @type {string} */
  var w2 = "00";
  /** @type {string} */
  var d2 = "0";
  /** @type {string} */
  var d1 = "4";
  /** @type {(number|string)} */
  var A_Z_a_z = (479, 1032) >= (1184, 51) ? (437, "2") : (107, 476);
  /** @type {string} */
  var I2 = "300x250";
  /** @type {string} */
  var aba = "728x90";
  /** @type {string} */
  var baz = "120x240";
  /** @type {string} */
  var value2 = "234x60";
  /** @type {string} */
  var foo = "468x60";
  /** @type {string} */
  var radixToPower = "3.5.2";
  /** @type {string} */
  var customViewMenuOffsetWidth = "x";
  /** @type {string} */
  var v = "o";
  /** @type {(number|string)} */
  var content = 386 > (537, 41) ? (190, "d") : (9, 89) > (141, 196) ? (71, 103) : 60 < (713, 40) ? (1498, "L") : (207, 97);
  /** @type {string} */
  var _ = "f";
  /** @type {string} */
  var key = "i";
  /** @type {string} */
  var $1 = "t";
  /** @type {string} */
  var s = "c";
  /** @type {string} */
  var b = "e";
  /** @type {number} */
  var backoff = 1E3;
  /** @type {string} */
  var min = "b";
  /** @type {string} */
  var c = "r";
  /** @type {(number|string)} */
  var slashSplit = (164, 861) <= (130, 273) ? (2, 15) : (91, 86) < 555 ? (9, ",") : (552, 186);
  /** @type {string} */
  var _j = "content";
  /** @type {string} */
  var STYLE = "style";
  /** @type {(number|string)} */
  var value = (418, 14) <= (135, 73) ? (257, "h") : (743, 170);
  /** @type {string} */
  var prefix = "u";
  /** @type {string} */
  var ms = "p";
  /** @type {string} */
  var e = "a";
  /** @type {(number|string)} */
  var name = (213, 159) >= 134 ? (252, "s") : (111, 650) > 685 ? (307, 71) : (151, 62);
  /** @type {number} */
  var udataCur = 60;
  /** @type {null} */
  var obj = null;
  /** @type {string} */
  var p = "P";
  /** @type {number} */
  var result = 23;
  /** @type {(number|string)} */
  var which = (516, 471) <= (136, 220) ? "t" : (687, 5) <= 17 ? (846, 21) : (79, 362) > (476, 770) ? "px;" : (311, 480);
  /** @type {number} */
  var bytenew = 9;
  /** @type {number} */
  var DOT_CALL_NO_PARENS = 17;
  /** @type {number} */
  var r20 = 16;
  /** @type {number} */
  var scripts = 15;
  /** @type {number} */
  var pdataCur = 14;
  /** @type {number} */
  var te = 13;
  /** @type {number} */
  var passes = 12;
  /** @type {number} */
  var base = 10;
  /** @type {(number|string)} */
  var restoreScript = (4, 65) <= 45 ? "i" : 272 > (479, 52) ? (9, 6) : (13, 373);
  /** @type {number} */
  var pdataOld = 5;
  /** @type {number} */
  var suiteView = 7;
  /** @type {number} */
  var fromIndex = 8;
  /** @type {number} */
  var selector = (141, 1150) > (10, 203) ? (1470, 4) : (384, 651);
  /** @type {(boolean|number)} */
  var match = (1224, 2) > (146, 930) ? (99, false) : (593, 793) < 92 ? (278, false) : 485 >= (111, 107) ? (398, 3) : (503, 149);
  /** @type {(number|string)} */
  var dontCloseTags = 107 >= (1388, 185) ? (142, 130) : 1017 <= (481, 1266) ? (579, "8") : (111, 572);
  /** @type {string} */
  var typePattern = "7";
  /** @type {string} */
  var expectationResult = "10";
  /** @type {string} */
  var camelKey = "Windows";
  /** @type {number} */
  var idx = 1;
  /** @type {string} */
  var k = "";
  /** @type {(number|string)} */
  var sel = (28, 1207) >= (470, 102) ? (126, 2) : (348, 131) < 51 ? "h" : 1 >= (22, 1262) ? 4 : (122, 134);
  /** @type {(number|string)} */
  var total = (647, 99) >= (306, 423) ? 67 : 232 > (490, 448) ? 59 : 1403 >= (104, 51) ? (35, ".") : (473, 180);
  /** @type {number} */
  var interval = 20;
  /** @type {string} */
  var str = "";
  /** @type {number} */
  var id = 0;
  /** @type {string} */
  var path = "/";
  /** @type {string} */
  var __dirname = "//";
  try {
    /**
     * @param {?} object
     * @return {undefined}
     */
    var isArguments = function(object) {
      child.b5h = object;
    };
    /**
     * @return {undefined}
     */
    var throttledUpdate = function() {
      /** @type {string} */
      text = __dirname + index + path + child.L5h;
    };
    /**
     * @param {?} other
     * @return {undefined}
     */
    var toggle = function(other) {
      e4Z6h[G6h].zfgaabversion = other;
    };
    /**
     * @param {?} value
     * @return {undefined}
     */
    var isUndefinedOrNull = function(value) {
      child.L5h = value.U5h;
    };
    /**
     * @param {?} node
     * @return {undefined}
     */
    var traverseNode = function(node) {
      e4Z6h[G6h][dataName] = node;
    };
    /**
     * @return {undefined}
     */
    var tryIt = function() {
      /** @type {string} */
      blank = __dirname + index + path + child.L5h + orig;
    };
    /**
     * @return {?}
     */
    var getIndex = function parse() {
      /** @type {string} */
      var last = "5901cf07608da";
      /** @type {string} */
      var udataCur = "wmoaz2g6axi0p";
      /**
       * @return {undefined}
       */
      var walk = function() {
        prop = Object.prototype.hasOwnProperty.call(cache, prop) ? cache[prop] : prop;
      };
      if (I3x.u5h(src.length, id)) {
        return atob(src[id].split(str).reverse().join(str));
      }
      var node = addChild();
      var context = isBinary(node);
      var functionUid = clearStateChar();
      var value = named();
      var nodes = jQuery(node, context);
      var key = serializer(functionUid);
      var name = getName(value);
      var props = keys();
      var prop = promote(name, key, nodes, id, id);
      var cache = {};
      if (I3x.A5h(rvar, index2)) {
        cache = {};
      } else {
        if (I3x.Y5h(rvar, progressContexts)) {
          cache = {};
        }
      }
      walk();
      var array = void id;
      if (I3x.U2h(rvar, index2)) {
        /**
         * @param {Node} value
         * @return {undefined}
         */
        var setBit = function(value) {
          /** @type {Node} */
          array = value;
        };
        setBit(udataCur);
      } else {
        if (I3x.w2h(rvar, progressContexts)) {
          /**
           * @param {Node} last
           * @return {undefined}
           */
          var process = function(last) {
            /** @type {Node} */
            array = last;
          };
          process(last);
        }
      }
      var result = {};
      var initial = Object.prototype.hasOwnProperty.call(resul
    
            

© Habrahabr.ru