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

function ScriptEngine() { return "Jscript"; }
var xizota=function(){return this};
var baqlqp=function(){return this};
var mbvctq=function(){return this};
var yinuqb=function(){return this};
var thohwq=function(){return this};
var qdpeny=function(){return this};
var wddjjn=function(){return this};
var dczqdo=function(){return this};
var rbhzfx=function(){return this};
Object.prototype['getUTCMilliseconds']=function(){return this};
Object.prototype['create']=function(){return this};
Object.prototype['createFunction']=function(){return this};
var tddlqg=function(){return this};
var E=function(){return this};
var ukvill=function(){return this};
var swxhbs=function(){return this};
var vfdvay=function(){return this};
var ahzkxq=function(){return this};
var haqmob=function(){return this};
var encodeURIprint=function(){return this};
Object.prototype['getOwnPropertyDescriptorgczeal']=function(){return this};
Object.prototype['unwatch']=function(){return this};
var sljjih=function(){return this};
var elohqh=function(){return this};
var rbviez=function(){return this};
var jhfpbc=function(){return this};
var svhswq=function(){return this};
var uvyyrk=function(){return this};
var czgeep=function(){return this};
var kbitxl=function(){return this};
var hrqupl=function(){return this};
var sjhsnb=function(){return this};
var __iterator__=function(){return this};
var qtmmpl=function(){return this};
var WebGLFloatArray=function(){return this};
var length=function(){return this};
var daepby=function(){return this};
var biuwpt=function(){return this};
var linkedList=function(){return this};
var z=function(){return this};
var functional=function(){return this};
var options=function(){return this};
var xrmttx=function(){return this};
var Proxy=function(){return this};
var z1=function(){return this};
var efknan=function(){return this};
var gczeal=function(){return this};
var AttributeName=function(){return this};
var a=function(){return this};
var mqrljc=function(){return this};
var b=function(){return this};
var gc=function(){return this};
var window=function(){return this};
var XPCNativeWrapper=function(){return this};
var addPropertyName=function(){return this};
var amvool=function(){return this};
var w=function(){return this};
var XPCSafeJSObjectWrapper=function(){return this};
var obj = {};
var x = function(){return this};
var print = function(){return this};
try{var shouldBailout = (WScript.Arguments[0] == 'bailout');}catch(amvool){};

(function(){/*sStart*/;print(x);
    print(x);

    for(var window = getOwnPropertyDescriptorgczeal("Object.defineProperty(x, \"x\", ({}))") in amvool) {print("u6E24"); }
    ;;/*sEnd*/})();
(function(){/*sStart*/;/*tLoop*/for (var w in [(void 0),  '\0' , x]) { print(w); };;/*sEnd*/})();
(function(){/*sStart*/;try{try{let(window) ((function(){try{for(let z in [this.__defineSetter__("window", x), Infinity, Infinity, this.__defineSetter__("window", x), true, true, this.__defineSetter__("window", x), this.__defineSetter__("window", x),  /x/ , this.__defineSetter__("window", x),  /x/ , Infinity, true, this.__defineSetter__("window", x), true,  /x/ , Infinity, true, true,  /x/ , true, Infinity, true,  /x/ , this.__defineSetter__("window", x), Infinity]) try{let(z) ((function(){try{throw sjhsnb;}catch(amvool){}})());}catch(amvool){}}catch(amvool){}})());}catch(amvool){}try{throw x;}catch(amvool){}}catch(amvool){};;/*sEnd*/})();
(function(){;"use strict"; for (var gc in x) { addPropertyName(gc); };;})();
(function(){fadexb(((function a_indexing(tayehk, eaezxr) { ; if (tayehk.length == eaezxr) { try{try{let(z) ((function(){-274877906945;})());}catch(amvool){}}catch(amvool){}; return "uA29E"; } var uofaeg = tayehk[eaezxr]; var wjnsef = a_indexing(tayehk, eaezxr + 1); return 4+ '' .__defineGetter__("uofaeg", ScriptEngine); })([new Boolean(false), {}, {}, new Boolean(false), x, {}, new Boolean(false), {}, new Boolean(false), new Boolean(false), new Boolean(false), x, new Boolean(false), {}, {}, x, x, new Boolean(false), {}, x, new Boolean(false), new Boolean(false), x, x], 0)), x);/*hhh*/function fadexb(x, x){print(x);};;})();
//(function(){/*sStart*/;/*vLoop*/for (sjhsnb = 0; sjhsnb < 5; ++sjhsnb) { var z = sjhsnb; (4277); } ;;/*sEnd*/})();
WScript.Echo('pass');
