-- Generated by Haxe 4.0.5
local _hx_array_mt = {
	__newindex = function(t,k,v)
	  local len = t.length
	  t.length =  k >= len and (k + 1) or len
	  rawset(t,k,v)
	end
  }
  
  local function _hx_tab_array(tab,length)
	tab.length = length
	return setmetatable(tab, _hx_array_mt)
  end
  
  local function _hx_anon_newindex(t,k,v) t.__fields__[k] = true; rawset(t,k,v); end
  local _hx_anon_mt = {__newindex=_hx_anon_newindex}
  local function _hx_a(...)
	local __fields__ = {};
	local ret = {__fields__ = __fields__};
	local max = select('#',...);
	local tab = {...};
	local cur = 1;
	while cur < max do
	  local v = tab[cur];
	  __fields__[v] = true;
	  ret[v] = tab[cur+1];
	  cur = cur + 2
	end
	return setmetatable(ret, _hx_anon_mt)
  end
  
  local function _hx_e()
	return setmetatable({__fields__ = {}}, _hx_anon_mt)
  end
  
  local function _hx_o(obj)
	return setmetatable(obj, _hx_anon_mt)
  end
  
  local function _hx_new(prototype)
	return setmetatable({__fields__ = {}}, {__newindex=_hx_anon_newindex, __index=prototype})
  end
  
  local _hxClasses = {}
  local Int = _hx_e();
  local Dynamic = _hx_e();
  local Float = _hx_e();
  local Bool = _hx_e();
  local Class = _hx_e();
  local Enum = _hx_e();
  
  local Array = _hx_e()
  __lua_lib_luautf8_Utf8 = _G.require("lua-utf8")
  local Main = _hx_e()
  local Math = _hx_e()
  local String = _hx_e()
  local Std = _hx_e()
  __haxe_Log = _hx_e()
  __lua_Boot = _hx_e()
  
  local _hx_bind, _hx_bit, _hx_staticToInstance, _hx_funcToField, _hx_maxn, _hx_print, _hx_apply_self, _hx_box_mr, _hx_bit_clamp, _hx_table, _hx_bit_raw
  local _hx_pcall_default = {};
  local _hx_pcall_break = {};
  
  Array.new = function() 
	local self = _hx_new(Array.prototype)
	Array.super(self)
	return self
  end
  Array.super = function(self) 
	_hx_tab_array(self, 0);
  end
  Array.prototype = _hx_a();
  Array.prototype.concat = function(self,a) 
	local _g = _hx_tab_array({}, 0);
	local _g1 = 0;
	local _g2 = self;
	while (_g1 < _g2.length) do 
	  local i = _g2[_g1];
	  _g1 = _g1 + 1;
	  _g:push(i);
	end;
	local ret = _g;
	local _g3 = 0;
	while (_g3 < a.length) do 
	  local i1 = a[_g3];
	  _g3 = _g3 + 1;
	  ret:push(i1);
	end;
	do return ret end
  end
  Array.prototype.join = function(self,sep) 
	local tbl = ({});
	local _gthis = self;
	local cur_length = 0;
	local i = _hx_o({__fields__={hasNext=true,next=true},hasNext=function(self) 
	  do return cur_length < _gthis.length end;
	end,next=function(self) 
	  cur_length = cur_length + 1;
	  do return _gthis[cur_length - 1] end;
	end});
	while (i:hasNext()) do 
	  local i1 = i:next();
	  _G.table.insert(tbl, Std.string(i1));
	end;
	do return _G.table.concat(tbl, sep) end
  end
  Array.prototype.pop = function(self) 
	if (self.length == 0) then 
	  do return nil end;
	end;
	local ret = self[self.length - 1];
	self[self.length - 1] = nil;
	self.length = self.length - 1;
	do return ret end
  end
  Array.prototype.push = function(self,x) 
	self[self.length] = x;
	do return self.length end
  end
  Array.prototype.reverse = function(self) 
	local tmp;
	local i = 0;
	while (i < Std.int(self.length / 2)) do 
	  tmp = self[i];
	  self[i] = self[(self.length - i) - 1];
	  self[(self.length - i) - 1] = tmp;
	  i = i + 1;
	end;
  end
  Array.prototype.shift = function(self) 
	if (self.length == 0) then 
	  do return nil end;
	end;
	local ret = self[0];
	if (self.length == 1) then 
	  self[0] = nil;
	else
	  if (self.length > 1) then 
		self[0] = self[1];
		_G.table.remove(self, 1);
	  end;
	end;
	local tmp = self;
	tmp.length = tmp.length - 1;
	do return ret end
  end
  Array.prototype.slice = function(self,pos,_end) 
	if ((_end == nil) or (_end > self.length)) then 
	  _end = self.length;
	else
	  if (_end < 0) then 
		_end = _G.math.fmod((self.length - (_G.math.fmod(-_end, self.length))), self.length);
	  end;
	end;
	if (pos < 0) then 
	  pos = _G.math.fmod((self.length - (_G.math.fmod(-pos, self.length))), self.length);
	end;
	if ((pos > _end) or (pos > self.length)) then 
	  do return _hx_tab_array({}, 0) end;
	end;
	local ret = _hx_tab_array({}, 0);
	local _g = pos;
	local _g1 = _end;
	while (_g < _g1) do 
	  _g = _g + 1;
	  local i = _g - 1;
	  ret:push(self[i]);
	end;
	do return ret end
  end
  Array.prototype.sort = function(self,f) 
	local i = 0;
	local l = self.length;
	while (i < l) do 
	  local swap = false;
	  local j = 0;
	  local max = (l - i) - 1;
	  while (j < max) do 
		if (f(self[j], self[j + 1]) > 0) then 
		  local tmp = self[j + 1];
		  self[j + 1] = self[j];
		  self[j] = tmp;
		  swap = true;
		end;
		j = j + 1;
	  end;
	  if (not swap) then 
		break;
	  end;
	  i = i + 1;
	end;
  end
  Array.prototype.splice = function(self,pos,len) 
	if ((len < 0) or (pos > self.length)) then 
	  do return _hx_tab_array({}, 0) end;
	else
	  if (pos < 0) then 
		pos = self.length - (_G.math.fmod(-pos, self.length));
	  end;
	end;
	len = Math.min(len, self.length - pos);
	local ret = _hx_tab_array({}, 0);
	local _g = pos;
	local _g1 = pos + len;
	while (_g < _g1) do 
	  _g = _g + 1;
	  local i = _g - 1;
	  ret:push(self[i]);
	  self[i] = self[i + len];
	end;
	local _g2 = pos + len;
	local _g3 = self.length;
	while (_g2 < _g3) do 
	  _g2 = _g2 + 1;
	  local i1 = _g2 - 1;
	  self[i1] = self[i1 + len];
	end;
	local tmp = self;
	tmp.length = tmp.length - len;
	do return ret end
  end
  Array.prototype.toString = function(self) 
	local tbl = ({});
	_G.table.insert(tbl, "[");
	_G.table.insert(tbl, self:join(","));
	_G.table.insert(tbl, "]");
	do return _G.table.concat(tbl, "") end
  end
  Array.prototype.unshift = function(self,x) 
	local len = self.length;
	local _g = 0;
	local _g1 = len;
	while (_g < _g1) do 
	  _g = _g + 1;
	  local i = _g - 1;
	  self[len - i] = self[(len - i) - 1];
	end;
	self[0] = x;
  end
  Array.prototype.insert = function(self,pos,x) 
	if (pos > self.length) then 
	  pos = self.length;
	end;
	if (pos < 0) then 
	  pos = self.length + pos;
	  if (pos < 0) then 
		pos = 0;
	  end;
	end;
	local cur_len = self.length;
	while (cur_len > pos) do 
	  self[cur_len] = self[cur_len - 1];
	  cur_len = cur_len - 1;
	end;
	self[pos] = x;
  end
  Array.prototype.remove = function(self,x) 
	local _g = 0;
	local _g1 = self.length;
	while (_g < _g1) do 
	  _g = _g + 1;
	  local i = _g - 1;
	  if (self[i] == x) then 
		local _g2 = i;
		local _g11 = self.length - 1;
		while (_g2 < _g11) do 
		  _g2 = _g2 + 1;
		  local j = _g2 - 1;
		  self[j] = self[j + 1];
		end;
		self[self.length - 1] = nil;
		self.length = self.length - 1;
		do return true end;
	  end;
	end;
	do return false end
  end
  Array.prototype.indexOf = function(self,x,fromIndex) 
	local _end = self.length;
	if (fromIndex == nil) then 
	  fromIndex = 0;
	else
	  if (fromIndex < 0) then 
		fromIndex = self.length + fromIndex;
		if (fromIndex < 0) then 
		  fromIndex = 0;
		end;
	  end;
	end;
	local _g = fromIndex;
	local _g1 = _end;
	while (_g < _g1) do 
	  _g = _g + 1;
	  local i = _g - 1;
	  if (x == self[i]) then 
		do return i end;
	  end;
	end;
	do return -1 end
  end
  Array.prototype.lastIndexOf = function(self,x,fromIndex) 
	if ((fromIndex == nil) or (fromIndex >= self.length)) then 
	  fromIndex = self.length - 1;
	else
	  if (fromIndex < 0) then 
		fromIndex = self.length + fromIndex;
		if (fromIndex < 0) then 
		  do return -1 end;
		end;
	  end;
	end;
	local i = fromIndex;
	while (i >= 0) do 
	  if (self[i] == x) then 
		do return i end;
	  else
		i = i - 1;
	  end;
	end;
	do return -1 end
  end
  Array.prototype.copy = function(self) 
	local _g = _hx_tab_array({}, 0);
	local _g1 = 0;
	local _g2 = self;
	while (_g1 < _g2.length) do 
	  local i = _g2[_g1];
	  _g1 = _g1 + 1;
	  _g:push(i);
	end;
	do return _g end
  end
  Array.prototype.map = function(self,f) 
	local _g = _hx_tab_array({}, 0);
	local _g1 = 0;
	local _g2 = self;
	while (_g1 < _g2.length) do 
	  local i = _g2[_g1];
	  _g1 = _g1 + 1;
	  _g:push(f(i));
	end;
	do return _g end
  end
  Array.prototype.filter = function(self,f) 
	local _g = _hx_tab_array({}, 0);
	local _g1 = 0;
	local _g2 = self;
	while (_g1 < _g2.length) do 
	  local i = _g2[_g1];
	  _g1 = _g1 + 1;
	  if (f(i)) then 
		_g:push(i);
	  end;
	end;
	do return _g end
  end
  Array.prototype.iterator = function(self) 
	local _gthis = self;
	local cur_length = 0;
	do return _hx_o({__fields__={hasNext=true,next=true},hasNext=function(self) 
	  do return cur_length < _gthis.length end;
	end,next=function(self) 
	  cur_length = cur_length + 1;
	  do return _gthis[cur_length - 1] end;
	end}) end
  end
  Array.prototype.resize = function(self,len) 
	if (self.length < len) then 
	  self.length = len;
	else
	  if (self.length > len) then 
		local _g = len;
		local _g1 = self.length;
		while (_g < _g1) do 
		  _g = _g + 1;
		  local i = _g - 1;
		  self[i] = nil;
		end;
		self.length = len;
	  end;
	end;
  end
  
  Main.new = {}
  Main.main = function() 
	__haxe_Log.trace("Hello World", _hx_o({__fields__={fileName=true,lineNumber=true,className=true,methodName=true},fileName="source/Main.hx",lineNumber=3,className="Main",methodName="main"}));
  end
  
  Math.new = {}
  Math.isNaN = function(f) 
	do return f ~= f end;
  end
  Math.isFinite = function(f) 
	if (f > -_G.math.huge) then 
	  do return f < _G.math.huge end;
	else
	  do return false end;
	end;
  end
  Math.min = function(a,b) 
	if (Math.isNaN(a) or Math.isNaN(b)) then 
	  do return (0/0) end;
	else
	  do return _G.math.min(a, b) end;
	end;
  end
  
  String.new = function(string) 
	local self = _hx_new(String.prototype)
	String.super(self,string)
	self = string
	return self
  end
  String.super = function(self,string) 
  end
  String.__index = function(s,k) 
	if (k == "length") then 
	  do return __lua_lib_luautf8_Utf8.len(s) end;
	else
	  local o = String.prototype;
	  local field = k;
	  if ((function() 
		local _hx_1
		if ((_G.type(o) == "string") and ((String.prototype[field] ~= nil) or (field == "length"))) then 
		_hx_1 = true; elseif (o.__fields__ ~= nil) then 
		_hx_1 = o.__fields__[field] ~= nil; else 
		_hx_1 = o[field] ~= nil; end
		return _hx_1
	  end )()) then 
		do return String.prototype[k] end;
	  else
		if (String.__oldindex ~= nil) then 
		  if (_G.type(String.__oldindex) == "function") then 
			do return String.__oldindex(s, k) end;
		  else
			if (_G.type(String.__oldindex) == "table") then 
			  do return String.__oldindex[k] end;
			end;
		  end;
		  do return nil end;
		else
		  do return nil end;
		end;
	  end;
	end;
  end
  String.fromCharCode = function(code) 
	do return __lua_lib_luautf8_Utf8.char(code) end;
  end
  String.prototype = _hx_a();
  String.prototype.toUpperCase = function(self) 
	do return __lua_lib_luautf8_Utf8.upper(self) end
  end
  String.prototype.toLowerCase = function(self) 
	do return __lua_lib_luautf8_Utf8.lower(self) end
  end
  String.prototype.indexOf = function(self,str,startIndex) 
	if (startIndex == nil) then 
	  startIndex = 1;
	else
	  startIndex = startIndex + 1;
	end;
	local r = __lua_lib_luautf8_Utf8.find(self, str, startIndex, true);
	if ((r ~= nil) and (r > 0)) then 
	  do return r - 1 end;
	else
	  do return -1 end;
	end;
  end
  String.prototype.lastIndexOf = function(self,str,startIndex) 
	local i = 0;
	local ret = -1;
	if (startIndex == nil) then 
	  startIndex = __lua_lib_luautf8_Utf8.len(self);
	end;
	while (true) do 
	  local startIndex1 = ret + 1;
	  if (startIndex1 == nil) then 
		startIndex1 = 1;
	  else
		startIndex1 = startIndex1 + 1;
	  end;
	  local r = __lua_lib_luautf8_Utf8.find(self, str, startIndex1, true);
	  local p = (function() 
		local _hx_1
		if ((r ~= nil) and (r > 0)) then 
		_hx_1 = r - 1; else 
		_hx_1 = -1; end
		return _hx_1
	  end )();
	  if ((p == -1) or (p > startIndex)) then 
		break;
	  end;
	  ret = p;
	end;
	do return ret end
  end
  String.prototype.split = function(self,delimiter) 
	local idx = 1;
	local ret = _hx_tab_array({}, 0);
	local delim_offset = (function() 
	  local _hx_1
	  if (__lua_lib_luautf8_Utf8.len(delimiter) > 0) then 
	  _hx_1 = __lua_lib_luautf8_Utf8.len(delimiter); else 
	  _hx_1 = 1; end
	  return _hx_1
	end )();
	while (idx ~= nil) do 
	  local newidx = 0;
	  if (__lua_lib_luautf8_Utf8.len(delimiter) > 0) then 
		newidx = __lua_lib_luautf8_Utf8.find(self, delimiter, idx, true);
	  else
		if (idx >= __lua_lib_luautf8_Utf8.len(self)) then 
		  newidx = nil;
		else
		  newidx = idx + 1;
		end;
	  end;
	  if (newidx ~= nil) then 
		local match = __lua_lib_luautf8_Utf8.sub(self, idx, newidx - 1);
		ret:push(match);
		idx = newidx + __lua_lib_luautf8_Utf8.len(delimiter);
	  else
		ret:push(__lua_lib_luautf8_Utf8.sub(self, idx, __lua_lib_luautf8_Utf8.len(self)));
		idx = nil;
	  end;
	end;
	do return ret end
  end
  String.prototype.toString = function(self) 
	do return self end
  end
  String.prototype.substring = function(self,startIndex,endIndex) 
	if (endIndex == nil) then 
	  endIndex = __lua_lib_luautf8_Utf8.len(self);
	end;
	if (endIndex < 0) then 
	  endIndex = 0;
	end;
	if (startIndex < 0) then 
	  startIndex = 0;
	end;
	if (endIndex < startIndex) then 
	  do return __lua_lib_luautf8_Utf8.sub(self, endIndex + 1, startIndex) end;
	else
	  do return __lua_lib_luautf8_Utf8.sub(self, startIndex + 1, endIndex) end;
	end;
  end
  String.prototype.charAt = function(self,index) 
	do return __lua_lib_luautf8_Utf8.sub(self, index + 1, index + 1) end
  end
  String.prototype.charCodeAt = function(self,index) 
	do return __lua_lib_luautf8_Utf8.byte(self, index + 1) end
  end
  String.prototype.substr = function(self,pos,len) 
	if ((len == nil) or (len > (pos + __lua_lib_luautf8_Utf8.len(self)))) then 
	  len = __lua_lib_luautf8_Utf8.len(self);
	else
	  if (len < 0) then 
		len = __lua_lib_luautf8_Utf8.len(self) + len;
	  end;
	end;
	if (pos < 0) then 
	  pos = __lua_lib_luautf8_Utf8.len(self) + pos;
	end;
	if (pos < 0) then 
	  pos = 0;
	end;
	do return __lua_lib_luautf8_Utf8.sub(self, pos + 1, pos + len) end
  end
  
  Std.new = {}
  Std.string = function(s) 
	do return __lua_Boot.__string_rec(s) end;
  end
  Std.int = function(x) 
	if (not Math.isFinite(x) or Math.isNaN(x)) then 
	  do return 0 end;
	else
	  do return _hx_bit_clamp(x) end;
	end;
  end
  
  __haxe_Log.new = {}
  __haxe_Log.formatOutput = function(v,infos) 
	local str = Std.string(v);
	if (infos == nil) then 
	  do return str end;
	end;
	local pstr = Std.string(Std.string(infos.fileName) .. Std.string(":")) .. Std.string(infos.lineNumber);
	if (infos.customParams ~= nil) then 
	  local _g = 0;
	  local _g1 = infos.customParams;
	  while (_g < _g1.length) do 
		local v1 = _g1[_g];
		_g = _g + 1;
		str = Std.string(str) .. Std.string((Std.string(", ") .. Std.string(Std.string(v1))));
	  end;
	end;
	do return Std.string(Std.string(pstr) .. Std.string(": ")) .. Std.string(str) end;
  end
  __haxe_Log.trace = function(v,infos) 
	local str = __haxe_Log.formatOutput(v, infos);
	_hx_print(str);
  end
  
  __lua_Boot.new = {}
  __lua_Boot.isArray = function(o) 
	if (_G.type(o) == "table") then 
	  if ((o.__enum__ == nil) and (_G.getmetatable(o) ~= nil)) then 
		do return _G.getmetatable(o).__index == Array.prototype end;
	  else
		do return false end;
	  end;
	else
	  do return false end;
	end;
  end
  __lua_Boot.printEnum = function(o,s) 
	if (o.length == 2) then 
	  do return o[0] end;
	else
	  local str = Std.string(Std.string(o[0])) .. Std.string("(");
	  s = Std.string(s) .. Std.string("\t");
	  local _g = 2;
	  local _g1 = o.length;
	  while (_g < _g1) do 
		_g = _g + 1;
		local i = _g - 1;
		if (i ~= 2) then 
		  str = Std.string(str) .. Std.string((Std.string(",") .. Std.string(__lua_Boot.__string_rec(o[i], s))));
		else
		  str = Std.string(str) .. Std.string(__lua_Boot.__string_rec(o[i], s));
		end;
	  end;
	  do return Std.string(str) .. Std.string(")") end;
	end;
  end
  __lua_Boot.printClassRec = function(c,result,s) 
	if (result == nil) then 
	  result = "";
	end;
	local f = __lua_Boot.__string_rec;
	for k,v in pairs(c) do if result ~= '' then result = result .. ', ' end result = result .. k .. ':' .. f(v, s.. '	') end;
	do return result end;
  end
  __lua_Boot.__string_rec = function(o,s) 
	if (s == nil) then 
	  s = "";
	end;
	if (__lua_lib_luautf8_Utf8.len(s) >= 5) then 
	  do return "<...>" end;
	end;
	local _g = type(o);
	if (_g) == "boolean" then 
	  do return tostring(o) end;
	elseif (_g) == "function" then 
	  do return "<function>" end;
	elseif (_g) == "nil" then 
	  do return "null" end;
	elseif (_g) == "number" then 
	  if (o == _G.math.huge) then 
		do return "Infinity" end;
	  else
		if (o == -_G.math.huge) then 
		  do return "-Infinity" end;
		else
		  if (o == 0) then 
			do return "0" end;
		  else
			if (o ~= o) then 
			  do return "NaN" end;
			else
			  do return tostring(o) end;
			end;
		  end;
		end;
	  end;
	elseif (_g) == "string" then 
	  do return o end;
	elseif (_g) == "table" then 
	  if (o.__enum__ ~= nil) then 
		do return __lua_Boot.printEnum(o, s) end;
	  else
		if ((_hx_wrap_if_string_field(o,'toString') ~= nil) and not __lua_Boot.isArray(o)) then 
		  do return _hx_wrap_if_string_field(o,'toString')(o) end;
		else
		  if (__lua_Boot.isArray(o)) then 
			local o2 = o;
			if (__lua_lib_luautf8_Utf8.len(s) > 5) then 
			  do return "[...]" end;
			else
			  local _g1 = _hx_tab_array({}, 0);
			  local _g11 = 0;
			  while (_g11 < o2.length) do 
				local i = o2[_g11];
				_g11 = _g11 + 1;
				_g1:push(__lua_Boot.__string_rec(i, Std.string(s) .. Std.string(1)));
			  end;
			  do return Std.string(Std.string("[") .. Std.string(_g1:join(","))) .. Std.string("]") end;
			end;
		  else
			if (o.__class__ ~= nil) then 
			  do return Std.string(Std.string("{") .. Std.string(__lua_Boot.printClassRec(o, "", Std.string(s) .. Std.string("\t")))) .. Std.string("}") end;
			else
			  local fields = __lua_Boot.fieldIterator(o);
			  local buffer = ({});
			  local first = true;
			  _G.table.insert(buffer, "{ ");
			  local f = fields;
			  while (f:hasNext()) do 
				local f1 = f:next();
				if (first) then 
				  first = false;
				else
				  _G.table.insert(buffer, ", ");
				end;
				_G.table.insert(buffer, Std.string(Std.string(Std.string("") .. Std.string(Std.string(f1))) .. Std.string(" : ")) .. Std.string(__lua_Boot.__string_rec(o[f1], Std.string(s) .. Std.string("\t"))));
			  end;
			  _G.table.insert(buffer, " }");
			  do return _G.table.concat(buffer, "") end;
			end;
		  end;
		end;
	  end;
	elseif (_g) == "thread" then 
	  do return "<thread>" end;
	elseif (_g) == "userdata" then 
	  local mt = _G.getmetatable(o);
	  if ((mt ~= nil) and (mt.__tostring ~= nil)) then 
		do return _G.tostring(o) end;
	  else
		do return "<userdata>" end;
	  end;else
	_G.error("Unknown Lua type",0); end;
  end
  __lua_Boot.fieldIterator = function(o) 
	if (_G.type(o) ~= "table") then 
	  do return _hx_o({__fields__={next=true,hasNext=true},next=function(self) 
		do return nil end;
	  end,hasNext=function(self) 
		do return false end;
	  end}) end;
	end;
	local tbl = (function() 
	  local _hx_1
	  if (o.__fields__ ~= nil) then 
	  _hx_1 = o.__fields__; else 
	  _hx_1 = o; end
	  return _hx_1
	end )();
	local cur = _G.pairs(tbl);
	local next_valid = function(tbl1,val) 
	  while (__lua_Boot.hiddenFields[val] ~= nil) do 
		val = cur(tbl1, val);
	  end;
	  do return val end;
	end;
	local cur_val = next_valid(tbl, cur(tbl, nil));
	do return _hx_o({__fields__={next=true,hasNext=true},next=function(self) 
	  local ret = cur_val;
	  cur_val = next_valid(tbl, cur(tbl, cur_val));
	  do return ret end;
	end,hasNext=function(self) 
	  do return cur_val ~= nil end;
	end}) end;
  end
  _hx_bit_clamp = function(v)
	if v <= 2147483647 and v >= -2147483648 then
	  if v > 0 then return _G.math.floor(v)
	  else return _G.math.ceil(v)
	  end
	end
	if v > 2251798999999999 then v = v*2 end;
	if (v ~= v or math.abs(v) == _G.math.huge) then return nil end
	return _hx_bit.band(v, 2147483647 ) - math.abs(_hx_bit.band(v, 2147483648))
  end
  
  -- require this for lua 5.1
  pcall(require, 'bit')
  if bit then
	_hx_bit = bit
  else
	local _hx_bit_raw = _G.require('bit32')
	_hx_bit = setmetatable({}, { __index = _hx_bit_raw });
	-- lua 5.2 weirdness
	_hx_bit.bnot = function(...) return _hx_bit_clamp(_hx_bit_raw.bnot(...)) end;
	_hx_bit.bxor = function(...) return _hx_bit_clamp(_hx_bit_raw.bxor(...)) end;
  end
  
  _hx_array_mt.__index = Array.prototype
  
  local _hx_static_init = function()
	__lua_Boot.hiddenFields = {__id__=true, hx__closures=true, super=true, prototype=true, __fields__=true, __ifields__=true, __class__=true, __properties__=true}
	
	
  end
  
  _hx_print = print or (function() end)
  
  _hx_wrap_if_string_field = function(o, fld)
	if _G.type(o) == 'string' then
	  if fld == 'length' then
		return _G.string.len(o)
	  else
		return String.prototype[fld]
	  end
	else
	  return o[fld]
	end
  end
  
  _hx_static_init();
  Main.main()
  