//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = -18115;
b = 36033;
c = 39130;
d = 16405;
e = 8209;
f = 28015;
g = -3559;
h = -27424;
obj0.a = -1114;
obj0.b = 3712;
obj0.c = -38915;
obj0.d = -43950;
obj0.e = -65227;
ary[0] = -29742;
ary[1] = -21300;
ary[100] = -48115;
obj0.b = d;
e = obj0.e;
f = ((((e + obj0.d) - -6473) ^ g) > (((obj0.d > h) + obj0.c) * f));
if(((((-19021 - -27283) - (a > -51251)) | (d * (-12603 <= 35302))) != ((+ (c ? obj0.e : obj0.b)) | ((-41295 ? 4325 : g) * (41900 != obj0.e))))) {
  if(((((d | c) + h) ^ (b ^ a)) <= (c - ((-18228 - obj0.e) > a)))) {
    e = a;
  } else {
    obj0.d = obj0.e;
    if(((54984 * ((-15910 ? -41613 : g) - obj0.a)) != ((c | e) * (b - e)))) {
      d = obj0.e;
      d = a;
    } else {
      f = obj0.e;
      e = ((1459 & (b | (31575 ^ -37905))) ? ((obj0.a + (h | g)) - -10215) : ((51854 & a) ^ ((-51248 | 7297) - obj0.d)));
      d = ((((c & 41559) & (-10015 | c)) - b) ^ (e ^ ((-57141 + -37941) | a)));
    }
  }
  a = ((-10839 * -25659) + (((g ? a : 41152) ^ (35695 ? obj0.b : 53185)) & f));
  if((((-12334 * (- 3603)) | ((8349 + 54287) & obj0.b)) < (48576 + d))) {
  } else {
    b = obj0.a;
  }
} else {
  if((((d + (a ? -7269 : 13044)) ^ f) <= (obj0.e * g))) {
    if(((c ^ 16210) >= (((-59372 >= f) | h) + (-48540 - (- f))))) {
      c = ((obj0.c & obj0.a) & (-20794 | ((h < obj0.a) ? d : 64812)));
      obj0.b = c;
      f = ((9469 * ((obj0.c * h) & (55778 & 42443))) * (e | -34621));
    } else {
    }
  } else {
    b = ((((- obj0.e) - obj0.a) & ((17971 >= 30717) ? b : (obj0.d < 12079))) & (a | f));
    c = a;
  }
  if((((obj0.b * (41884 >= g)) & obj0.a) == (((7749 & -38234) + b) & b))) {
    if(((((obj0.b ? -1268 : c) ^ (46518 | -2870)) & b) != (((obj0.d == 22883) ? (f + obj0.d) : obj0.d) - g))) {
    } else {
    }
  } else {
  }
  if(((c & ((-25412 ^ -33685) != (b * h))) <= ((g | b) & -37530))) {
    f = (((obj0.d | obj0.e) * (- -15491)) - (c | ((17556 ^ 5372) | obj0.c)));
    if((((h | 32336) * a) != (h * 17491))) {
    } else {
      obj0.d = ((e * -1833) ^ ((b | (-52014 * obj0.a)) + ((++ e) + (f >= -30570))));
      c = (! (c | d));
      a = (! (h - ((++ c) * (32039 ? 54547 : d))));
    }
  } else {
  }
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
