[from now] 2012/03/21 17:22:36

diff --git a/.gitignore b/.gitignore
index a1fb685..8046622 100755
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
 .sconf_temp
 *.idb
 *.pdb
+.DS_Store
 src/.deps/
 src/vs/mocha/mocha/Debug/
 src/vs/mocha/mocha/Release/
diff --git a/SConstruct b/SConstruct
index ae129a8..acd7931 100755
--- a/SConstruct
+++ b/SConstruct
@@ -10,9 +10,9 @@ sys.path.insert(0, os.path.join(root_dir, 'tools/scons_helper'))
 import deps
 from platform_utils import Config, platform
 from sources import Sources
-
+CURRENT = os.getcwd().replace('\\', '/')
 ROOT = 'src'
-LIB_PREFIX = "src/third_party/icu"
+LIB_PREFIX = CURRENT + "/src/third_party/icu"
 WIN32_ICU = "src/third_party/icu/lib-win32/icuuc.lib src/third_party/icu/lib-win32/icuin.lib src/third_party/icu/lib-win32/icuio.lib src/third_party/icu/lib-win32/icutu.lib src/third_party/icu/lib-win32/icudt.lib src/third_party/icu/lib-win32/iculx.lib src/third_party/icu/lib-win32/icule.lib";
 PLATFORM_CONFIG = {
     "linux" : {
@@ -70,7 +70,6 @@ class MochaBuilder :
             self.__config.AddExcludeFile(["file_watcher-impl.cc"])

 ut = ARGUMENTS.get('ut')
-CURRENT = os.getcwd().replace('\\', '/')
 GTEST_DIR = CURRENT + '/src/third_party'
 PLATFORM = platform
 UNIT_TEST_CONFIG = {
@@ -86,7 +85,8 @@ UNIT_TEST_CONFIG = {
         "RELEASE" : '-Wall -Wextra -O3 -fno-exceptions -DPLATFORM_POSIX -DGOOGLE_TEST -DPLATFORM_MACOS -DNDEBUG -I' + GTEST_DIR + '/gtest-1.6.0-macos/include -I' + GTEST_DIR + '/gtest-1.6.0-macos -DCURRENT_DIR=\\"' + CURRENT + '\\" -I' + CURRENT + '/src',
         "DEBUG" : '-Wall -Wdisabled-optimization -DDEBUG -Winline -O0 -g -fno-exceptions  -DGOOGLE_TEST -DPLATFORM_POSIX -I' + GTEST_DIR + '/gtest-1.6.0-macos/include -I' + GTEST_DIR + '/gtest-1.6.0-macos -DCURRENT_DIR=\\"' + CURRENT + '\\" -I' + CURRENT + '/src',
         "DEPENDS" : [GTEST_DIR + '/gtest-1.6.0-macos/src/gtest-all.cc',
-                   GTEST_DIR + '/gtest-1.6.0-macos/src/gtest_main.cc']
+                   GTEST_DIR + '/gtest-1.6.0-macos/src/gtest_main.cc'],
+        "STATIC_LIBS" : []
         },
     "win32" : {
         "TARGET" : 'ut.exe',
@@ -99,10 +99,12 @@ UNIT_TEST_CONFIG = {
     }
 TESTS = {'notificator' : 'src/mocha/roaster/notificator',
          'platform_utils' : 'src/mocha/roaster/platform/utils',
-         'compiler_loader' : 'src/mocha/roaster/compiler/loader',
+         'nexc-loader' : 'src/mocha/roaster/compiler/loader',
          'platform_stat' : 'src/mocha/roaster/platform/fs/stat',
          'platform_directory' : 'src/mocha/roaster/platform/fs/directory',
-         'platform_path' : 'src/mocha/roaster/platform/fs/path/'
+         'platform_path' : 'src/mocha/roaster/platform/fs/path',
+         'nexc' : 'src/mocha/roaster/nexc',
+         'nexc-scanner' : 'src/mocha/roaster/nexc/scanner'
          }

@@ -112,11 +114,11 @@ if ut :
     CONFIG = Config(CURRENT, UNIT_TEST_CONFIG)
     if ut == 'all' :
         for test in TESTS.values() :
-            SConscript(test + '/SConscript', exports = ['CURRENT', 'ENV', 'CONFIG'])
+            SConscript(test + '/SConscript', exports = ['CURRENT', 'ENV', 'CONFIG', 'LIB_PREFIX'])
     else :
         tests = ut.split(':')
         for test in tests :
-            SConscript(TESTS[test] + '/SConscript', exports = ['CURRENT', 'ENV', 'CONFIG'])
+            SConscript(TESTS[test] + '/SConscript', exports = ['CURRENT', 'ENV', 'CONFIG', 'LIB_PREFIX'])
 else :
     builder = MochaBuilder(ARGUMENTS.get('mode'))
     builder.Build()
diff --git a/src/mocha/misc/int_types.h b/src/mocha/misc/int_types.h
deleted file mode 100755
index 327e838..0000000
--- a/src/mocha/misc/int_types.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef mocha_int_types_h_
-#define mocha_int_types_h_
-
-#include <stdio.h>
-
-#if defined(_MSC_VER) && (_MSC_VER < 1600) && !defined(__MINGW32__)
-
-typedef signed char int8_t;
-typedef unsigned char uint8_t;
-typedef short int16_t;  // NOLINT
-typedef unsigned short uint16_t;  // NOLINT
-typedef int int32_t;
-typedef unsigned int uint32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-#define INT8_MAX CHAR_MAX
-#define INT8_MIN CHAR_MIN
-#define UINT8_MAX UCHAR_MAX
-#define INT16_MAX SHRT_MAX
-#define INT16_MIN SHRT_MIN
-#define UINT16_MAX SHORT_MAX
-#define INT32_MAX INT_MAX
-#define INT32_MIN INT_MIN
-#define UINT32_MAX UINT_MAX
-#define INT64_MAX _I64_MAX
-#define INT64_MIN _I64_MIN
-#define UINT64_MAX _UI64_MAX
-
-// intptr_t and friends are defined in crtdefs.h through stdio.h.
-#include <crtdefs.h>
-#else
-
-
-#include <stdint.h>
-
-#endif
-
-#endif  // mocha_int_types_h_
diff --git a/src/mocha/roaster/ast/visitors/utils/processors/.#function_processor.cc b/src/mocha/roaster/ast/visitors/utils/processors/.#function_processor.cc
deleted file mode 120000
index b1f0bce..0000000
--- a/src/mocha/roaster/ast/visitors/utils/processors/.#function_processor.cc
+++ /dev/null
@@ -1 +0,0 @@
-aono_taketoshi@PC-3914.local.4654
\ No newline at end of file
diff --git a/src/mocha/roaster/binding/parser_connector.cc b/src/mocha/roaster/binding/parser_connector.cc
deleted file mode 100755
index 8d0366a..0000000
--- a/src/mocha/roaster/binding/parser_connector.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-
-#include <stdio.h>
-#include <mocha/roaster/ast/ast.h>
-#include <mocha/roaster/binding/parser_connector.h>
-#include <mocha/roaster/tokens/token_info.h>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/scanner/scanner.h>
-#include <mocha/roaster/scanner/source_stream.h>
-#include <mocha/roaster/utils/error_reporter.h>
-
-namespace mocha {
-ParserConnector::ParserConnector (Scanner* scanner,
-                                  ErrorReporter* reporter) :
-    scanner_(scanner), reporter_(reporter){}
-
-ParserConnector::~ParserConnector () {};
-
-
-TokenInfo* ParserConnector::Advance(int index) {
-  return scanner_->Advance(index);
-}
-
-TokenInfo* ParserConnector::Undo(int index) {
-  return scanner_->Undo(index);
-}
-
-TokenInfo* ParserConnector::Seek(int index) {
-  return scanner_->Seek(index);
-}
-
-ErrorReporter* ParserConnector::GetError() {
-  return reporter_;
-}
-
-}
diff --git a/src/mocha/roaster/binding/parser_connector.h b/src/mocha/roaster/binding/parser_connector.h
deleted file mode 100755
index 487a9c7..0000000
--- a/src/mocha/roaster/binding/parser_connector.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef mocha_parser_connector_h_
-#define mocha_parser_connector_h_
-
-#include <string>
-#include <mocha/roaster/memory/pool.h>
-#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
-#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
-
-namespace mocha {
-
-class Compiler;
-class Scanner;
-class AstRoot;
-class TokenInfo;
-class SourceStream;
-class ErrorReporter;
-
-/**
- * @class
- * Connector of mocha and bison generated parser.
- */
-class ParserConnector : memory::Allocated {
-
- public:
-
-  /**
-   * @construcor
-   * @param {Scanner*} scanner -> Scanner instance.
-   * @param {ErrorReporter*} reporter -> ErrorReporter instance.
-   */
-  ParserConnector(Scanner* scanner, ErrorReporter* reporter);
-
-  void Initialize();
-
-  ~ParserConnector ();
-
-  /**
-   * @public
-   * @param {void*} yylval -> Type erasured args. real type is ParserImplementation::semantic_type*
-   * Run mocha::Scanner::GetToken().
-   */
-  TokenInfo* Advance(int len = 1);
-  TokenInfo* Undo(int len = 1);
-  TokenInfo* Seek(int len = 1);
-
-  ErrorReporter* GetError();
-
- private :
-  Scanner* scanner_;
-  ErrorReporter* reporter_;
-};
-
-}
-
-#endif
-
diff --git a/src/mocha/roaster/compiler/bootstrapper.h b/src/mocha/roaster/compiler/bootstrapper.h
deleted file mode 100755
index 6799cec..0000000
--- a/src/mocha/roaster/compiler/bootstrapper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-namespace mocha {
-
-class Bootstrapper {
- public :
-  Bootstrapper();
-  ~Bootstrapper(){}
-  void Initialize();
-};
-
-}
diff --git a/src/mocha/roaster/compiler/compilation_info/compilation_info.cc b/src/mocha/roaster/compiler/compilation_info/compilation_info.cc
deleted file mode 100755
index 72f8618..0000000
--- a/src/mocha/roaster/compiler/compilation_info/compilation_info.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-#include <mocha/roaster/platform/fs/fs.h>
-#include <mocha/roaster/utils/compilation_info.h>
-#include <mocha/roaster/consts/consts.h>
-namespace mocha {
-
-static const int debug = 0;
-static const int compress = 1;
-static const int pretty_print = 2;
-static const int file = 3;
-
-CompilationInfo::CompilationInfo(const char* str) : str_(str) {
-  versions_.insert(VersionPair(Consts::kVersionAll, 1));
-  versions_.insert(VersionPair(Consts::kVersionNone, 1));
-  std::string base_dir = os::fs::Path::home_directory();
-  base_dir += "/.mocha/";
-  base_dir += "module/";
-  lib_dir_.push_back(base_dir);
-}
-
-bool CompilationInfo::Debug() const {
-  return flags_.At(debug);
-}
-
-void CompilationInfo::SetDebug() {
-  flags_.Set(debug);
-  versions_.insert(VersionPair(Consts::kVersionDebug, 1));
-}
-
-bool CompilationInfo::Compress() const {
-  return flags_.At(compress);
-}
-
-void CompilationInfo::SetCompress() {
-  flags_.Set(compress);
-}
-
-bool CompilationInfo::PrettyPrint() const {
-  return flags_.At(pretty_print);
-}
-
-void CompilationInfo::SetPrettyPrint() {
-  flags_.Set(pretty_print);
-}
-
-void CompilationInfo::SetVersion(const char* name) {
-  Versions::iterator entry = versions_.find(name);
-  if (entry == versions_.end()) {
-    versions_.insert(VersionPair(name, 1));
-  }
-}
-
-bool CompilationInfo::HasVersion(const char* name) const {
-  Versions::const_iterator entry = versions_.find(name);
-  if (entry == versions_.end()) {
-    return false;
-  } else {
-    return true;
-  }
-}
-
-void CompilationInfo::MarkAsFile() {
-  flags_.Set(file);
-}
-
-bool CompilationInfo::IsFile() const {
-  return flags_.At(file);
-}
-
-void CompilationInfo::SetCharset(const char* charset) {
-  charset_ = charset;
-}
-
-void CompilationInfo::SetLibDirectory(const char* path) {
-  std::string dir = path;
-  lib_dir_.push_back(dir);
-}
-
-}
diff --git a/src/mocha/roaster/compiler/compilation_info/compilation_info.h b/src/mocha/roaster/compiler/compilation_info/compilation_info.h
deleted file mode 100755
index 0dcb363..0000000
--- a/src/mocha/roaster/compiler/compilation_info/compilation_info.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef mocha_compile_info_h_
-#define mocha_compile_info_h_
-#include <string>
-#include <vector>
-#include <mocha/roaster/misc/bits.h>
-#include <mocha/misc/int_types.h>
-#include <mocha/roaster/lib/unordered_map.h>
-namespace mocha {
-typedef std::vector<std::string> LibDirectories;
-class CompilationInfo {
-  typedef std::pair<const char*, uint8_t> VersionPair;
-  typedef roastlib::unordered_map<std::string, uint8_t> Versions;
- public :
-  CompilationInfo();
-  ~CompilationInfo(){};
-  bool Debug() const;
-  void SetDebug();
-  bool Compress() const;
-  void SetCompress();
-  bool PrettyPrint() const;
-  void SetPrettyPrint();
-  bool HasVersion(const char*) const;
-  void SetVersion(const char*);
-  void MarkAsFile();
-  void SetCharset(const char* charset);
-  bool HasCharset() const { return !charset_.empty();}
-  const char* charset() const {return charset_.c_str();};
-  void SetLibDirectory(const char* dir);
-  bool HasOptionalIdentifier() const { return !optional_identifier_.empty(); }
-  const LibDirectories& lib_directories() const { return lib_dir_; };
- private :
-  std::string charset_;
-  LibDirectories lib_dir_;
-  BitVector8 flags_;
-  Versions versions_;
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/compiler/compiler.cc b/src/mocha/roaster/compiler/compiler.cc
deleted file mode 100755
index e394033..0000000
--- a/src/mocha/roaster/compiler/compiler.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *Licensed under the BSD.
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#include <assert.h>
-#include <mocha/roaster/compiler/compiler.h>
-#include <mocha/roaster/compiler/loader/loader.h>
-namespace roaster {
-
-class LoadCompleteListener {
- public :
-  LoadCompleteListener(Compiler* compiler)
-      : compiler_(compiler){}
-  ~LoadCompleteListener(){}
-  LoadCompleteListener(const LoadCompleteListener& listener) {
-    compiler_ = listener.compiler_;
-  }
-  void operator()(IOEvent* e) {
-
-  }
- private :
-  Compiler* compiler_;
-};
-
-class LoadErrorListener {
- public :
-  LoadCompleteListener(bool fatal)
-      : fatal_(fatal),
-        compiler_(compiler){}
-  ~LoadCompleteListener(){}
-  LoadCompleteListener(const LoadErrorListener& listener) {
-    fatal_ = listener.fatal_;
-    compiler_ = listener.compiler_;
-  }
-  void operator()(IOEvent* e) {
-
-  }
- private :
-  bool fatal_
-  Compiler* compiler_;
-}
-
-Compiler::Compiler() {
-  Initialize();
-}
-
-void Compiler::CompileFile(const char* filename) {
-  Loader loader;
-  loader.AddListener(Loader::kComplete, LoadCompleteListener(this));
-  loader.AddListener(Loader::kError, LoadErrorListener(true, this));
-}
-
-void Compiler::Compile(const char* source) {}
-
-void Compiler::Initialize() {
-  AddListener()
-}
-
-const char Compiler::kParse[] = {"Compiler<Parse>"};
-const char Compiler::kFatal[] = {"Compiler<Fatal>"};
-const char Compiler::kImport[] = {"Compiler<Import>"};
-}
diff --git a/src/mocha/roaster/compiler/compiler.h b/src/mocha/roaster/compiler/compiler.h
deleted file mode 100755
index 0d260bd..0000000
--- a/src/mocha/roaster/compiler/compiler.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *Licensed under the BSD.
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#ifndef mocha_roaster_compiler_compiler_h_
-#define mocha_roaster_compiler_compiler_h_
-namespace roaster {
-class CompilationEvent;
-class CompilationInfo;
-class Compiler : public Notificator<CompilationEvent*>{
- public :
-  Compiler(CompilationInfo* info);
-  ~Compiler(){};
-  void CompileFile(const char* filename);
-  void Compile(const char* source);
- private :
-  void Initialize();
-  void ImportFile(const char* filename);
-  static const char kParse[];
-  static const char kFatal[];
-  static const char kImport[];
-};
-}
-#endif
diff --git a/src/mocha/roaster/compiler/events/compilation_event/compilation_event.cc b/src/mocha/roaster/compiler/events/compilation_event/compilation_event.cc
deleted file mode 100755
index 92d3106..0000000
--- a/src/mocha/roaster/compiler/events/compilation_event/compilation_event.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace mocha {
-CompilationEvent::CompilationEvent(CompilationInfo* info, ErrorReporter* reporter,
-                                   Notificator* notificator, memory::Pool* pool)
-    : compilation_info_(info),
-      error_reporter_(reporter),
-      notificator_(notificator),
-      pool_(pool){}
-
-const char CompilationEvent::EventKey::kScan[] = {"Compile<Scan>"};
-const char CompilationEvent::EventKey::kParse[] = {"Compile<Parse>"};
-const char CompilationEvent::EventKey::kTransform[] = {"Compile<Transform>"};
-}
diff --git a/src/mocha/roaster/compiler/events/compilation_event/compilation_event.h b/src/mocha/roaster/compiler/events/compilation_event/compilation_event.h
deleted file mode 100755
index 3ef2af1..0000000
--- a/src/mocha/roaster/compiler/events/compilation_event/compilation_event.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#ifndef mocha_roaster_compiler_compilation_event_h_
-#define mocha_roaster_compiler_compilation_event_h_
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class CompilationInfo;
-class CompilationEvent : public memory::Allocated {
- public :
-  CompilationEvent(CompilationInfo* info, ErrorReporter* reporter,
-                   Notificator* notificator, memory::Pool* pool);
-  ~CompilationEvent(){}
-  const CompilationInfo* compilation_info() const { return compilation_info_;}
-  const char* source() const {return source_.c_str();}
-  const char* path() const {return path_.c_str();}
-  const charl* filename() const {return filename_.c_str();}
-  memory::Pool* pool() {return pool_;}
-  ErrorReporter* error_reporter() {return error_reporter_;}
-  Notificator* notificator() {return notificator_;}
-  ParserConnector* parser_connector() {return parser_connector_;}
-  FileRoot* ast() {return ast_;}
-  void set_source(std::stringstream* stream) {source_ = stream.str();}
-  void set_path(const char* path) {path_ = path;}
-  void set_filename(const char* filename) {filename_ = filename;}
-  void set_ast(FileRoot* root) {ast_ = root;}
-  class EventKey : private Static {
-   public :
-    static const char kScan[];
-    static const char kParse[];
-    static const char kTransform[];
-  };
- private :
-  std::string path_;
-  std::string filename_;
-  std::string char* source_;
-  CompilationInfo* compilation_info_;
-  ErrorReporter* reporter_;
-  Notificator* notificator_;
-  memory::Pool* pool_;
-  ParserConnector* parser_connector_;
-  FileRoot* ast_;
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/compiler/events/io_event/io_event.cc b/src/mocha/roaster/compiler/events/io_event/io_event.cc
deleted file mode 100755
index 0688e2c..0000000
--- a/src/mocha/roaster/compiler/events/io_event/io_event.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#include <mocha/roaster/compiler/events/io_event/io_event.h>
-namespace mocha {
-IOEvent::IOEvent(const char* path, const char* data)
-    : errno_(0),
-      path_(path),
-      data_(data){}
-IOEvent::IOEvent(const char* path, std::stringstream* data)
-    : errno_(0),
-      path_(path),
-      data_(data->str()){}
-IOEvent::IOEvent(const char* path, const char* data, int type)
-    : errno_(type),
-      path_(path),
-      data_(data){}
-}
diff --git a/src/mocha/roaster/compiler/events/io_event/io_event.h b/src/mocha/roaster/compiler/events/io_event/io_event.h
deleted file mode 100755
index 8c87b31..0000000
--- a/src/mocha/roaster/compiler/events/io_event/io_event.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#include <string>
-#include <sstream>
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class IOEvent : public memory::Allocated {
- public :
-  IOEvent(const char* path, const char* data);
-  IOEvent(const char* path, std::stringstream* data);
-  IOEvent(const char* path, const char* data, int error);
-  const char* path() const {return path_.c_str();}
-  const char* data() const {return data_.c_str();}
-  int error_type() const { return errno_; }
-  enum {
-    kNoError,
-    kNotFound,
-    kNotAFile,
-    kError
-  };
- private :
-  int errno_;
-  std::string path_;
-  std::string data_;
-};
-}
diff --git a/src/mocha/roaster/compiler/linker/linker.cc b/src/mocha/roaster/compiler/linker/linker.cc
deleted file mode 100755
index e69de29..0000000
diff --git a/src/mocha/roaster/compiler/linker/linker.h b/src/mocha/roaster/compiler/linker/linker.h
deleted file mode 100755
index e69de29..0000000
diff --git a/src/mocha/roaster/compiler/loader/SConscript b/src/mocha/roaster/compiler/loader/SConscript
deleted file mode 100755
index 929d0f6..0000000
--- a/src/mocha/roaster/compiler/loader/SConscript
+++ /dev/null
@@ -1,42 +0,0 @@
-import os, sys
-root_dir = os.path.dirname(File('SConscript').rfile().abspath + '/../../../../')
-sys.path.insert(0, os.path.join(root_dir, 'tools/scons_helper'))
-from platform_utils import Config
-from test import TestBuilder
-Import('CURRENT')
-Import('ENV')
-Import('CONFIG')
-ROOT = os.getcwd().replace('\\', '/')
-TEST_CONFIG = CONFIG.Copy()
-TEST_CONFIG.Extend({
-        "linux" : {
-            "LD_FLAGS" : "",
-            "LIBS" : ['pthread'],
-            "EXCLUDE_FILES" : [],
-            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-posix.cc",
-                         CURRENT + "/src/mocha/roaster/platform/thread/thread-posix.cc"]
-            },
-        'macos' : {
-            "LD_FLAGS" : "",
-            "LIBS" : [],
-            "STATIC_LIBS" : [],
-            "EXCLUDE_FILES" : [],
-            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-posix.cc",
-                         CURRENT + "/src/mocha/roaster/platform/thread/thread-posix.cc"]
-            },
-        "win32" : {
-            "LD_FLAGS" : "/NOLOGO /MACHINE:X86 /LTCG",
-            "LIBS" : [],
-            "EXCLUDE_FILES" : [],
-            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-win32.cc",
-                         CURRENT + "/src/mocha/roaster/platform/thread/thread-win32.cc"]
-            }
-        })
-TEST_CONFIG.set_base(ROOT)
-builder = TestBuilder(ARGUMENTS.get('mode'), ['ut.cc','loader.cc',
-                                              CURRENT + "/src/mocha/roaster/platform/fs/stat/stat.cc",
-                                              CURRENT + '/src/mocha/roaster/compiler/events/io_event/io_event.cc',
-                                              CURRENT + '/src/mocha/roaster/memory/pool.cc'],
-                      ENV, TEST_CONFIG)
-builder.Build(CURRENT + '/src', ROOT)
-
diff --git a/src/mocha/roaster/compiler/loader/loader.cc b/src/mocha/roaster/compiler/loader/loader.cc
deleted file mode 100755
index 83f4e53..0000000
--- a/src/mocha/roaster/compiler/loader/loader.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#include <string.h>
-#include <mocha/roaster/assert/assert_def.h>
-#include <mocha/roaster/compiler/loader/loader.h>
-#include <mocha/roaster/platform/utils/utils.h>
-#include <mocha/roaster/platform/fs/stat/stat.h>
-#define BUF_SIZE 128
-
-namespace mocha {
-Loader::Loader(){}
-Loader::~Loader(){}
-void Loader::LoadFile(const char* path) {
-  ASSERT(true, strlen(path) > 0);
-  os::fs::Stat stat(path);
-  if (stat.IsExist() && !stat.IsDir()) {
-    FILE* fp = os::FOpen(path, "rb");
-    //Check is file exist.
-    if (fp != NULL) {
-      std::stringstream st;
-      ReadNormalFile(fp, &st);
-      IOEvent *e = new(&pool_) IOEvent(path, &st);
-      NotifyForKey(kComplete, e);
-    } else {
-      HandleError(path, kFOpenError);
-    }
-  } else if (stat.IsDir()){
-    HandleError(path, kNotAFile);
-  } else {
-    HandleError(path, kNotFound);
-  }
-}
-
-void Loader::HandleError(const char* path, int type) {
-  std::string buf;
-  int error_type = 0;
-  ASSERT(true, (type == kFOpenError || type == kNotAFile || type == kNotFound));
-  if (type == kFOpenError) {
-    error_type = IOEvent::kError;
-    os::Strerror(&buf, K_ERRNO);
-  } else if (type == kNotAFile) {
-    error_type = IOEvent::kNotAFile;
-    os::SPrintf(&buf, "%s is a directory.", path);
-  } else if (type == kNotFound) {
-    error_type = IOEvent::kNotFound;
-    os::SPrintf(&buf, "%s No such file.", path);
-  }
-  IOEvent *e = new(&pool_) IOEvent(path, buf.c_str(), error_type);
-  NotifyForKey(kError, e);
-}
-
-void Loader::ReadNormalFile(FILE* fp, std::stringstream* st) {
-  int read = 0;
-  char tmp[128];
-  while ((read = fread(tmp, sizeof(char), 127, fp))) {
-    tmp[(BUF_SIZE - 1)] = '\0';
-    (*st) << tmp;
-    if (read < (BUF_SIZE - 1)) {
-      break;
-    }
-    tmp[0] = '\0';
-  }
-}
-
-const char Loader::kComplete[] = {"Loader<Complete>"};
-const char Loader::kError[] = {"Loader<Error>"};
-
-}
diff --git a/src/mocha/roaster/compiler/loader/loader.h b/src/mocha/roaster/compiler/loader/loader.h
deleted file mode 100755
index 47e4108..0000000
--- a/src/mocha/roaster/compiler/loader/loader.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- *@author Taketoshi Aono
- *@fileOverview
- *@license
- *Copyright (c) 2011 Taketoshi Aono
- *
- *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- *associated doc umentation files (the "Software"), to deal in the Software without restriction,
- *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
- *subject to the following conditions:
- *
- *The above copyright notice and this permission notice shall be included in all copies or
- *substantial portions ofthe Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *DEALINGS IN THE SOFTWARE.
- */
-#ifndef mocha_compiler_loader_loader_h_
-#define mocha_compiler_loader_loader_h_
-#include <stdio.h>
-#include <string>
-#include <sstream>
-#include <mocha/roaster/notificator/notificator.h>
-#include <mocha/roaster/compiler/events/io_event/io_event.h>
-namespace mocha {
-class Loader : public Notificator<IOEvent*> {
- public :
-  Loader();
-  ~Loader();
-  void LoadFile(const char* path);
-  static const char kComplete[];
-  static const char kError[];
- private :
-  enum {
-    kFOpenError,
-    kNotAFile,
-    kNotFound
-  };
-  void ReadNormalFile(FILE* fp, std::stringstream *st);
-  void HandleError(const char* path, int type);
-  memory::Pool pool_;
-};
-}
-#endif
diff --git a/src/mocha/roaster/compiler/loader/ut.cc b/src/mocha/roaster/compiler/loader/ut.cc
deleted file mode 100755
index 65545bc..0000000
--- a/src/mocha/roaster/compiler/loader/ut.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-#include <gtest/gtest.h>
-#include <mocha/roaster/platform/utils/utils.h>
-#include <mocha/roaster/compiler/loader/loader.h>
-const char path[] = {CURRENT_DIR"/src/mocha/roaster/compiler/loader/loader.h"};
-class TestCPLitener {
- public :
-  TestCPLitener(int* state)
-      : state_(state){}
-  TestCPLitener(const TestCPLitener& listener) {
-    state_ = listener.state_;
-  }
-  void operator()(mocha::IOEvent* e) {
-    ASSERT_EQ(0, strcmp(e->path(), path));
-    (*state_) = 1;
-  }
- private :
-  int* state_;
-};
-
-class TestERLitener {
- public :
-  TestERLitener(int* state)
-      : state_(state){}
-  TestERLitener(const TestERLitener& listener) {
-    state_ = listener.state_;
-  }
-  void operator()(mocha::IOEvent* e) {
-    (*state_) = -1;
-  }
- private :
-  int *state_;
-};
-
-class TestNotFoundLitener {
- public :
-  TestNotFoundLitener(int* state)
-      : state_(state){}
-  TestNotFoundLitener(const TestNotFoundLitener& listener) {
-    state_ = listener.state_;
-  }
-  void operator()(mocha::IOEvent* e) {
-    ASSERT_EQ(mocha::IOEvent::kNotFound, e->error_type());
-    (*state_) = -1;
-  }
- private :
-  int *state_;
-};
-
-class TestNotAFileLitener {
- public :
-  TestNotAFileLitener(int* state)
-      : state_(state){}
-  TestNotAFileLitener(const TestNotAFileLitener& listener) {
-    state_ = listener.state_;
-  }
-  void operator()(mocha::IOEvent* e) {
-    ASSERT_EQ(mocha::IOEvent::kNotAFile, e->error_type());
-    (*state_) = -1;
-  }
- private :
-  int *state_;
-};
-
-TEST(LoaderTest, LoadTest) {
-  mocha::Loader loader;
-  int state = 0;
-  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
-  loader.AddListener(mocha::Loader::kError, TestERLitener(&state));
-  loader.LoadFile(path);
-  if (state != 1) {
-    FAIL();
-  }
-}
-
-TEST(LoaderTest, LoadNotAFileTest) {
-  mocha::Loader loader;
-  int state = 0;
-  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
-  loader.AddListener(mocha::Loader::kError, TestNotAFileLitener(&state));
-  loader.LoadFile(CURRENT_DIR"/src");
-  if (state != -1) {
-    FAIL();
-  }
-}
-
-TEST(LoaderTest, LoadNoSuchFileTest) {
-  mocha::Loader loader;
-  int state = 0;
-  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
-  loader.AddListener(mocha::Loader::kError, TestNotFoundLitener(&state));
-  loader.LoadFile(CURRENT_DIR"/src/aaaa");
-  if (state != -1) {
-    FAIL();
-  }
-}
diff --git a/src/mocha/roaster/encoding/encoding.cc b/src/mocha/roaster/encoding/encoding.cc
deleted file mode 100755
index 963deab..0000000
--- a/src/mocha/roaster/encoding/encoding.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <string.h>
-#include <iostream>
-#include <mocha/roaster/encoding/encoding.h>
-namespace mocha {
-SharedPtr<DetectResult> ICUWrapper::GetEncode(const char* source) {
-  UErrorCode error = U_ZERO_ERROR;
-  UCharsetDetector* detector = ucsdet_open(&error);
-  ucsdet_setText(detector, source, strlen(source), &error);
-  const UCharsetMatch* match = ucsdet_detect(detector, &error);
-  SharedPtr<DetectResult> result(new DetectResult);
-  if (U_FAILURE(error)) {
-    result->charset = 0;
-    result->lang = 0;
-    result->error = true;
-  } else {
-    result->charset = ucsdet_getName(match, &error);
-    result->lang = ucsdet_getLanguage(match, &error);
-    result->error = false;
-  }
-  ucsdet_close(detector);
-  return result;
-}
-
-SharedStr ICUWrapper::Convert(icu::UnicodeString* src) {
-  int length = src->extract(0, src->length(), NULL, "UTF-8");
-  std::vector<char> result(length + 1);
-  src->extract(0, src->length(), &result[0], "UTF-8");
-  std::string tmp(result.begin(), result.end() - 1);
-  char* ret = new char[ tmp.size() + 1 ];
-  strcpy(ret, tmp.c_str());
-  return SharedStr(ret);
-}
-
-SharedStr ICUWrapper::EncodeToUtf8(const char* source, const char* type) {
-  icu::UnicodeString src(source, type);
-  return Convert(&src);
-}
-
-SharedStr ICUWrapper::EncodeToUtf8(const wchar_t* source) {
-  wprintf(L"%s\n", source);
-  icu::UnicodeString src(reinterpret_cast<const UChar*>(source));
-  return Convert(&src);
-}
-
-}
diff --git a/src/mocha/roaster/encoding/encoding.h b/src/mocha/roaster/encoding/encoding.h
deleted file mode 100755
index 92e3e09..0000000
--- a/src/mocha/roaster/encoding/encoding.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef mocha_encoding_h_
-#define mocha_encoding_h_
-#include <vector>
-#include <string>
-#include <unicode/ucsdet.h>
-#include <unicode/ucnv.h>
-#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
-#include <mocha/roaster/misc/class_traits/static.h>
-namespace mocha {
-
-struct DetectResult {
-  const char* charset;
-  const char* lang;
-  bool error;
-};
-
-class ICUWrapper : private Static{
- public :
-  static SharedPtr<DetectResult> GetEncode(const char* source);
-  static SharedStr EncodeToUtf8(const char* source, const char* type);
-  static SharedStr EncodeToUtf8(const wchar_t* source);
- private :
-  static SharedStr Convert(icu::UnicodeString *str);
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/misc/bits.h b/src/mocha/roaster/misc/bits.h
index 47b9923..e010dee 100755
--- a/src/mocha/roaster/misc/bits.h
+++ b/src/mocha/roaster/misc/bits.h
@@ -1,40 +1,40 @@
 #ifndef mocha_utils_h_
 #define mocha_utils_h_
-#include <mocha/misc/int_types.h>
+#include <mocha/roaster/misc/int_types.h>
 #include <mocha/roaster/misc/static_assert.h>
-#include <assert.h>
+#include <mocha/roaster/assert/assert_def.h>

 namespace mocha {
 template <typename T,int bit_bands>
 class BitVector {
  public :
-  inline BitVector() : set_(0){}
-  inline ~BitVector(){}
-  inline BitVector(const BitVector& vec) {
+  BitVector() : set_(0){}
+  ~BitVector(){}
+  BitVector(const BitVector& vec) {
     set_ = vec.set_;
   }
-  inline const BitVector<T,bit_bands>& operator = (const BitVector<T,bit_bands>& vec) {
+  const BitVector<T,bit_bands>& operator = (const BitVector<T,bit_bands>& vec) {
     set_ = vec.set_;
     return (*this);
   }
-  inline void Set(int val) {
-    assert(bit_bands >= val && val > -1);
+  void Set(int val) {
+    ASSERT(true, (bit_bands >= val && val > -1));
     set_ |= (1 << val);
   }
-  inline void UnSet(int val) {
-    assert(bit_bands >= val && val > -1);
+  void UnSet(int val) {
+    ASSERT(true, (bit_bands >= val && val > -1));
     set_ &= (~(1 << val));
   }
-  inline void Reverse(int val) {
-    assert(bit_bands >= val && val > -1);
+  void Reverse(int val) {
+    ASSERT(true, (bit_bands >= val && val > -1));
     set_ ^= (1 << val);
   }
-  inline bool At(int val) const {
-    assert(bit_bands >= val);
+  bool At(int val) const {
+    ASSERT(true, (bit_bands >= val));
     T tmp = (1 << val);
     return (set_ & tmp) == tmp;
   }
-  inline bool operator[] (int val) const {
+  bool operator[] (int val) const {
     return At(val);
   }
  private :
diff --git a/src/mocha/roaster/misc/int_types.h b/src/mocha/roaster/misc/int_types.h
new file mode 100755
index 0000000..327e838
--- /dev/null
+++ b/src/mocha/roaster/misc/int_types.h
@@ -0,0 +1,39 @@
+#ifndef mocha_int_types_h_
+#define mocha_int_types_h_
+
+#include <stdio.h>
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600) && !defined(__MINGW32__)
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t;  // NOLINT
+typedef unsigned short uint16_t;  // NOLINT
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+
+#define INT8_MAX CHAR_MAX
+#define INT8_MIN CHAR_MIN
+#define UINT8_MAX UCHAR_MAX
+#define INT16_MAX SHRT_MAX
+#define INT16_MIN SHRT_MIN
+#define UINT16_MAX SHORT_MAX
+#define INT32_MAX INT_MAX
+#define INT32_MIN INT_MIN
+#define UINT32_MAX UINT_MAX
+#define INT64_MAX _I64_MAX
+#define INT64_MIN _I64_MIN
+#define UINT64_MAX _UI64_MAX
+
+// intptr_t and friends are defined in crtdefs.h through stdio.h.
+#include <crtdefs.h>
+#else
+
+
+#include <stdint.h>
+
+#endif
+
+#endif  // mocha_int_types_h_
diff --git a/src/mocha/roaster/nexc/binding/parser_connector.cc b/src/mocha/roaster/nexc/binding/parser_connector.cc
new file mode 100755
index 0000000..3677ec9
--- /dev/null
+++ b/src/mocha/roaster/nexc/binding/parser_connector.cc
@@ -0,0 +1,52 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <mocha/roaster/utils/error_reporter.h>
+#include <mocha/roaster/nexc/binding/parser_connector.h>
+#include <mocha/roaster/nexc/scanner/scanner.h>
+
+namespace mocha {
+ParserConnector::ParserConnector (Scanner* scanner,
+                                  ErrorReporter* reporter) :
+    scanner_(scanner), reporter_(reporter){}
+
+ParserConnector::~ParserConnector () {};
+
+
+TokenInfo* ParserConnector::Advance(int index) {
+  return scanner_->Advance(index);
+}
+
+TokenInfo* ParserConnector::Undo(int index) {
+  return scanner_->Undo(index);
+}
+
+TokenInfo* ParserConnector::Seek(int index) {
+  return scanner_->Seek(index);
+}
+
+ErrorReporter* ParserConnector::GetError() {
+  return reporter_;
+}
+
+}
diff --git a/src/mocha/roaster/nexc/binding/parser_connector.h b/src/mocha/roaster/nexc/binding/parser_connector.h
new file mode 100755
index 0000000..2f348eb
--- /dev/null
+++ b/src/mocha/roaster/nexc/binding/parser_connector.h
@@ -0,0 +1,78 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef mocha_parser_connector_h_
+#define mocha_parser_connector_h_
+
+#include <string>
+#include <mocha/roaster/memory/pool.h>
+#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
+#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
+
+namespace mocha {
+
+class Compiler;
+class Scanner;
+class AstRoot;
+class TokenInfo;
+class SourceStream;
+class ErrorReporter;
+
+/**
+ * @class
+ * Connector of mocha and bison generated parser.
+ */
+class ParserConnector : public memory::Allocated {
+
+ public:
+
+  /**
+   * @construcor
+   * @param {Scanner*} scanner -> Scanner instance.
+   * @param {ErrorReporter*} reporter -> ErrorReporter instance.
+   */
+  ParserConnector(Scanner* scanner, ErrorReporter* reporter);
+
+  void Initialize();
+
+  ~ParserConnector ();
+
+  /**
+   * @public
+   * @param {void*} yylval -> Type erasured args. real type is ParserImplementation::semantic_type*
+   * Run mocha::Scanner::GetToken().
+   */
+  TokenInfo* Advance(int len = 1);
+  TokenInfo* Undo(int len = 1);
+  TokenInfo* Seek(int len = 1);
+
+  ErrorReporter* GetError();
+
+ private :
+  Scanner* scanner_;
+  ErrorReporter* reporter_;
+};
+
+}
+
+#endif
+
diff --git a/src/mocha/roaster/nexc/compilation_info/compilation_info.cc b/src/mocha/roaster/nexc/compilation_info/compilation_info.cc
new file mode 100755
index 0000000..72f8618
--- /dev/null
+++ b/src/mocha/roaster/nexc/compilation_info/compilation_info.cc
@@ -0,0 +1,78 @@
+#include <mocha/roaster/platform/fs/fs.h>
+#include <mocha/roaster/utils/compilation_info.h>
+#include <mocha/roaster/consts/consts.h>
+namespace mocha {
+
+static const int debug = 0;
+static const int compress = 1;
+static const int pretty_print = 2;
+static const int file = 3;
+
+CompilationInfo::CompilationInfo(const char* str) : str_(str) {
+  versions_.insert(VersionPair(Consts::kVersionAll, 1));
+  versions_.insert(VersionPair(Consts::kVersionNone, 1));
+  std::string base_dir = os::fs::Path::home_directory();
+  base_dir += "/.mocha/";
+  base_dir += "module/";
+  lib_dir_.push_back(base_dir);
+}
+
+bool CompilationInfo::Debug() const {
+  return flags_.At(debug);
+}
+
+void CompilationInfo::SetDebug() {
+  flags_.Set(debug);
+  versions_.insert(VersionPair(Consts::kVersionDebug, 1));
+}
+
+bool CompilationInfo::Compress() const {
+  return flags_.At(compress);
+}
+
+void CompilationInfo::SetCompress() {
+  flags_.Set(compress);
+}
+
+bool CompilationInfo::PrettyPrint() const {
+  return flags_.At(pretty_print);
+}
+
+void CompilationInfo::SetPrettyPrint() {
+  flags_.Set(pretty_print);
+}
+
+void CompilationInfo::SetVersion(const char* name) {
+  Versions::iterator entry = versions_.find(name);
+  if (entry == versions_.end()) {
+    versions_.insert(VersionPair(name, 1));
+  }
+}
+
+bool CompilationInfo::HasVersion(const char* name) const {
+  Versions::const_iterator entry = versions_.find(name);
+  if (entry == versions_.end()) {
+    return false;
+  } else {
+    return true;
+  }
+}
+
+void CompilationInfo::MarkAsFile() {
+  flags_.Set(file);
+}
+
+bool CompilationInfo::IsFile() const {
+  return flags_.At(file);
+}
+
+void CompilationInfo::SetCharset(const char* charset) {
+  charset_ = charset;
+}
+
+void CompilationInfo::SetLibDirectory(const char* path) {
+  std::string dir = path;
+  lib_dir_.push_back(dir);
+}
+
+}
diff --git a/src/mocha/roaster/nexc/compilation_info/compilation_info.h b/src/mocha/roaster/nexc/compilation_info/compilation_info.h
new file mode 100755
index 0000000..0dcb363
--- /dev/null
+++ b/src/mocha/roaster/nexc/compilation_info/compilation_info.h
@@ -0,0 +1,40 @@
+#ifndef mocha_compile_info_h_
+#define mocha_compile_info_h_
+#include <string>
+#include <vector>
+#include <mocha/roaster/misc/bits.h>
+#include <mocha/misc/int_types.h>
+#include <mocha/roaster/lib/unordered_map.h>
+namespace mocha {
+typedef std::vector<std::string> LibDirectories;
+class CompilationInfo {
+  typedef std::pair<const char*, uint8_t> VersionPair;
+  typedef roastlib::unordered_map<std::string, uint8_t> Versions;
+ public :
+  CompilationInfo();
+  ~CompilationInfo(){};
+  bool Debug() const;
+  void SetDebug();
+  bool Compress() const;
+  void SetCompress();
+  bool PrettyPrint() const;
+  void SetPrettyPrint();
+  bool HasVersion(const char*) const;
+  void SetVersion(const char*);
+  void MarkAsFile();
+  void SetCharset(const char* charset);
+  bool HasCharset() const { return !charset_.empty();}
+  const char* charset() const {return charset_.c_str();};
+  void SetLibDirectory(const char* dir);
+  bool HasOptionalIdentifier() const { return !optional_identifier_.empty(); }
+  const LibDirectories& lib_directories() const { return lib_dir_; };
+ private :
+  std::string charset_;
+  LibDirectories lib_dir_;
+  BitVector8 flags_;
+  Versions versions_;
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/events/compilation_event/compilation_event.h b/src/mocha/roaster/nexc/events/compilation_event/compilation_event.h
new file mode 100755
index 0000000..752fa0b
--- /dev/null
+++ b/src/mocha/roaster/nexc/events/compilation_event/compilation_event.h
@@ -0,0 +1,67 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_roaster_compiler_compilation_event_h_
+#define mocha_roaster_compiler_compilation_event_h_
+#include <string>
+#include <mocha/roaster/memory/pool.h>
+namespace mocha {
+class Nexc;
+class ErrorReporter;
+class ParserConnector;
+class FileRoot;
+class CompilationEvent : public memory::Allocated {
+ public :
+  CompilationEvent(Nexc* nexc, ErrorReporter* reporter, memory::Pool* pool)
+      : nexc_(nexc),
+        error_reporter_(reporter),
+        pool_(pool){}
+  ~CompilationEvent(){}
+  const char* source() const {return source_.c_str();}
+  const char* path() const {return path_.c_str();}
+  const char* filename() const {return filename_.c_str();}
+  const char* charset() const {return charset_.c_str();}
+  memory::Pool* pool() {return pool_;}
+  ErrorReporter* error_reporter() {return error_reporter_;}
+  ParserConnector* parser_connector() {return parser_connector_;}
+  FileRoot* ast() {return ast_;}
+  void set_source(const char* source) {source_ = source;}
+  void set_path(const char* path) {path_ = path;}
+  void set_filename(const char* filename) {filename_ = filename;}
+  void set_ast(FileRoot* root) {ast_ = root;}
+  void set_charset(const char* charset) {charset_ = charset;}
+  void set_parser_connector(ParserConnector* connector) {parser_connector_ = connector;}
+  void NotifyForKey(const char* key) {nexc_->NotifyForKey(key, this);}
+ private :
+  std::string path_;
+  std::string filename_;
+  std::string source_;
+  std::string charset_;
+  Nexc* nexc_;
+  ErrorReporter* error_reporter_;
+  memory::Pool* pool_;
+  ParserConnector* parser_connector_;
+  FileRoot* ast_;
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/events/io_event/io_event.cc b/src/mocha/roaster/nexc/events/io_event/io_event.cc
new file mode 100755
index 0000000..1882d85
--- /dev/null
+++ b/src/mocha/roaster/nexc/events/io_event/io_event.cc
@@ -0,0 +1,36 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <mocha/roaster/nexc/events/io_event/io_event.h>
+namespace mocha {
+IOEvent::IOEvent(const char* path, const char* data)
+    : errno_(0),
+      path_(path),
+      data_(data){}
+IOEvent::IOEvent(const char* path, std::stringstream* data)
+    : errno_(0),
+      path_(path),
+      data_(data->str()){}
+IOEvent::IOEvent(const char* path, const char* data, int type)
+    : errno_(type),
+      path_(path),
+      data_(data){}
+}
diff --git a/src/mocha/roaster/nexc/events/io_event/io_event.h b/src/mocha/roaster/nexc/events/io_event/io_event.h
new file mode 100755
index 0000000..8c87b31
--- /dev/null
+++ b/src/mocha/roaster/nexc/events/io_event/io_event.h
@@ -0,0 +1,45 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <string>
+#include <sstream>
+#include <mocha/roaster/memory/pool.h>
+namespace mocha {
+class IOEvent : public memory::Allocated {
+ public :
+  IOEvent(const char* path, const char* data);
+  IOEvent(const char* path, std::stringstream* data);
+  IOEvent(const char* path, const char* data, int error);
+  const char* path() const {return path_.c_str();}
+  const char* data() const {return data_.c_str();}
+  int error_type() const { return errno_; }
+  enum {
+    kNoError,
+    kNotFound,
+    kNotAFile,
+    kError
+  };
+ private :
+  int errno_;
+  std::string path_;
+  std::string data_;
+};
+}
diff --git a/src/mocha/roaster/nexc/loader/SConscript b/src/mocha/roaster/nexc/loader/SConscript
new file mode 100755
index 0000000..929d0f6
--- /dev/null
+++ b/src/mocha/roaster/nexc/loader/SConscript
@@ -0,0 +1,42 @@
+import os, sys
+root_dir = os.path.dirname(File('SConscript').rfile().abspath + '/../../../../')
+sys.path.insert(0, os.path.join(root_dir, 'tools/scons_helper'))
+from platform_utils import Config
+from test import TestBuilder
+Import('CURRENT')
+Import('ENV')
+Import('CONFIG')
+ROOT = os.getcwd().replace('\\', '/')
+TEST_CONFIG = CONFIG.Copy()
+TEST_CONFIG.Extend({
+        "linux" : {
+            "LD_FLAGS" : "",
+            "LIBS" : ['pthread'],
+            "EXCLUDE_FILES" : [],
+            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-posix.cc",
+                         CURRENT + "/src/mocha/roaster/platform/thread/thread-posix.cc"]
+            },
+        'macos' : {
+            "LD_FLAGS" : "",
+            "LIBS" : [],
+            "STATIC_LIBS" : [],
+            "EXCLUDE_FILES" : [],
+            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-posix.cc",
+                         CURRENT + "/src/mocha/roaster/platform/thread/thread-posix.cc"]
+            },
+        "win32" : {
+            "LD_FLAGS" : "/NOLOGO /MACHINE:X86 /LTCG",
+            "LIBS" : [],
+            "EXCLUDE_FILES" : [],
+            "DEPENDS" : [CURRENT + "/src/mocha/roaster/platform/utils/utils-win32.cc",
+                         CURRENT + "/src/mocha/roaster/platform/thread/thread-win32.cc"]
+            }
+        })
+TEST_CONFIG.set_base(ROOT)
+builder = TestBuilder(ARGUMENTS.get('mode'), ['ut.cc','loader.cc',
+                                              CURRENT + "/src/mocha/roaster/platform/fs/stat/stat.cc",
+                                              CURRENT + '/src/mocha/roaster/compiler/events/io_event/io_event.cc',
+                                              CURRENT + '/src/mocha/roaster/memory/pool.cc'],
+                      ENV, TEST_CONFIG)
+builder.Build(CURRENT + '/src', ROOT)
+
diff --git a/src/mocha/roaster/nexc/loader/loader.cc b/src/mocha/roaster/nexc/loader/loader.cc
new file mode 100755
index 0000000..c5492a1
--- /dev/null
+++ b/src/mocha/roaster/nexc/loader/loader.cc
@@ -0,0 +1,87 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <string.h>
+#include <mocha/roaster/assert/assert_def.h>
+#include <mocha/roaster/nexc/loader/loader.h>
+#include <mocha/roaster/platform/utils/utils.h>
+#include <mocha/roaster/platform/fs/stat/stat.h>
+#define BUF_SIZE 128
+
+namespace mocha {
+Loader::Loader(){}
+Loader::~Loader(){}
+void Loader::LoadFile(const char* path) {
+  ASSERT(true, strlen(path) > 0);
+  os::fs::Stat stat(path);
+  if (stat.IsExist() && !stat.IsDir()) {
+    FILE* fp = os::FOpen(path, "rb");
+    //Check is file exist.
+    if (fp != NULL) {
+      std::stringstream st;
+      ReadNormalFile(fp, &st);
+      IOEvent *e = new(&pool_) IOEvent(path, &st);
+      NotifyForKey(kComplete, e);
+    } else {
+      HandleError(path, kFOpenError);
+    }
+  } else if (stat.IsDir()){
+    HandleError(path, kNotAFile);
+  } else {
+    HandleError(path, kNotFound);
+  }
+}
+
+void Loader::HandleError(const char* path, int type) {
+  std::string buf;
+  int error_type = 0;
+  ASSERT(true, (type == kFOpenError || type == kNotAFile || type == kNotFound));
+  if (type == kFOpenError) {
+    error_type = IOEvent::kError;
+    os::Strerror(&buf, K_ERRNO);
+  } else if (type == kNotAFile) {
+    error_type = IOEvent::kNotAFile;
+    os::SPrintf(&buf, "%s is a directory.", path);
+  } else if (type == kNotFound) {
+    error_type = IOEvent::kNotFound;
+    os::SPrintf(&buf, "%s No such file.", path);
+  }
+  IOEvent *e = new(&pool_) IOEvent(path, buf.c_str(), error_type);
+  NotifyForKey(kError, e);
+}
+
+void Loader::ReadNormalFile(FILE* fp, std::stringstream* st) {
+  int read = 0;
+  char tmp[128];
+  while ((read = fread(tmp, sizeof(char), 127, fp))) {
+    tmp[read] = '\0';
+    (*st) << tmp;
+    if (read < (BUF_SIZE - 1)) {
+      break;
+    }
+    tmp[0] = '\0';
+  }
+}
+
+const char Loader::kComplete[] = {"Loader<Complete>"};
+const char Loader::kError[] = {"Loader<Error>"};
+
+}
diff --git a/src/mocha/roaster/nexc/loader/loader.h b/src/mocha/roaster/nexc/loader/loader.h
new file mode 100755
index 0000000..8224b9f
--- /dev/null
+++ b/src/mocha/roaster/nexc/loader/loader.h
@@ -0,0 +1,48 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_compiler_loader_loader_h_
+#define mocha_compiler_loader_loader_h_
+#include <stdio.h>
+#include <string>
+#include <sstream>
+#include <mocha/roaster/notificator/notificator.h>
+#include <mocha/roaster/nexc/events/io_event/io_event.h>
+namespace mocha {
+class Loader : public Notificator<IOEvent*> {
+ public :
+  Loader();
+  ~Loader();
+  void LoadFile(const char* path);
+  static const char kComplete[];
+  static const char kError[];
+ private :
+  enum {
+    kFOpenError,
+    kNotAFile,
+    kNotFound
+  };
+  void ReadNormalFile(FILE* fp, std::stringstream *st);
+  void HandleError(const char* path, int type);
+  memory::Pool pool_;
+};
+}
+#endif
diff --git a/src/mocha/roaster/nexc/loader/ut.cc b/src/mocha/roaster/nexc/loader/ut.cc
new file mode 100755
index 0000000..19fbff8
--- /dev/null
+++ b/src/mocha/roaster/nexc/loader/ut.cc
@@ -0,0 +1,95 @@
+#include <gtest/gtest.h>
+#include <mocha/roaster/platform/utils/utils.h>
+#include <mocha/roaster/esc/loader/loader.h>
+const char path[] = {CURRENT_DIR"/src/mocha/roaster/esc/loader/loader.h"};
+class TestCPLitener {
+ public :
+  TestCPLitener(int* state)
+      : state_(state){}
+  TestCPLitener(const TestCPLitener& listener) {
+    state_ = listener.state_;
+  }
+  void operator()(mocha::IOEvent* e) {
+    ASSERT_EQ(0, strcmp(e->path(), path));
+    (*state_) = 1;
+  }
+ private :
+  int* state_;
+};
+
+class TestERLitener {
+ public :
+  TestERLitener(int* state)
+      : state_(state){}
+  TestERLitener(const TestERLitener& listener) {
+    state_ = listener.state_;
+  }
+  void operator()(mocha::IOEvent* e) {
+    (*state_) = -1;
+  }
+ private :
+  int *state_;
+};
+
+class TestNotFoundLitener {
+ public :
+  TestNotFoundLitener(int* state)
+      : state_(state){}
+  TestNotFoundLitener(const TestNotFoundLitener& listener) {
+    state_ = listener.state_;
+  }
+  void operator()(mocha::IOEvent* e) {
+    ASSERT_EQ(mocha::IOEvent::kNotFound, e->error_type());
+    (*state_) = -1;
+  }
+ private :
+  int *state_;
+};
+
+class TestNotAFileLitener {
+ public :
+  TestNotAFileLitener(int* state)
+      : state_(state){}
+  TestNotAFileLitener(const TestNotAFileLitener& listener) {
+    state_ = listener.state_;
+  }
+  void operator()(mocha::IOEvent* e) {
+    ASSERT_EQ(mocha::IOEvent::kNotAFile, e->error_type());
+    (*state_) = -1;
+  }
+ private :
+  int *state_;
+};
+
+TEST(LoaderTest, LoadTest) {
+  mocha::Loader loader;
+  int state = 0;
+  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
+  loader.AddListener(mocha::Loader::kError, TestERLitener(&state));
+  loader.LoadFile(path);
+  if (state != 1) {
+    FAIL();
+  }
+}
+
+TEST(LoaderTest, LoadNotAFileTest) {
+  mocha::Loader loader;
+  int state = 0;
+  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
+  loader.AddListener(mocha::Loader::kError, TestNotAFileLitener(&state));
+  loader.LoadFile(CURRENT_DIR"/src");
+  if (state != -1) {
+    FAIL();
+  }
+}
+
+TEST(LoaderTest, LoadNoSuchFileTest) {
+  mocha::Loader loader;
+  int state = 0;
+  loader.AddListener(mocha::Loader::kComplete, TestCPLitener(&state));
+  loader.AddListener(mocha::Loader::kError, TestNotFoundLitener(&state));
+  loader.LoadFile(CURRENT_DIR"/src/aaaa");
+  if (state != -1) {
+    FAIL();
+  }
+}
diff --git a/src/mocha/roaster/nexc/nexc.cc b/src/mocha/roaster/nexc/nexc.cc
new file mode 100755
index 0000000..0359b1d
--- /dev/null
+++ b/src/mocha/roaster/nexc/nexc.cc
@@ -0,0 +1,98 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <mocha/roaster/nexc/nexc.h>
+#include <mocha/roaster/nexc/loader/loader.h>
+#include <mocha/roaster/utils/error_reporter.h>
+#include <mocha/roaster/nexc/events/compilation_event/compilation_event.h>
+namespace mocha {
+class LoadCompleteListener {
+ public :
+  LoadCompleteListener(Nexc* compiler)
+      : compiler_(compiler){}
+  ~LoadCompleteListener(){}
+  LoadCompleteListener(const LoadCompleteListener& listener) {
+    compiler_ = listener.compiler_;
+  }
+  void operator()(IOEvent* e) {
+    compiler_->event()->set_source(e->data());
+    compiler_->NotifyForKey(Nexc::kParse, compiler_->event());
+  }
+ private :
+  Nexc* compiler_;
+};
+
+class LoadErrorListener {
+ public :
+  LoadErrorListener(Nexc* nexc, bool fatal)
+      : fatal_(fatal),
+        compiler_(nexc){}
+  ~LoadErrorListener(){}
+  LoadErrorListener(const LoadErrorListener& listener) {
+    fatal_ = listener.fatal_;
+    compiler_ = listener.compiler_;
+  }
+  void operator()(IOEvent* e) {
+    compiler_->event()->error_reporter()->ReportSysError(e->data());
+    if (fatal_) {
+      compiler_->NotifyForKey(Nexc::kFatal, compiler_->event());
+    } else {
+      compiler_->NotifyForKey(Nexc::kFail, compiler_->event());
+    }
+  }
+ private :
+  bool fatal_;
+  Nexc* compiler_;
+};
+
+
+Nexc::Nexc()
+    : reporter_(new ErrorReporter),
+      pool_(memory::Pool::Local()){
+  Initialize();
+}
+
+void Nexc::CompileFile(const char* filename, const char* charset) {
+  event_->set_charset(charset);
+  Loader loader;
+  loader.AddListener(Loader::kComplete, LoadCompleteListener(this));
+  loader.AddListener(Loader::kError, LoadErrorListener(this, true));
+  loader.LoadFile(filename);
+}
+
+void Nexc::Compile(const char* source, const char* charset) {}
+
+void Nexc::Initialize() {
+  event_ = new(pool_.Get()) CompilationEvent(this, reporter_.Get(), pool_.Get());
+  //AddListener(kParse, Parser::ParseEventListener());
+  //AddListener(kTransformAst, TransformEventLitener());
+}
+
+void Nexc::Abort(IOEvent* e) {
+}
+
+const char Nexc::kParse[] = {"Nexc<Parse>"};
+const char Nexc::kTransformAst[] = {"Nexc<TransformAst>"};
+const char Nexc::kFatal[] = {"Nexc<Fatal>"};
+const char Nexc::kFail[] = {"Nexc<Fail>"};
+const char Nexc::kImport[] = {"Nexc<Import>"};
+}
diff --git a/src/mocha/roaster/nexc/nexc.h b/src/mocha/roaster/nexc/nexc.h
new file mode 100755
index 0000000..7d14db1
--- /dev/null
+++ b/src/mocha/roaster/nexc/nexc.h
@@ -0,0 +1,53 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_roaster_compiler_compiler_h_
+#define mocha_roaster_compiler_compiler_h_
+#include <mocha/roaster/memory/pool.h>
+#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
+#include <mocha/roaster/notificator/notificator.h>
+namespace mocha {
+class IOEvent;
+class CompilationEvent;
+class ErrorReporter;
+class Nexc : public Notificator<CompilationEvent*>{
+ public :
+  Nexc();
+  ~Nexc(){};
+  void CompileFile(const char* filename, const char* charset = NULL);
+  void Compile(const char* source, const char* charset = NULL);
+  CompilationEvent* event() {return event_;}
+  static const char kParse[];
+  static const char kTransformAst[];
+  static const char kFatal[];
+  static const char kFail[];
+  static const char kImport[];
+ private :
+  void Initialize();
+  void ImportFile(const char* filename);
+  void Abort(IOEvent* e);
+  CompilationEvent* event_;
+  SharedPtr<ErrorReporter> reporter_;
+  SharedPtr<memory::Pool> pool_;
+};
+}
+#endif
diff --git a/src/mocha/roaster/nexc/parser/parser.cc b/src/mocha/roaster/nexc/parser/parser.cc
new file mode 100755
index 0000000..71a2da3
--- /dev/null
+++ b/src/mocha/roaster/nexc/parser/parser.cc
@@ -0,0 +1,3888 @@
+#include <assert.h>
+#include <vector>
+#include <sstream>
+#include <mocha/roaster/ast/ast.h>
+#include <mocha/roaster/ast/builder/ast_builder.h>
+#include <mocha/roaster/utils/error_reporter.h>
+#include <mocha/roaster/parser/parser.h>
+#include <mocha/roaster/scanner/token_stream.h>
+#include <mocha/roaster/tokens/js_token.h>
+#include <mocha/roaster/tokens/symbol_list.h>
+
+namespace mocha {
+
+static const char use_strict[] = { "use strict" };
+static const char literals[] = { "'identifier', 'String', 'Number', 'Boolean', 'this', 'RegExp'" };
+#define RETURN_FLG 0
+#define YIELD_FLG 1
+//Shortcut for syntax error reporter.
+#define SYNTAX_ERROR(msg) {                           \
+    std::stringstream st;                               \
+    st << msg;                                          \
+    reporter_->ReportSyntaxError(st.str().c_str());   \
+  }
+
+//Check error occured or not.
+//If error occured, immediate return an argument value.
+#define CHECK_ERROR(name) {                     \
+    if (reporter_->Error()) {                 \
+      return name;                              \
+    }                                           \
+  }
+
+//Debug flag.
+//#define PARSER_DEBUG 1
+
+//Print parser move to fp.
+#ifdef PARSER_DEBUG
+
+#define ENTER(mode)                                                     \
+  fflush(stdout);                                                       \
+  indent_+=' ';                                                         \
+  fprintf(stdout, "%snext token = %s enter %s %d\n", indent_.c_str(),TokenConverter(Seek()).cstr(),#mode, depth_); \
+  depth_++
+
+#define END(mode)                                                       \
+  fflush(stdout);                                                       \
+  fprintf(stdout, "%snext token = %s end %s %d\n", indent_.c_str(),TokenConverter(Seek()).cstr(),#mode, depth_); \
+  depth_--;                                                             \
+  indent_.erase(0,1)
+
+#else
+#define ENTER(mode)
+#define END(mode)
+#endif
+
+/**
+ * @param {int} type
+ * @returns bool
+ * Check current token type is END_TOKEN or END_OF_INPUT.
+ */
+bool IsEnd(int type) {
+  return type == Token::END_TOKEN || type == Token::END_OF_INPUT;
+}
+
+/**
+ * @param {int} type
+ * @returns bool
+ * Callback function for ParseStatementList_.
+ * Match block like structure.
+ */
+bool BlockBodyMatcher(int type) {
+  return type != '}';
+}
+
+/**
+ * @param {int} type
+ * @returns bool
+ * Callback function for ParseStatementList_.
+ * Match case clause body.
+ */
+bool CaseBodyMatcher(int type) {
+  return type != '}' && type != Token::JS_CASE && type != Token::JS_DEFAULT;
+}
+
+/**
+ * @param {int} type
+ * @returns bool
+ * Check the type is a valid object literal property name.
+ */
+bool IsValidPropertyName(int type) {
+  return type == Token::JS_IDENTIFIER ||
+      type == Token::JS_STRING_LITERAL ||
+      type == Token::JS_NUMERIC_LITERAL;
+}
+
+/**
+ * @param {int} type
+ * @returns bool
+ * Check the type is a valid object literal member.
+ */
+bool IsValidProperty(int type) {
+  return type == Literal::kString ||
+      type == Literal::kNumeric ||
+      type == Literal::kIdentifier ||
+      type == Literal::kProperty;
+}
+
+
+Parser::ParseEventListener::operator()(CompilationEvent* event) {
+  ParserConnector* connector = event->parser_connector();
+  ErrorReporter* reporter = event->error_reporter();
+  const char* filename = event->filename();
+  Parser parser(connector, reporter, filename);
+  event->set_ast(parser.Parse());
+  event->notificator()->NotifyForKey(CompilationEvent::EventKey::kTransform, event);
+}
+
+
+/**
+ * @param {AstNode} args
+ * @param {AstNode} list
+ * Arrow function expression with formal parameter is parsed as expression at first.
+ * So we convert an arrow function expression's formal parameter list to a valid formal parameter list.
+ */
+NodeList* Parser::FormalParameterConvertor(AstNode *args) {
+  NodeIterator iterator = args->ChildNodes();
+  NodeList* result = new(pool()) NodeList;
+  while (iterator.HasNext()) {
+    AstNode* item = iterator.Next();
+    result->AddChild(item);
+    Expression* maybe_exp = item->CastToExpression();
+    Literal* maybe_ident = item->CastToLiteral();
+    CallExp* maybe_member = maybe_exp->CastToCallExp();
+    ObjectLikeLiteral* maybe_dst = item->CastToExpression()->CastToObjectLikeLiteral();
+    ArrayLikeLiteral* maybe_dst_array = item->CastToExpression()->CastToArrayLikeLiteral();
+    //process ...rest parameter
+    if (!maybe_ident &&
+         !maybe_dst &&
+         !maybe_dst_array &&
+         !maybe_member &&
+         item->node_type() != Literal::kAssignmentExp) {
+      SYNTAX_ERROR("malformed formal parameter list\\nin file "
+                    << filename_ << " at line " << Seek(-1)->line_number());
+      return result;
+    } else if (maybe_dst || maybe_dst_array) {
+      if (!item->CastToExpression()->IsValidLhs()) {
+        SYNTAX_ERROR("malformed formal parameter list\\nin file "
+                      << filename_ << " at line " << Seek(-1)->line_number());
+      }
+    } else if (maybe_ident) {
+      if (maybe_ident->value_type() == Literal::kSpread) {
+        maybe_ident->set_value_type(Literal::kRest);
+      }
+    } else if (item->node_type() == Literal::kAssignmentExp) {
+      AssignmentExp* assign = item->CastToExpression()->CastToAssigment();
+      AstNode* left = assign->left_value();
+      maybe_ident = left->CastToLiteral();
+      maybe_dst = left->CastToExpression()->CastToObjectLikeLiteral();
+      maybe_dst_array = left->CastToExpression()->CastToArrayLikeLiteral();
+      if (!maybe_ident &&
+           !maybe_dst &&
+           !maybe_dst_array) {
+        SYNTAX_ERROR("malformed formal parameter list\\nin file "
+                      << filename_ << " at line " << Seek(-1)->line_number());
+        return result;
+      }
+    } else if (maybe_member) {
+      AstNode* callable = maybe_member->callable();
+      while (callable->node_type() == AstNode::kCallExp) {
+        callable = callable->CastToExpression()->CastToCallExp()->callable();
+      }
+      Literal* literal = callable->CastToLiteral();
+      if (!literal && literal->value_type() != Literal::kThis &&
+           literal->value_type() != Literal::kPrivate) {
+        SYNTAX_ERROR("malformed formal parameter list\\nin file "
+                      << filename_ << " at line " << Seek(-1)->line_number());
+        return result;
+      }
+    }
+    result->AddChild(item);
+  }
+  return result;
+}
+
+
+class Parser::StateStack {
+ public :
+  typedef enum {
+    kClassDecl,
+    kParseBegin,
+    kFinally,
+    kFunction,
+    kModule
+  } ParserState;
+  typedef std::vector<ParserState> StateArray;
+  void Push(ParserState state) { stack_.push_back(state); }
+  void Pop() { stack_.pop_back(); }
+  bool Has(ParserState state) {
+    StateArray::iterator begin = stack_.begin();
+    StateArray::iterator end = stack_.end();
+    while (begin != end) {
+      if (state == (*begin)) {
+        return true;
+      }
+      ++begin;
+    }
+    return false;
+  }
+ private :
+  StateArray stack_;
+};
+
+Parser::Parser(ParserConnector* connector, ErrorReporter* reporter, const char* filename)
+    : filename_(filename),
+      depth_(0),
+      pool_(memory::Pool::Local()),
+      builder_(AstBuilder::Local()),
+      connector_(connector),
+      reporter_(reporter),
+      state_stack_(new StateStack){}
+Parser::~Parser(){}
+
+
+//The entrance for parser.
+//We return the FileRoot node not AstRoot.
+FileRoot* Parser::Parse() {
+  FileRoot* root = new(pool()) FileRoot(filename_);
+  root->Append(ParseProgram());
+  builder()->FindDirectivePrologue(root, root);
+  /**
+   * The finally data structure image.
+   * ---------------FileRoot------------
+   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
+   * statement statement statement statement
+   */
+  return root;
+}
+
+//Report illegal end of input.
+void Parser::IllegalEnd(const char* expect, int64_t line) {
+  SYNTAX_ERROR("parse error got unexpected end of input expect "
+                << expect << "\\nin file " << filename_ << " at line " << line);
+}
+
+
+void Parser::ParseTerminator() {
+  TokenInfo *token = Seek();
+  int type = token->type();
+  if (type == ';' || type == '}' || IsEnd(type) || token->linebreak_before()) {
+    if (type == ';') {
+      Advance();
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " expect ';' or 'line break'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+  }
+}
+
+//Begining of parse.
+AstNode* Parser::ParseProgram() {
+  ENTER(Program);
+  /*
+   *program
+   * : source_elements
+   */
+  AstNode* list = ParseSourceElements();
+  END(Program);
+  return list;
+}
+
+
+//ParseSourceElements_ is only called by ParseProgram.
+//If this function is called,
+//this function search until got END_TOKEN or END_OF_INPUT.
+//This function is only called once in each parse time.
+AstNode* Parser::ParseSourceElements() {
+  ENTER(SourceElements);
+  /*
+   *source_elements
+   *: source_element
+   *| source_elements source_element
+   */
+  //Check once flag.
+  assert(state_stack_->Has(StateStack::kParseBegin) == false);
+  state_stack_->Push(StateStack::kParseBegin);
+  TokenInfo* token;
+  NodeList* list = new(pool()) NodeList;
+  while ((token = Seek()) && token != 0 && token->type() != Token::END_TOKEN && token->type() != Token::END_OF_INPUT) {
+    AstNode* statement = ParseSourceElement();
+    CHECK_ERROR(statement);
+    list->AddChild(statement);
+  }
+  END(SourceElements);
+  /**
+   * The finally data structure image.
+   * ---------------NodeList------------
+   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
+   * statement statement statement statement
+   */
+  return list;
+}
+
+AstNode* Parser::ParseSourceElement() {
+  ENTER(SourceElement);
+  /*
+   * [bison/yacc compat syntax]
+   * source_element
+   * : statement
+   * | class_declaration
+   * | function_declaration
+   * | const_declaration
+   * ;
+   */
+  TokenInfo* info = Advance();
+  AstNode* result = 0;//init after;
+  if (info == 0 || info->type() == Token::END_TOKEN || info->type() == Token::END_OF_INPUT) {
+    return new(pool()) Empty;
+  }
+  /*
+   * The declaration of class,function and const or let is declarable only in
+   * the block statement body or function body or global.
+   */
+  switch (info->type()) {
+    case Token::JS_CLASS :{
+      result = ParseClassDecl(false);
+      ExpressionStmt* stmt = new(pool()) ExpressionStmt(info->line_number());
+      stmt->AddChild(result);
+      result = stmt;
+    }
+      break;
+
+    case Token::JS_FUNCTION : {
+      result = ParseFunctionDecl(false);
+      CHECK_ERROR(result);
+      Function* fn = result->CastToExpression()->CastToFunction();
+      fn->MarkAsDeclaration();
+    }
+      break;
+
+      //Now the const decaration is parsable, but not create block scope,
+      //because block scoping overhead are heavy for the current javascript.
+    case Token::JS_CONST : {
+      info = Seek();
+      //check syntax for const class decl.
+      if (info->type() == Token::JS_CLASS) {
+        Advance();
+        result = ParseClassDecl(true);
+        CHECK_ERROR(result);
+      } else {
+        TokenInfo* function_signature = Seek(2);
+        //check syntax for const function.
+        if (function_signature->type() == '(' || function_signature->type() == Token::JS_FUNCTION_GLYPH ||
+             function_signature->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+          result = ParseFunctionDecl(true);
+          CHECK_ERROR(result);
+          Function* fn = result->CastToExpression()->CastToFunction();
+          fn->MarkAsConstDeclaration();
+        } else {
+          result = ParseVariableStatement();
+          CHECK_ERROR(result);
+          result->first_child()->CastToExpression()->CastToVariableDeclarationList()->MarkAsConstDeclaration();
+        }
+      }
+      break;
+    }
+      //Now the let statement is parsable, but not create block scope,
+      //same reasons with above const declaration.
+    case Token::JS_LET :
+      result = ParseLetExpressionOrLetStatement();
+      CHECK_ERROR(result);
+      break;
+
+    default :
+      Undo();
+      result = ParseStatement();
+      CHECK_ERROR(result);
+  }
+  END(SourceElement);
+  return result;
+}
+
+//Parse the statement list,
+//like the block statement body or the function body.
+AstNode* Parser::ParseStatementList(StatementListMatcher matcher, const char* expect) {
+  /**
+   * [bison/yacc compat syntax]
+   * statement_list
+   * : statement
+   * | statement_list statement
+   * ;
+   */
+  ENTER(StatementList);
+  TokenInfo* token = Seek();
+  StatementList* list = new(pool()) StatementList;
+  while (matcher(token->type())) {
+    AstNode* statement = ParseSourceElement();
+    CHECK_ERROR(statement);
+    list->AddChild(statement);
+    token = Seek();
+    if (IsEnd(token->type())) {
+      SYNTAX_ERROR("parse error unexpected end of input expect "
+                    << expect
+                    << " in file " << filename_ << " at line " << token->line_number());
+      return list;
+    }
+  }
+  END(StatementList);
+  /**
+   * The finally data structure image.
+   * ---------------StatementList--------------
+   * |                                                                                                                                                                   |                                                                                                                                                                                      |                                                                                                                                                                                       |
+   * statement statement                                                                statement statement
+   */
+  return list;
+}
+
+
+//Parse statement.
+AstNode* Parser::ParseStatement() {
+  ENTER(Statement);
+  /*
+   *statement_no_block
+   *: block
+   *| module_block
+   *| export_statement
+   *| variable_statement
+   *| empty_statement
+   *| if_statement
+   *| iteration_statement
+   *| continue_statement
+   *| break_statement
+   *| return_statement
+   *| with_statement
+   *| labelled_statement
+   *| switch_statement
+   *| throw_statement
+   *| try_statement
+   *| import_statement
+   *| version_statement
+   *| function_declaration
+   *| exportable_denifinition
+   *| debugger_statement
+   *| expression_statement
+   *;
+   */
+  TokenInfo* token = Advance();
+  AstNode* result;
+  switch (token->type()) {
+    case '{' :
+      result = ParseBlockStatement();
+      break;
+
+    case Token::JS_MODULE :
+      result = ParseModuleStatement();
+      break;
+
+    case Token::JS_EXPORT :
+      result = ParseExportStatement();
+      break;
+
+    case Token::JS_VAR :
+      result = ParseVariableStatement();
+      break;
+
+    case ';' :
+      result = new(pool()) Empty;
+      break;
+
+    case Token::JS_IF :
+      result = ParseIFStatement(false);
+      break;
+
+    case Token::JS_FOR :
+      result = ParseForStatement(false);
+      break;
+
+    case Token::JS_WHILE :
+      result = ParseWhileStatement();
+      break;
+
+    case Token::JS_DO :
+      result = ParseDoWhileStatement(false);
+      break;
+
+    case Token::JS_CONTINUE :
+      result = ParseContinueStatement();
+      break;
+
+    case Token::JS_BREAK :
+      result = ParseBreakStatement();
+      break;
+
+    case Token::JS_RETURN :
+      result = ParseReturnStatement();
+      break;
+
+    case Token::JS_WITH :
+      result = ParseWithStatement();
+      break;
+
+    case Token::JS_SWITCH :
+      result = ParseSwitchStatement();
+      break;
+
+    case Token::JS_THROW :
+      result = ParseThrowStatement();
+      break;
+
+    case Token::JS_TRY :
+      result = ParseTryStatement();
+      break;
+
+    case Token::JS_IMPORT :
+      result = ParseImportStatement();
+      break;
+
+      //a mocha special keyword not harmony.
+    case Token::JS_ASSERT :
+      result = ParseAssertStatement();
+      break;
+
+      //a mocha special keyword not harmony.
+    case Token::MOCHA_VERSIONOF :
+      result = ParseVersionStatement();
+      break;
+
+    case Token::JS_FUNCTION : {
+      result = ParseFunctionDecl(false);
+      CHECK_ERROR(result);
+      Function* fn = result->CastToExpression()->CastToFunction();
+      fn->MarkAsDeclaration();
+    }
+      break;
+
+    case Token::JS_DEBUGGER :
+      result = ParseDebuggerStatement(token);
+      break;
+
+      //The exportable definition is only acceptable in class declaration,
+      //but private accessor is allowed in any place.
+    case Token::JS_PRIVATE :
+    case Token::JS_PUBLIC :
+    case Token::JS_STATIC : {
+      TokenInfo *token = Seek();
+      if (token->type() == '.' || token->type() == '[') {
+        //private accessor.
+        result = CheckLabellOrExpressionStatement();
+      } else {
+        result = ParseClassMemberStatement();
+      }
+    }
+      break;
+
+    default : {
+      if (token->type() == Token::JS_IDENTIFIER) {
+        TokenInfo* ident = token;
+        TokenInfo* token = Seek(2);
+        //Check trait declaration.
+        //The trait keyword is not treated as the reserved word.
+        if (strcmp(ident->token(), SymbolList::symbol(SymbolList::kTrait)) == 0 && token->type() == '{') {
+          result = ParseTrait();
+          CHECK_ERROR(result);
+          result->CastToExpression()->CastToTrait()->MarkAsDeclaration();
+          break;
+        }
+      }
+      result = CheckLabellOrExpressionStatement();
+      CHECK_ERROR(result);
+      //If shorten function expression is parsed as expression,
+      //we mark as function declaration.
+      if (result->node_type() == AstNode::kExpressionStmt) {
+        Expression* exp = result->first_child()->CastToExpression();
+        if (!exp->IsParenthesis() && exp->child_length() == 1) {
+          AstNode* item = exp->first_child();
+          if (item->node_type() == AstNode::kFunction) {
+            item->CastToExpression()->CastToFunction()->MarkAsDeclaration();
+            result = item;
+          }
+        } else if (!exp->IsParenthesis() && exp->child_length() > 1) {
+          if (exp->first_child()->node_type() == AstNode::kFunction) {
+            SYNTAX_ERROR("illegal trailing comma after function declaration.\\nIn file"
+                          << filename_ << " at line " << exp->line_number());
+          }
+        }
+      }
+    }
+  }
+  CHECK_ERROR(result);
+  END(Statement);
+  return result;
+}
+
+AstNode* Parser::ParseBlockStatement() {
+  ENTER(BlockStatement);
+  /*
+   * [bison/yacc compat syntax]
+   * block
+   * : '{' '}'
+   * | '{' statement_list '}'
+   */
+  TokenInfo* token = Seek();
+  BlockStmt* block = new(pool()) BlockStmt(token->line_number());
+  //Check block statement has body or not.
+  //If block body is empty -> {}, set Empty node to block body.
+  if (token->type() != '}') {
+    while (1) {
+      AstNode* statement = ParseSourceElement();
+      CHECK_ERROR(statement);
+      block->AddChild(statement);
+      token = Seek();
+      if (token->type() == '}') {
+        Advance();
+        break;
+      } else if (IsEnd(token->type())) {
+        IllegalEnd("'}'", token->line_number());
+        END(BlockStatementError);
+        return block;
+      }
+    }
+  } else {
+    Advance();
+  }
+  END(BlockStatement);
+  /**
+   * The finally data structure image.
+   * --------------BlockStmt------------
+   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
+   * statement statement statement statement
+   */
+  return block;
+}
+
+
+//Parse module statement.
+AstNode* Parser::ParseModuleStatement() {
+  ENTER(ModuleStatement);
+  /*
+   * [bison/yacc compat syntax]
+   * module_statement
+   * : JS_MODULE identifier__opt statement
+   * ;
+   */
+  TokenInfo* token = Seek();
+  AstNode* name = 0;//init after.
+  if (token->type() == Token::JS_IDENTIFIER) {
+    name = ParseLiteral();
+    CHECK_ERROR(new(pool()) Empty);
+  } else {
+    name = new(pool()) Empty;
+  }
+  ModuleStmt* module_stmt = new(pool()) ModuleStmt(name, token->line_number());
+  AstNode* statement = ParseSourceElement();
+  module_stmt->AddChild(statement);
+  END(ModuleStatement);
+  /**
+   * The finally data structure image.
+   * ModuleStmt--name
+   * |                                                                                                                                                                   |
+   * |                                   Literal or Empty
+   * |
+   * statement
+   */
+  return module_stmt;
+}
+
+//Parse export statement.
+AstNode* Parser::ParseExportStatement() {
+  ENTER(ExportStatement);
+  /*
+   * [bison/yacc compat syntax]
+   * export_statement
+   * : JS_EXPORT exportable_definition
+   */
+  TokenInfo* token = Seek(-1);
+  ExportStmt* export_stmt = new(pool()) ExportStmt(token->line_number());
+  AstNode* exportable = ParseExportableDefinition();
+  CHECK_ERROR(export_stmt);
+  export_stmt->AddChild(exportable);
+  END(ExportStatement);
+  /**
+   * The finally data structure image.
+   * ExportStmt
+   * |
+   * function or class or variable decl or const decl
+   */
+  return export_stmt;
+}
+
+//Parse import statement.
+AstNode* Parser::ParseImportStatement() {
+  ENTER(ImportStatement);
+  /*
+   * [bison/yacc compat syntax]
+   * import_statement
+   * : JS_IMPORT JS_IDENTIFIER JS_FROM import_expression terminator
+   */
+  TokenInfo* token = Seek();
+  int expression_type;
+  AstNode* exp;
+  if (token->type() == Token::JS_IDENTIFIER) {
+    exp = ParseLiteral();
+    CHECK_ERROR(exp);
+    expression_type = ImportStmt::kVar;
+  } else if (token->type() == '{' || token->type() == '[') {
+    //import statement allow destructuring assignment.
+    exp = ParseDestructuringLeftHandSide();
+    CHECK_ERROR(exp);
+    expression_type = ImportStmt::kDst;
+  }
+  TokenInfo* from = Advance();
+  const char* ident = from->token();
+  //from keyword is not treated as the reserved word,
+  //so we check that an identifier is the valid from keyword or not.
+  if (from->type() == Token::JS_IDENTIFIER &&
+       strlen(ident) > 0 &&
+       strcmp(ident, SymbolList::symbol(SymbolList::kFrom)) == 0) {
+    AstNode* from_exp = ParseImportExpression();
+    CHECK_ERROR(from_exp);
+    Literal* maybe_file = from_exp->first_child()->CastToLiteral();
+    int from_type;
+    //The import statement could accept the filename or the module name.
+    if (maybe_file && maybe_file->value_type() == Literal::kString) {
+      from_type = ImportStmt::kFile;
+    } else {
+      from_type = ImportStmt::kModule;
+    }
+    ImportStmt* stmt = new(pool()) ImportStmt(expression_type, from_type, token->line_number());
+    CHECK_ERROR(stmt);
+    stmt->set_expression(exp);
+    stmt->set_from(from_exp);
+    ParseTerminator();
+    CHECK_ERROR(stmt);
+    END(ImportStatement);
+    /**
+     * The finally data structure image.
+     * ImportStmt---------expression
+     *                                                                                                                                   |                                                                                                                                                                                      |
+     *                                                                                                                                   | identifier or destructuring
+     *                                                                                                                                   |
+     *                                                                                                                                   |-----------from
+     *                                                                                                                                                                                                                                                                                                                                                                  |
+     *                                                                                                                                                                  string literal or call exp
+     */
+    return stmt;
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(from).cstr()
+                  << " after 'import' expect 'from'\\nin file "
+                  << filename_ << " at line " << from->line_number());
+    END(ImportStatementError);
+    return new(pool()) Empty();
+  }
+}
+
+//Parse import expression.
+//import ... from <here>
+AstNode* Parser::ParseImportExpression() {
+  ENTER(ImportExpression);
+  TokenInfo* token = Seek();
+  NodeList* list = new(pool()) NodeList();
+  //In case of filename.
+  if (token->type() == Token::JS_STRING_LITERAL) {
+    AstNode* literal = ParseLiteral();
+    CHECK_ERROR(literal);
+    list->AddChild(literal);
+  } else if (token->type() == Token::JS_IDENTIFIER) {
+    //In case of module name.
+    AstNode* literal = ParseLiteral();
+    CHECK_ERROR(literal);
+    list->AddChild(literal);
+  }
+  token = Seek();
+  while (1) {
+    if (token->type() == '.' || token->type() == '[') {
+      AstNode* literal = ParseLiteral();
+      CHECK_ERROR(literal);
+      list->AddChild(literal);
+      token = Seek();
+    } else {
+      break;
+    }
+  }
+  END(ImportExpression);
+  return list;
+}
+
+//Parse debugger statement.
+AstNode* Parser::ParseDebuggerStatement(TokenInfo* token) {
+  ENTER(DebuggerStatement);
+  Literal* value = new(pool()) Literal(Literal::kIdentifier, token->line_number());
+  value->set_value(token);
+  Expression* exp = new(pool()) Expression(token->line_number());
+  ExpressionStmt* stmt = new(pool()) ExpressionStmt(token->line_number());
+  stmt->AddChild(exp);
+  exp->AddChild(value);
+  END(DebuggerStatement);
+  return stmt;
+}
+
+//Parse version statement
+AstNode* Parser::ParseVersionStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * version_statement
+   * : MOCHA_VERSIONOF '(' JS_IDENTIFIER ')' statement
+   * ;
+   */
+  ENTER(VersionStatement);
+  TokenInfo* token = Advance();
+  if (token->type() == '(') {
+    token = Advance();
+    if (token->type() == Token::JS_IDENTIFIER) {
+      VersionStmt* stmt = new(pool()) VersionStmt(token, token->line_number());
+      token = Advance();
+      if (token->type() == ')') {
+        token = Seek();
+        if (token->type() == '{') {
+          Advance();
+          AstNode* statement = ParseStatementList(BlockBodyMatcher, "}");
+          CHECK_ERROR(stmt);
+          stmt->AddChild(statement);
+          Advance();
+          END(VersionStatement);
+          /**
+           * The finally data structure image.
+           * VersionStmt
+           *                                             |
+           *            statement
+           */
+          return stmt;
+        } else {
+          AstNode* statement = ParseStatement();
+          CHECK_ERROR(stmt);
+          stmt->AddChild(statement);
+          END(VersionStatement);
+          return stmt;
+        }
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'version statement' expect 'identifier' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(VersionStatementError);
+      return new(pool()) Empty;
+    }
+  }
+  SYNTAX_ERROR("parse error got unexpected token "
+                << TokenConverter(token).cstr()
+                << " in 'version statement' expect ')' \\nin file "
+                << filename_ << " at line " << token->line_number());
+  END(VersionStatementError);
+  return new(pool()) Empty;
+}
+
+//Parse assert statement
+AstNode* Parser::ParseAssertStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * mocha_assert_statement
+   * : MOCHA_ASSERT '(' assignment_expression ',' assignment_expression ')'
+   */
+  ENTER(AssertStatement);
+  TokenInfo *token = Seek();
+  int64_t line = token->line_number();
+  if (token->type() == '(') {
+    token = Advance();
+    AstNode* expect = ParseAssignmentExpression(false);
+    CHECK_ERROR(expect);
+    token = Advance();
+    if (token->type() == ',') {
+      AstNode* exp = ParseAssignmentExpression(false);
+      token = Advance();
+      if (token->type() == ')') {
+        ParseTerminator();
+        CHECK_ERROR(exp);
+        AssertStmt* stmt = new(pool()) AssertStmt(line);
+        stmt->AddChild(expect);
+        stmt->AddChild(exp);
+        /**
+         * The finally data structure image.
+         *                                                       AssertStmt
+         *                                                                                                                       |
+         * assignment expression
+         *                                                                                                                       |
+         * assignment expression
+         */
+        return stmt;
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " 'in assert statement' expect ')'\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(AssertStatementError);
+        return expect;
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " 'in assert statement', second arguments must be a 'expression'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(AssertStatementError);
+      return expect;
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " 'in assert statement' expect '('\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(AssertStatementError);
+    return new(pool()) Empty;
+  }
+}
+
+//Parse variable statement
+AstNode* Parser::ParseVariableStatement() {
+  ENTER(VariableStatement);
+  /*
+   * [bison/yacc compat bnf syntax]
+   * variable_statement
+   * : JS_VAR variable_declaration_list terminator
+   * | JS_CONST variable_declaration_list terminator
+   * | JS_LET variable_declaration_list terminator
+   * ;
+   */
+  TokenInfo* token = Seek(-1);
+  VariableStmt* stmt = new(pool()) VariableStmt(token->line_number());
+  AstNode* list = ParseVariableDecl(false);
+  CHECK_ERROR(stmt);
+  token = Seek();
+  if (token->type() == ';') {
+    Advance();
+  }
+  stmt->AddChild(list);
+  END(VariableStatement);
+  /**
+   * The finally data structure image.
+   *                                            - VariableStmt-
+   *                                            |                                                        |                                                                                      |
+   * literal literal literal
+   */
+  return stmt;
+}
+
+//Parse variable declaration.
+AstNode* Parser::ParseVariableDecl(bool is_noin) {
+  ENTER(VariableDecl);
+  /*
+   * [bison/yacc compat bnf syntax]
+   * variable_declaration
+   * : JS_IDENTIFIER initialiser__opt
+   * | destructuring_assignment_left_hand_side initialiser__opt
+   * ;
+   *
+   * variable_declaration_no_in
+   * : JS_IDENTIFIER initialiser_no_in__opt
+   * | destructuring_assignment_left_hand_side initialiser_no_in__opt
+   * ;
+   */
+  TokenInfo* maybe_assign_op = Seek(2);
+  VariableDeclarationList* list = new(pool()) VariableDeclarationList(maybe_assign_op->line_number());
+  TokenInfo* next = Seek();
+  //Get all declarations.
+  //Like var x, y = 200, z;
+  while (1) {
+    AstNode* var_left_hand;
+    bool is_destructuring = false;
+    if (next->type() == '{' || next->type() == '[') {
+      //Treat harmony destructuring.
+      var_left_hand = ParseDestructuringLeftHandSide();
+      CHECK_ERROR(list);
+      is_destructuring = true;
+      maybe_assign_op = Seek();
+    } else if (next->type() == Token::JS_IDENTIFIER) {
+      //Normal idneifier.
+      var_left_hand = ParseLiteral();
+      CHECK_ERROR(var_left_hand);
+      var_left_hand->CastToLiteral()->set_value_type(Literal::kVariable);
+      CHECK_ERROR(list);
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(next).cstr()
+                    << " in 'variable statement' expect 'variable name' or 'destructuring assignment'\\nin file "
+                    << filename_ << " at line " << next->line_number());
+      END(VariableDeclError);
+      return new(pool()) Empty();
+    }
+    /*
+     * We check result of Seek(2) is assignment operator or not.
+     * If that is assignment operator, we treat next token list as expression,
+     * if not, that is treated as just declaration.
+     */
+    if (maybe_assign_op->type() == '=') {
+      Advance();
+      AstNode* assignment_exp = ParseAssignmentExpression(is_noin);
+      CHECK_ERROR(list);
+      var_left_hand->AddChild(assignment_exp);
+      list->AddChild(var_left_hand);
+    } else {
+      var_left_hand->AddChild(new(pool()) Empty);
+      list->AddChild(var_left_hand);
+    }
+    next = Seek();
+    /*
+     * If next token type is semicolon or line break, declarations are end,
+     * if next token type is comma, declaration is continue after,
+     * if not, it's error.
+     */
+    if (next->type() != ',') {
+      break;
+    } else {
+      Advance();
+    }
+    maybe_assign_op = Seek(2);
+    next = Seek();
+  }
+  END(VariableDecl);
+  return list;
+}
+
+
+AstNode* Parser::ParseLetExpressionOrLetStatement() {
+  TokenInfo* token = Seek();
+  if (token->type() == '(') {
+    Advance();
+    AstNode* exp_list = ParseLetExpressionExp();
+    CHECK_ERROR(exp_list);
+    Advance();
+    token = Seek();
+    Function* fn = new(pool()) Function(token->line_number());
+    fn->set_name(new(pool()) Empty);
+    AstNode* list = exp_list->first_child();
+    AstNode* args = list->next_sibling();
+    NodeList* valid_formal = FormalParameterConvertor(list);
+    CHECK_ERROR(valid_formal);
+    fn->set_argv(valid_formal);
+    if (token->type() == '{') {
+      Advance();
+      AstNode* node = ParseStatementList(BlockBodyMatcher, "'}'");
+      Advance();
+      CHECK_ERROR(node);
+      fn->Append(node);
+    } else {
+      AstNode* node = ParseSourceElement();
+      CHECK_ERROR(node);
+      fn->AddChild(node);
+    }
+    Literal* call_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kCall),
+                                                  Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
+    Literal* this_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kThis),
+                                                  Token::JS_THIS, token->line_number(), Literal::kThis);
+    Expression* fn_exp = new(pool()) Expression(fn->line_number());
+    fn_exp->AddChild(fn);
+    fn_exp->MarkParenthesis();
+    args->InsertBefore(this_sym);
+    CallExp* dot_accessor = builder()->CreateDotAccessor(fn_exp, call_sym, fn->line_number());
+    /**
+     * return anonymouse function call
+     * (function (<let expression>) {
+     *   ...
+     * }).call(this, <args>);
+     */
+    return builder()->CreateExpStmt(builder()->CreateNormalAccessor(dot_accessor, args, fn->line_number()), fn->line_number());
+  } else {
+    return ParseVariableStatement();
+  }
+}
+
+
+AstNode* Parser::ParseLetExpressionExp() {
+  TokenInfo* token = Seek();
+  NodeList* list = new(pool()) NodeList;
+  NodeList* args = new(pool()) NodeList;
+  while (1) {
+    AstNode* node = ParseAssignmentExpression(false);
+    CHECK_ERROR(node);
+    AssignmentExp *assign = node->CastToExpression()->CastToAssigment();
+    if (assign) {
+      list->AddChild(assign->left_value());
+      args->AddChild(assign->right_value());
+    } else {
+      list->AddChild(node);
+      args->AddChild(builder()->CreateNameNode(SymbolList::symbol(SymbolList::kUndefined),
+                                                Token::JS_IDENTIFIER, token->line_number(), Literal::kIdentifier));
+    }
+    token = Seek();
+    if (token->type() != ',') {
+      break;
+    }
+    Advance();
+    token = Seek();
+  }
+  return builder()->CreateNodeList(2, list, args);
+}
+
+
+//Parse destructuring assignment
+AstNode* Parser::ParseDestructuringLeftHandSide() {
+  ENTER(DestructuringLeftHandSide);
+  /*
+   * [bison/yacc compat bnf syntax]
+   * destructuring_assignment_left_hand_side
+   * : array_left_hand_side
+   * | object_left_hand_side
+   * ;
+   */
+  TokenInfo* token = Advance();
+  if (token->type() == '[') {
+    END(DestructuringLeftHandSide);
+    return ParseArrayPattern();
+    //We expect error checking is already finished.
+  } else {
+    END(DestructuringLeftHandSide);
+    return ParseObjectPattern();
+  }
+}
+
+
+//Parse destructuring assignment array pattern.
+AstNode* Parser::ParseArrayPattern() {
+  ENTER(ArrayPattern);
+  /*
+   * [bison/yacc compat syntax]
+   * array_left_hand_side
+   * : '[' elision__opt ']'
+   * | '[' array_left_hand_side_list ']'
+   * | '[' ',' elision__opt ']'
+   * ;
+   *
+   * array_left_hand_side_list
+   * : elision__opt JS_IDENTIFIER
+   * | elision__opt formal_parameter_rest
+   * | elision__opt destructuring_assignment_left_hand_side
+   * | array_left_hand_side_list ',' elision__opt JS_IDENTIFIER
+   * | array_left_hand_side_list ',' elision__opt formal_parameter_rest
+   * | array_left_hand_side_list ',' elision__opt destructuring_assignment_left_hand_side
+   * ;
+   */
+  TokenInfo* token = Seek();
+  ArrayLikeLiteral* destructuring = new(pool()) ArrayLikeLiteral(token->line_number());
+  destructuring->MarkAsLhs();
+  while (1) {
+    if (token->type() == '[' || token->type() == '{') {
+      AstNode* elem = ParseDestructuringLeftHandSide();
+      CHECK_ERROR(elem);
+      destructuring->set_element(elem);
+      token = Seek();
+      if (token->type() == ',') {
+        Advance();
+      }
+    } else if (token->type() == ']') {
+      Advance();
+      break;
+    } else {
+      if (token->type() == ',') {
+        destructuring->set_element(new(pool()) Empty);
+        Advance();
+        token = Seek();
+        if (token->type() == ']') {
+          destructuring->set_element(new(pool()) Empty);
+          Advance();
+          break;
+        }
+      } else if (token->type() == Token::JS_IDENTIFIER) {
+        AstNode* value = ParseLiteral();
+        CHECK_ERROR(destructuring);
+        destructuring->set_element(value);
+        token = Seek();
+        if (token->type() == ',') {
+          Advance();
+        }
+      } else if (token->type() == Token::JS_PARAMETER_REST) {
+        token = Advance(2);
+        if (token->type() == Token::JS_IDENTIFIER) {
+          Literal* rest = new(pool()) Literal(Literal::kRest, token->line_number());
+          rest->set_value(token);
+          destructuring->set_element(rest);
+        } else {
+          SYNTAX_ERROR("parse error got undexpected token "
+                        << TokenConverter(token).cstr()
+                        << ". In 'destructuring assignment parameter rest expect 'identifier'\\nin file "
+                        << filename_ << " at line "
+                        << token->line_number());
+          break;
+        }
+      } else {
+        //In destructuring assignemtn, if array pattern used,
+        //it's element is only allowed JS_IDENTIFIER or JS_REST.
+        SYNTAX_ERROR("parse error got undexpected token "
+                      << TokenConverter(token).cstr()
+                      << ". In 'destructuring assignment array pattern' "
+                      "element is only allowed 'identifier' or 'parameter rest'.\\nin file '"
+                      << filename_ << " at line "
+                      << token->line_number());
+        break;
+      }
+    }
+    token = Seek();
+  }
+  END(ArrayPattern);
+  /**
+   * The finally data structure image.
+   *                                            ArrayLikeLiteral
+   *                                                                                                                                            |
+   *            literal or destructuring
+   */
+  return destructuring;
+}
+
+//Parse destructuring assignment object pattern
+AstNode* Parser::ParseObjectPattern() {
+  ENTER(ObjectPattern);
+  /*
+   * [bison/yacc compat syntax]
+   * object_member_left_hand_side_list
+   * :  JS_IDENTIFIER
+   * | property_name ':' JS_IDENTIFIER
+   * | property_name ':' destructuring_assignment_left_hand_side
+   * | object_member_left_hand_side_list ',' property_name ':' JS_IDENTIFIER
+   * | object_member_left_hand_side_list ',' JS_IDENTIFIER
+   * | object_member_left_hand_side_list ',' property_name ':' destructuring_assignment_left_hand
+   * ;
+   */
+  TokenInfo* token = Seek();
+  int maybe_colon = Seek(2)->type();
+  ObjectLikeLiteral* destructuring = new(pool()) ObjectLikeLiteral(token->line_number());
+  destructuring->MarkAsLhs();
+  while (1) {
+    if (maybe_colon == '}') {
+      ParseObjectPatternElement(token->type(), token, destructuring);
+      CHECK_ERROR(destructuring);
+      Advance();
+      break;
+    } else if (maybe_colon == ',') {
+      ParseObjectPatternElement(token->type(), token, destructuring);
+      CHECK_ERROR(destructuring);
+      Advance();
+    } else if (maybe_colon == ':') {
+      AstNode* node = ParseLiteral();
+      CHECK_ERROR(destructuring);
+      Advance();
+      token = Seek();
+      if (token->type() == '[' || token->type() == '{') {
+        AstNode* elem = ParseDestructuringLeftHandSide();
+        CHECK_ERROR(elem);
+        node->AddChild(elem);
+      } else {
+        ParseObjectPatternElement(token->type(), token, destructuring);
+        CHECK_ERROR(destructuring);
+        AstNode* last = destructuring->elements()->last_child();
+        destructuring->elements()->RemoveChild(last);
+        node->AddChild(last);
+      }
+      destructuring->set_element(node);
+      token = Advance();
+      if (token->type() == '}') {
+        break;
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << ". In 'destructuring assignment object pattern'"
+                    " member only allowed normal '{ property_name : idenfier }' or '{ identifier }'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+    }
+    token = Seek();
+    maybe_colon = Seek(2)->type();
+  }
+  END(ObjectPattern);
+  return destructuring;
+}
+
+//Parse destructuring assignment object patter's each element.
+AstNode* Parser::ParseObjectPatternElement(int type, TokenInfo* token, ObjectLikeLiteral* object) {
+  ENTER(ObjectPatternElement);
+  if (type == Token::JS_IDENTIFIER) {
+    AstNode* node = ParseLiteral();
+    CHECK_ERROR(node);
+    object->set_element(node);
+    END(ObjectPatternElement);
+    return node;
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << ". In 'destructuring assignment object pattern'"
+                  " member only allowed normal '{ property_name : idenfier }' or '{ identifier }'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(ObjectPatternElementError);
+    return new(pool()) Empty;
+  }
+}
+
+//Parse labelled statement or expression statement.
+AstNode* Parser::CheckLabellOrExpressionStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * labelled_statement
+   * : JS_IDENTIFIER ':' statement
+   * ;
+   *
+   * expression_statement
+   * : expression
+   * ;
+   */
+  ENTER(LabellOrExpressionStatement);
+  TokenInfo* token = Seek();
+  Undo();
+  //In case of labelled statement.
+  if (token->type() == ':') {
+    AstNode* stmt = ParseLabelledStatement();
+    CHECK_ERROR(stmt);
+    END(LabellOrExpressionStatement);
+    return stmt;
+  } else {
+    AstNode* ret = ParseExpression(false);
+    CHECK_ERROR(ret);
+    ParseTerminator();
+    CHECK_ERROR(ret);
+    ExpressionStmt* stmt = new(pool()) ExpressionStmt(token->line_number());
+    stmt->AddChild(ret);
+    END(LabellOrExpressionStatement);
+    return stmt;
+  }
+}
+
+//Parse if statement
+AstNode* Parser::ParseIFStatement(bool is_comprehensions) {
+  ENTER(IFStatement);
+  /*
+   * [bison/yacc compat syntax]
+   * if_statement
+   * : JS_IF '(' expression ')' statement JS_ELSE statement
+   * | JS_IF '(' expression ')' statement
+   * | JS_IF_OPT expression statement
+   * ;
+   */
+  TokenInfo *token = Advance();
+  IFStmt* if_stmt = new(pool()) IFStmt(token->line_number());
+  if (token->type() == '(') {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(if_stmt);
+    if_stmt->set_condition(exp);
+    token = Advance();
+    if (token->type() == ')') {
+      if (!is_comprehensions) {
+        AstNode* stmt = ParseSourceElement();
+        CHECK_ERROR(stmt);
+        if_stmt->set_then_statement(stmt);
+        token = Seek();
+        if (token->type() == Token::JS_ELSE) {
+          Advance();
+          AstNode* stmt = ParseSourceElement();
+          CHECK_ERROR(stmt)
+              if_stmt->set_else_statement(stmt);
+        } else {
+          if_stmt->set_else_statement(new(pool()) Empty);
+        }
+      } else {
+        if_stmt->set_then_statement(new(pool()) Empty);
+        if_stmt->set_else_statement(new(pool()) Empty);
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'if statement conditional expression end' expect ')' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(IFStatementError);
+      return if_stmt;
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'if statement conditional expression' expect '(' \\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(IFStatementError);
+    return if_stmt;
+  }
+  END(IFStatement);
+
+  return if_stmt;
+}
+
+//Parse do while statement.
+AstNode* Parser::ParseDoWhileStatement(bool is_expression) {
+  /**
+   * [bison/yacc compat syntax]
+   * iteration_statement
+   * : JS_DO statement JS_WHILE '(' expressio ')' terminator
+   * ;
+   *
+   * do_expression
+   * | JS_DO statement
+   */
+  ENTER(DoWhileStatement);
+  int64_t line = Seek(-1)->line_number();
+  AstNode* statement = ParseSourceElement();
+  CHECK_ERROR(statement);
+  TokenInfo* token = Seek();
+  if (token->type() == Token::JS_WHILE && !is_expression) {
+    token = Advance(2);
+    if (token->type() == '(') {
+      AstNode* node = ParseExpression(false);
+      CHECK_ERROR(statement);
+      token = Advance();
+      if (token->type() == ')') {
+        IterationStmt* iter = new(pool()) IterationStmt(IterationStmt::kDoWhile, line);
+        iter->set_expression(node);
+        iter->AddChild(statement);
+        END(DoWhileStatement);
+        return iter;
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'while statement conditional expression' expect ')' \\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(DoWhileStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kWhile, line);
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'do while statement conditional expression' expect '(' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(DoWhileStatementError);
+      return new(pool()) IterationStmt(IterationStmt::kWhile, line);
+    }
+  } else {
+    //do expression.
+    token = Seek();
+    Function* fn = new(pool()) Function(line);
+    fn->set_name(new(pool()) Empty);
+    if (statement->node_type() == AstNode::kBlockStmt) {
+      fn->Append(statement);
+    } else {
+      fn->AddChild(statement);
+    }
+    AstNode* node = fn->last_child();
+    if (node->CastToExpression() || node->node_type() == AstNode::kExpressionStmt) {
+      ReturnStmt* stmt = 0;//init after
+      if (node->node_type() == AstNode::kExpressionStmt) {
+        stmt = builder()->CreateReturnStmt(node->first_child(), node->line_number());
+      } else {
+        stmt = builder()->CreateReturnStmt(node, node->line_number());
+      }
+      fn->ReplaceChild(node, stmt);
+    }
+    fn->set_argv(new(pool()) Empty);
+    ExpressionStmt* ret_stmt = builder()->CreateAnonymousFnCall(fn, new(pool()) Empty, fn->line_number());
+    return (is_expression)? ret_stmt->first_child() : ret_stmt;
+  }
+}
+
+
+//Parse while statement
+AstNode* Parser::ParseWhileStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * iteration_statement
+   * : JS_WHILE '(' expression ')' statement
+   * ;
+   */
+  ENTER(WhileStatement);
+  TokenInfo* token = Advance();
+  int64_t line = token->line_number();
+  if (token->type() == '(') {
+    AstNode* node = ParseExpression(false);
+    CHECK_ERROR(node);
+    token = Advance();
+    if (token->type() == ')') {
+      IterationStmt* iter = new(pool()) IterationStmt(IterationStmt::kWhile, line);
+      iter->set_expression(node);
+      AstNode* statement = ParseSourceElement();
+      CHECK_ERROR(iter);
+      iter->AddChild(statement);
+      END(WhileStatement);
+      return iter;
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'while statement conditional expression' expect ')' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(WhileStatementError);
+      return new(pool()) IterationStmt(IterationStmt::kWhile, line);
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'while statement conditional expression' expect '(' \\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(WhileStatementError);
+    return new(pool()) IterationStmt(IterationStmt::kWhile, line);
+  }
+}
+
+
+//Parse for statement
+//In this method, the for statement includes for_in_statement,
+//for_of_statement and array_comprehensions_iteration.
+AstNode* Parser::ParseForStatement(bool is_comprehensions) {
+  /**
+   * [bison/yacc compat syntax]
+   * iteration_statement
+   * : JS_FOR '(' JS_VAR variable_declaration_list_no_in ';' expression__opt ';' expression__opt) statement
+   * | JS_FOR '(' expression_no_in__opt ';' expression__opt ';' expression__opt ')' statement
+   * | JS_FOR '(' JS_VAR variable_declaration_no_in JS_IN expression ')' statement
+   * | JS_FOR '(' left_hand_side_expression JS_IN expression ')' statement
+   * | JS_FOR '(' JS_VAR variable_declaration_no_in JS_IDENTIFIER expression ')' statement
+   * | JS_FOR '(' left_hand_side_expression JS_IDENTIFIER expression ')' statement
+   * | JS_FOR JS_EACH '(' JS_VAR variable_declaration_no_in JS_IN expression ')' statement
+   * | JS_FOR JS_EACH '(' left_hand_side_expression JS_IN expression ')' statement
+   * ;
+   *
+   * array_comprehensions
+   * : array_comprehension_iteration
+   * | array_comprehensions array_comprehension_iteration
+   * ;
+   *
+   * array_comprehension_iteration
+   * : JS_FOR '(' left_hand_side_expression JS_IDENTIFIER expression ')'
+   * ;
+   */
+  ENTER(ForStatement);
+  TokenInfo *token = Advance();
+  int64_t line = token->line_number();
+  bool is_each = false;
+  NodeList *exp_list = new(pool()) NodeList;
+  IterationStmt* iter_stmt = 0;
+  if (token->type() == Token::JS_EACH) {
+    is_each = true;
+    token = Advance();
+  }
+  if (token->type() == '(') {
+    int next_type = Seek()->type();
+    bool is_var_decl = false;
+    int var_decl_len = 0;
+    if (next_type == Token::JS_VAR) {
+      is_var_decl = true;
+      //The array comprehension for expression could not have variable declaration.
+      if (is_comprehensions) {
+        SYNTAX_ERROR("parse error in 'array comprehensions for expression' could not has variable declaration"
+                      "\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(ForStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kFor, line);
+      } else {
+        Advance();
+        AstNode* var_decl = ParseVariableDecl(true);
+        CHECK_ERROR(var_decl);
+        exp_list->AddChild(var_decl);
+        var_decl_len = var_decl->child_length();
+      }
+    } else if (next_type != ';') {
+      AstNode* exp = ParseExpression(true);
+      CHECK_ERROR(exp);
+      if (exp->first_child()->node_type() == AstNode::kLiteral && is_comprehensions) {
+        AstNode* first = exp->first_child();
+        if (first->child_length() == 0) {
+          first->AddChild(new(pool()) Empty);
+        }
+        first->CastToLiteral()->set_value_type(Literal::kVariable);
+        exp_list->AddChild(first);
+      } else {
+        //Empty first for statement condition expression.
+        exp_list->AddChild(exp);
+      }
+    } else {
+      exp_list->AddChild(new(pool()) Empty);
+    }
+    token = Advance();
+    if (next_type == ';' || (token->type() == ';' && is_each == false)) {
+      //In case of normal for statement.
+      if (is_comprehensions) {
+        SYNTAX_ERROR("parse error in 'array comprehensions' allowed 'for in statement' or 'for of statement'"
+                      "\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(ForStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kFor, line);
+      }
+      int iter_type = (is_var_decl)? IterationStmt::kForWithVar : IterationStmt::kFor;
+      iter_stmt = new(pool()) IterationStmt(iter_type, line);
+      ParseForStatementCondition(exp_list);
+      CHECK_ERROR(iter_stmt);
+    } else if (token->type() == Token::JS_IN) {
+      //In case of for in statement.
+      if (var_decl_len > 1) {
+        SYNTAX_ERROR("parse error 'for in statement' could has only one variable declaration."
+                      "\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(ForStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kFor, line);
+      }
+      if (is_var_decl) {
+        AstNode* initialiser = exp_list->first_child()->first_child();
+        exp_list->ReplaceChild(exp_list->first_child(), initialiser);
+      }
+      if (is_each == false) {
+        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForInWithVar : IterationStmt::kForIn;
+        iter_stmt = new(pool()) IterationStmt(iter_type, line);
+      } else {
+        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForEachWithVar : IterationStmt::kForEach;
+        iter_stmt = new(pool()) IterationStmt(iter_type, line);
+      }
+      ParseForInStatementCondition(exp_list);
+      CHECK_ERROR(iter_stmt);
+    } else if (token->type() == Token::JS_IDENTIFIER &&
+                strcmp(TokenConverter(token).cstr(), SymbolList::symbol(SymbolList::kOf)) == 0) {
+      //For of statement's 'of' keyword is treated as identifier not reserved word,
+      //so we check token is valid 'of' identifier or not.
+      if (var_decl_len > 1) {
+        SYNTAX_ERROR("parse error 'for of statement' could has only one variable declaration."
+                      "\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(ForStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kFor, line);
+      }
+      if (is_var_decl) {
+        AstNode* initialiser = exp_list->first_child()->first_child();
+        exp_list->ReplaceChild(exp_list->first_child(), initialiser);
+      }
+      if (is_each == false) {
+        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForOfWithVar : IterationStmt::kForOf;
+        iter_stmt = new(pool()) IterationStmt(iter_type, line);
+      } else {
+        SYNTAX_ERROR("parse error 'for of statement' can not has 'each'."
+                      "\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(ForStatementError);
+        return new(pool()) IterationStmt(IterationStmt::kFor, line);
+      }
+      ParseForInStatementCondition(exp_list);
+      CHECK_ERROR(iter_stmt);
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'for statement conditional expression' expect 'in', 'of' or ';' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(ForStatementError);
+      return new(pool()) IterationStmt(IterationStmt::kFor, line);
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'for statement conditional expression' expect '(' \\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(ForStatementError);
+    return new(pool()) IterationStmt(IterationStmt::kFor, line);
+  }
+  if (!is_comprehensions) {
+    AstNode* body = ParseStatement();
+    CHECK_ERROR(iter_stmt);
+    iter_stmt->AddChild(body);
+  }
+  iter_stmt->set_expression(exp_list);
+  END(ForStatement);
+  return iter_stmt;
+}
+
+
+//Parse for statement condition expression.
+void Parser::ParseForStatementCondition(NodeList* list) {
+  ENTER(ForStatementCondition);
+  if (Seek()->type() == ';') {
+    list->AddChild(new(pool()) Empty);
+  } else {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(;);
+    list->AddChild(exp);
+  }
+  TokenInfo* token = Advance();
+  if (token->type() == ';') {
+    if (Seek()->type() == ')') {
+      list->AddChild(new(pool()) Empty);
+    } else {
+      AstNode* exp = ParseExpression(false);
+      CHECK_ERROR(;)
+          list->AddChild(exp);
+    }
+    token = Advance();
+    if (token->type() != ')') {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'for statement condition end' expect ')' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+    }
+  }
+  END(ForStatementCondition);
+}
+
+
+//Parse for in statement condition expression.
+void Parser::ParseForInStatementCondition(NodeList* list) {
+  ENTER(ForInStatementCondition);
+  AstNode* target_exp = ParseExpression(false);
+  CHECK_ERROR(;);
+  TokenInfo* token = Advance();
+  list->AddChild(target_exp);
+  if (token->type() != ')') {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'for in statement condition end' expect ')' \\nin file "
+                  << filename_ << " at line " << token->line_number());
+  }
+  END(ForInStatementCondition);
+}
+
+
+//Parse continue statement.
+AstNode* Parser::ParseContinueStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * continue_statement
+   * : JS_CONTINUE identifier__opt terminator
+   */
+  ENTER(ContinueStatement);
+  TokenInfo *token = Seek();
+  ContinueStmt* stmt = new(pool()) ContinueStmt(Seek(-1)->line_number());
+  if (token->type() == Token::JS_IDENTIFIER) {
+    AstNode* identifier = ParseLiteral();
+    CHECK_ERROR(stmt);
+    stmt->AddChild(identifier);
+  }
+  ParseTerminator();
+  CHECK_ERROR(stmt);
+  stmt->AddChild(new(pool()) Empty);
+  END(ContinueStatement);
+  return stmt;
+}
+
+
+//Parse break statement.
+AstNode* Parser::ParseBreakStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * : JS_BREAK identifier__opt terminator
+   * ;
+   */
+  ENTER(BreakStatement);
+  TokenInfo *token = Seek();
+  BreakStmt* stmt = new(pool()) BreakStmt(Seek(-1)->line_number());
+  if (token->type() == Token::JS_IDENTIFIER) {
+    AstNode* identifier = ParseLiteral();
+    CHECK_ERROR(stmt);
+    stmt->AddChild(identifier);
+  }
+  ParseTerminator();
+  CHECK_ERROR(stmt);
+  stmt->AddChild(new(pool()) Empty);
+  END(BreakStatement);
+  return stmt;
+}
+
+//Parse return statement.
+AstNode* Parser::ParseReturnStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * return_statement
+   * : JS_RETURN expression__opt terminator
+   * ;
+   */
+  ENTER(ReturnStatement);
+  if (!state_stack_->Has(StateStack::kFunction)) {
+    SYNTAX_ERROR("return statement only allowed in 'function'\\nin file "
+                  << filename_ << " at line " << Seek(-1)->line_number());
+    END(ReturnStatement);
+    return new(pool()) Empty;
+  }
+  bits_.Set(RETURN_FLG);
+  TokenInfo *token = Seek();
+  ReturnStmt* stmt = new(pool()) ReturnStmt(token->line_number());
+  if (token->type() == ';' || token->type() == '}' || token->linebreak_before()) {
+    stmt->AddChild(new(pool()) Empty);
+  } else {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(stmt);
+    stmt->AddChild(exp);
+    ParseTerminator();
+    CHECK_ERROR(exp);
+  }
+  END(ReturnStatement);
+  return stmt;
+}
+
+
+//Parse with statement.
+AstNode* Parser::ParseWithStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * with_statement
+   * : JS_WITH '(' expression ')' statement
+   */
+  ENTER(WithStatement);
+  TokenInfo *token = Advance();
+  WithStmt* stmt = new(pool()) WithStmt(Seek(-1)->line_number());
+  if (token->type() == '(') {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(stmt);
+    stmt->set_expression(exp);
+    token = Advance();
+    if (token->type() == ')') {
+      AstNode* statement = ParseSourceElement();
+      CHECK_ERROR(stmt);
+      stmt->AddChild(statement);
+    } else {
+      SYNTAX_ERROR("parse error unmatched paren"
+                    " in 'with statement expression'\\nin file"
+                    << filename_ << " at line " << token->line_number());
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'with statement expression' expect '('\\nin file"
+                  << filename_ << " at line " << token->line_number());
+  }
+  END(WithStatement);
+  return stmt;
+}
+
+
+//Parse switch statement.
+AstNode* Parser::ParseSwitchStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * switch_statement
+   * : JS_SWITCH '(' expression ')' case_block
+   * ;
+   */
+  ENTER(SwitchStatement);
+  TokenInfo *token = Advance();
+  SwitchStmt* stmt = new(pool()) SwitchStmt(token->line_number());
+  if (token->type() == '(') {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(stmt);
+    stmt->set_expression(exp);
+    token = Advance();
+    if (token->type() == ')') {
+      AstNode* case_block = ParseCaseClauses();
+      CHECK_ERROR(stmt);
+      stmt->Append(case_block);
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'switch statement expression' expect ')'\\nin file"
+                    << filename_ << " at line " << token->line_number());
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'switch statement expression' expect '('\\nin file"
+                  << filename_ << " at line " << token->line_number());
+  }
+  END(SwitchStatement);
+  return stmt;
+}
+
+
+//Parse case clauses
+AstNode* Parser::ParseCaseClauses() {
+  /**
+   * [bison/yacc compat syntax]
+   * case_clauses
+   * : case_clause
+   * | case_clauses case_clause
+   * ;
+   *
+   * case_clause
+   * : JS_CASE expression ':' statement_list__opt
+   * ;
+   *
+   * default_clause
+   * : JS_DEFAULT ':' statement_list__opt
+   * ;
+   */
+  ENTER(CaseClauses);
+  TokenInfo *token = Advance();
+  NodeList *list = new(pool()) NodeList;
+  if (token->type() == '{') {
+    while (token->type() != '}') {
+      token = Advance();
+      bool is_default = token->type() == Token::JS_DEFAULT;
+      if (token->type() == Token::JS_CASE || is_default) {
+        CaseClause* clause = 0;//init after.
+        if (!is_default) {
+          clause = new(pool()) CaseClause(token->line_number());
+          AstNode* exp = ParseExpression(false);
+          CHECK_ERROR(clause);
+          clause->set_expression(exp);
+        } else {
+          clause = new(pool()) CaseClause(token->line_number());
+          clause->set_expression(new(pool()) Empty);
+        }
+        token = Advance();
+        if (token->type() == ':') {
+          token = Seek();
+          if (token->type() == Token::JS_CASE) {
+            clause->AddChild(new(pool()) Empty);
+            list->AddChild(clause);
+          } else {
+            AstNode* statement_list = ParseStatementList(CaseBodyMatcher, "'case','default' or '}'");
+            CHECK_ERROR(clause);
+            clause->Append(statement_list);
+            list->AddChild(clause);
+          }
+        } else {
+          SYNTAX_ERROR("parse error got unexpected token "
+                        << TokenConverter(token).cstr()
+                        << " in 'switch statement case expression' expect ':'\\nin file"
+                        << filename_ << " at line " << token->line_number());
+          END(SwitchStatementError);
+          return list;
+        }
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'switch statement case block' expect 'case'\\nin file"
+                      << filename_ << " at line " << token->line_number());
+        END(SwitchStatementError);
+        return list;
+      }
+      token = Seek();
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'switch statement case block' expect '{'\\nin file"
+                  << filename_ << " at line " << token->line_number());
+    END(SwitchStatementError);
+    return list;
+  }
+  Advance();
+  END(CaseClause);
+  return list;
+}
+
+
+//Parse labelled statement
+AstNode* Parser::ParseLabelledStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * labelled_statement
+   * : JS_IDENTIFIER ':' statement
+   * ;
+   */
+  ENTER(LabelledStatement);
+  TokenInfo* token = Seek(-1);
+  AstNode* ident = ParseLiteral();
+  CHECK_ERROR(ident)
+      Advance();
+  AstNode* statement = ParseStatement();
+  CHECK_ERROR(statement);
+  LabelledStmt* stmt = new(pool()) LabelledStmt(token->line_number());
+  CHECK_ERROR(stmt);
+  stmt->AddChild(ident);
+  stmt->AddChild(statement);
+  END(LabelledStatement);
+  return stmt;
+}
+
+
+//Parse throw statement
+AstNode* Parser::ParseThrowStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * throw_statement
+   * : JS_THROW expression terminator
+   * ;
+   */
+  ENTER(ThrowStatement);
+  TokenInfo* token = Seek(-1);
+  ThrowStmt* throw_stmt = new(pool()) ThrowStmt(token->line_number());
+  AstNode* exp = ParseExpression(false);
+  CHECK_ERROR(throw_stmt);
+  throw_stmt->set_expression(exp);
+  ParseTerminator();
+  CHECK_ERROR(exp);
+  END(ThrowStatement);
+  return throw_stmt;
+}
+
+
+//Parse try statement
+AstNode* Parser::ParseTryStatement() {
+  /**
+   * [bison/yacc compat syntax]
+   * try_statement
+   * : JS_TRY block catch
+   * | JS_TRY block finally
+   * | JS_TRY block catch finally
+   * ;
+   */
+  ENTER(TryStatement);
+  TokenInfo* token = Seek();
+  TryStmt *stmt = new(pool()) TryStmt(token->line_number());
+  if (token->type() == '{') {
+    Advance();
+    AstNode* block = ParseBlockStatement();
+    CHECK_ERROR(stmt);
+    stmt->AddChild(block);
+    token = Seek();
+    if (token->type() == Token::JS_CATCH) {
+      AstNode* catch_block = ParseCatchBlock();
+      CHECK_ERROR(stmt);
+      stmt->set_catch_block(catch_block);
+      token = Seek();
+    } else {
+      stmt->set_catch_block(new(pool()) Empty);
+    }
+    if (token->type() == Token::JS_FINALLY) {
+      Advance();
+      AstNode* finally_block = ParseFinallyBlock();
+      CHECK_ERROR(stmt);
+      stmt->set_finally_block(finally_block);
+    } else {
+      stmt->set_finally_block(new(pool()) Empty);
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'try statement' expect '{'\\nin file"
+                  << filename_ << " at line " << token->line_number());
+  }
+  END(TryStatement);
+  return stmt;
+}
+
+//Parse catch block
+AstNode* Parser::ParseCatchBlock() {
+  ENTER(CatchBlock);
+  TokenInfo *token = Advance(2);
+  if (token->type() == '(') {
+    AstNode* ident = ParseLiteral();
+    CHECK_ERROR(ident);
+    token = Advance();
+    if (token->type() == ')') {
+      token = Seek();
+      if (token->type() != '{') {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'catch block' expect '{'\\nin file"
+                      << filename_ << " at line " << token->line_number());
+      } else {
+        Advance();
+        AstNode* block = ParseBlockStatement();
+        CHECK_ERROR(ident);
+        ident->AddChild(block);
+        END(CatchBlock);
+        return ident;
+      }
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'catch block' expect ')'\\nin file"
+                    << filename_ << " at line " << token->line_number());
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'catch block' expect '('\\nin file"
+                  << filename_ << " at line " << token->line_number());
+  }
+  END(CatchBlockError);
+  return new(pool()) Empty;
+}
+
+
+AstNode* Parser::ParseFinallyBlock() {
+  ENTER(FinallyBlock);
+  TokenInfo *token = Advance();
+  if (token->type() == '{') {
+    state_stack_->Push(StateStack::kFinally);
+    AstNode* block = ParseBlockStatement();
+    state_stack_->Pop();
+    END(FinallyBlock);
+    return block;
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'finally block' expect '{'\\nin file"
+                  << filename_ << " at line " << token->line_number());
+    END(FinallyBlockError);
+    return new(pool()) Empty;
+  }
+}
+
+
+AstNode* Parser::ParseTrait() {
+  ENTER(Trait);
+  TokenInfo* token = Seek();
+  Trait* trait = new(pool()) Trait(token->line_number());
+  if (token->type() == Token::JS_IDENTIFIER) {
+    AstNode* literal = ParseLiteral();
+    CHECK_ERROR(literal);
+    trait->set_name(literal);
+    token = Seek();
+  } else {
+    trait->set_name(new(pool()) Empty);
+  }
+  if (token->type() == '{') {
+    ParseTraitBody(trait);
+    CHECK_ERROR(trait);
+    Advance();
+    return trait;
+  } else {
+    SYNTAX_ERROR("got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'TraitDeclaration' expect '{'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(TraitError);
+    return trait;
+  }
+  END(Trait);
+}
+
+
+void Parser::ParseTraitBody(Trait* trait) {
+  Advance();
+  TokenInfo* token = Seek();
+  while (1) {
+    if (token->type() == Token::JS_IDENTIFIER) {
+      if (strcmp(token->token(), "requires") == 0) {
+        Advance();
+        while (1) {
+          AstNode* ret = ParseLiteral();
+          CHECK_ERROR(;);
+          Literal* val = ret->CastToLiteral();
+          val->set_value_type(Literal::kProperty);
+          token = Seek();
+          trait->set_require(ret);
+          if (token->type() == ',') {
+            Advance();
+          } else {
+            ParseTerminator();
+            CHECK_ERROR(;);
+            break;
+          }
+        }
+      } else if (strcmp(token->token(), "mixin") == 0) {
+        Advance();
+        AstNode* mixin = ParseMixin();
+        CHECK_ERROR(;);
+        trait->set_mixin(mixin);
+      } else {
+        AstNode* ret = ParseFunctionDecl(false);
+        CHECK_ERROR(;);
+        ParseTerminator();
+        CHECK_ERROR(;);
+        TraitMember *member = new(pool()) TraitMember(TraitMember::kPrivate, ret, token->line_number());
+        trait->set_member(member);
+      }
+    } else if (token->type() == Token::JS_PUBLIC) {
+      Advance();
+      AstNode* ret = ParseFunctionDecl(false);
+      CHECK_ERROR(;);
+      ParseTerminator();
+      CHECK_ERROR(;);
+      TraitMember *member = new(pool()) TraitMember(TraitMember::kPublic, ret, token->line_number());
+      trait->set_member(member);
+    } else if (token->type() == Token::JS_PRIVATE) {
+      Advance();
+      AstNode* ret = ParseFunctionDecl(false);
+      CHECK_ERROR(;);
+      ParseTerminator();
+      CHECK_ERROR(;);
+      TraitMember *member = new(pool()) TraitMember(TraitMember::kPrivate, ret, token->line_number());
+      trait->set_member(member);
+    } else {
+      SYNTAX_ERROR("got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'trait declaration'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(TraitBodyError);
+      return;
+    }
+    token = Seek();
+    if (token->type() == '}') {
+      break;
+    }
+  }
+}
+
+
+AstNode* Parser::ParseMixin() {
+  AstNode* literal = ParseLiteral();
+  CHECK_ERROR(literal);
+  MixinMember* mixin = new(pool()) MixinMember(Seek(-1)->line_number());
+  mixin->set_name(literal);
+  TokenInfo* token = Seek();
+  while (1) {
+    if (token->type() == Token::JS_WITH) {
+      Advance();
+      AstNode* before = ParseLiteral();
+      CHECK_ERROR(before);
+      Literal* val = before->CastToLiteral();
+      val->set_value_type(Literal::kProperty);
+      token = Seek();
+      if (token->type() == Token::JS_IDENTIFIER &&
+           strcmp(token->token(), "as") == 0) {
+        Advance();
+        AstNode* after = ParseLiteral();
+        CHECK_ERROR(after);
+        Literal* after_val = after->CastToLiteral();
+        after_val->set_value_type(Literal::kProperty);
+        NodeList* list = new(pool()) NodeList;
+        list->AddChild(before);
+        list->AddChild(after);
+        mixin->set_rename_list(list);
+        token = Seek();
+        if (token->type() == ',') {
+          Advance();
+          token = Seek();
+        } else {
+          ParseTerminator();
+          CHECK_ERROR(mixin);
+          break;
+        }
+      } else {
+        SYNTAX_ERROR("got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'mixin declaration' expect 'as'\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(MixinError);
+        return mixin;
+      }
+    } else if (token->type() == Token::JS_IDENTIFIER &&
+                strcmp(token->token(), "without") == 0) {
+      Advance();
+      AstNode* remove = ParseLiteral();
+      CHECK_ERROR(remove);
+      remove->CastToLiteral()->set_value_type(Literal::kProperty);
+      mixin->set_remove_list(remove);
+      token = Seek();
+      if (token->type() == ',') {
+        Advance();
+        token = Seek();
+      } else {
+        ParseTerminator();
+        CHECK_ERROR(remove);
+        break;
+      }
+    } else {
+      break;
+    }
+  }
+  return mixin;
+}
+
+
+AstNode* Parser::ParseClassDecl(bool is_const) {
+  ENTER(ClassDecl);
+  TokenInfo* token = Seek();
+  AstNode* name;
+  AstNode* inherit;
+  state_stack_->Push(StateStack::kClassDecl);
+  if (token->type() == Token::JS_IDENTIFIER) {
+    name = ParseLiteral();
+    CHECK_ERROR(name);
+  } else {
+    name = new(pool()) Empty;
+  }
+  token = Seek();
+  if (token->type() == Token::JS_EXTENDS ||
+       (token->type() == Token::JS_IDENTIFIER ||
+         strcmp(token->token(), "prototype") == 0)) {
+    inherit = ParseInheritDecl();
+    CHECK_ERROR(inherit);
+  } else {
+    inherit = new(pool()) Empty;
+  }
+  Class *cls = new(pool()) Class(inherit, token->line_number());
+  if (is_const) {
+    cls->MarkAsConstDeclaration();
+  }
+  cls->set_name(name);
+  token = Advance();
+  if (token->type() == '{') {
+    AstNode* body = ParseClassBody();
+    CHECK_ERROR(cls);
+    cls->set_body(body);
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'class declaration' expect '{'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(ClassDecl);
+    state_stack_->Pop();
+    return cls;
+  }
+  END(ClassDecl);
+  state_stack_->Pop();
+  return cls;
+}
+
+
+AstNode* Parser::ParseInheritDecl() {
+  ENTER(InheritDecl);
+  TokenInfo* token = Advance();
+  ClassExpandar* expandar;
+  if (token->type() == Token::JS_EXTENDS) {
+    expandar = new(pool()) ClassExpandar(ClassExpandar::kExtends, token->line_number());
+  } else {
+    expandar = new(pool()) ClassExpandar(ClassExpandar::kPrototype, token->line_number());
+  }
+  AstNode* member = ParseMemberExpression();
+  CHECK_ERROR(member);
+  expandar->AddChild(member);
+  END(InheritDecl);
+  return expandar;
+}
+
+
+AstNode* Parser::ParseClassBody() {
+  ENTER(ClassBody);
+  TokenInfo* token = Seek();
+  if (token->type() == '}') {
+    Advance();
+    END(ClassBody);
+    return new(pool()) Empty;
+  } else {
+    ClassProperties* list = new(pool()) ClassProperties(token->line_number());
+    while (token->type() != '}') {
+      ClassMember* mem = ParseClassMember();
+      CHECK_ERROR(mem);
+      switch (mem->attribute()) {
+        case ClassMember::kPrivate :
+          list->set_private_member(mem);
+          break;
+
+        case ClassMember::kPublic :
+          list->set_public_member(mem);
+          break;
+
+        case ClassMember::kPublicStatic :
+          list->set_public_static_member(mem);
+          break;
+
+        case ClassMember::kPrivateStatic :
+          list->set_private_static_member(mem);
+          break;
+
+        case ClassMember::kPrototype :
+          list->set_prototype_member(mem);
+          break;
+
+        case ClassMember::kConstructor :
+          list->set_constructor(mem);
+          break;
+
+        case ClassMember::kMixin :
+          list->set_mixin_member(mem->first_child());
+          break;
+      }
+      token = Seek();
+    }
+    Advance();
+    END(ClassBody);
+    return list;
+  }
+}
+
+AstNode* Parser::ParseClassMemberStatement() {
+  TokenInfo* token = Seek(-1);
+  if (state_stack_->Has(StateStack::kClassDecl)) {
+    ClassMember::MemberAttr member_type;
+    if (token->type() == Token::JS_PUBLIC) {
+      member_type = ClassMember::kPublic;
+    } else if (token->type() == Token::JS_PRIVATE) {
+      member_type = ClassMember::kPrivate;
+    }
+    AstNode* node = ParseExportableDefinition();
+    CHECK_ERROR(node);
+    ClassMember* member = new(pool()) ClassMember(member_type, token->line_number());
+    member->AddChild(node);
+    return member;
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'member expression' expect '.' or '['\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(MemberExpressionError);
+    return new(pool()) Empty;
+  }
+}
+
+ClassMember* Parser::ParseClassMember() {
+  ENTER(ClassMember);
+  TokenInfo* token = Seek();
+  ClassMember::MemberAttr member_type;
+  AstNode* exp;
+  if (token->type() == Token::JS_IDENTIFIER && strcmp(token->token(), "constructor") == 0) {
+    exp = ParseFunctionDecl(false);
+    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kConstructor, token->line_number()));
+    ParseTerminator();
+    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kConstructor, token->line_number()));
+    exp->CastToExpression()->CastToFunction()->MarkAsDeclaration();
+    member_type = ClassMember::kConstructor;
+  } else if (token->type() == Token::JS_STATIC) {
+    Advance();
+    exp = ParseExportableDefinition();
+    member_type = ClassMember::kPublicStatic;
+  } else if (token->type() == Token::JS_PRIVATE) {
+    Advance();
+    exp = ParseExportableDefinition();
+    member_type = ClassMember::kPrivate;
+  } else if (token->type() == Token::JS_PUBLIC) {
+    Advance();
+    exp = ParseExportableDefinition();
+    member_type = ClassMember::kPublic;
+  } else if (token->type() == Token::JS_IDENTIFIER &&
+              strcmp(token->token(), "mixin") == 0) {
+    Advance();
+    exp = ParseMixin();
+    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kMixin, token->line_number()));
+    ParseTerminator();
+    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kMixin, token->line_number()));
+    member_type = ClassMember::kMixin;
+  } else {
+    exp = ParseExportableDefinition();
+    if (exp->node_type() == AstNode::kClassMember) {
+      return reinterpret_cast<ClassMember*>(exp);
+    }
+    member_type = ClassMember::kPrototype;
+  }
+  ClassMember* member = new(pool()) ClassMember(member_type, token->line_number());
+  member->AddChild(exp);
+  END(ClassMember);
+  return member;
+}
+
+
+AstNode* Parser::ParseExportableDefinition() {
+  ENTER(ExportableDefinition);
+  TokenInfo *token = Seek();
+  if (token->type() == Token::JS_IDENTIFIER || token->type() == '{' || token->type() == '[') {
+    token = Seek(2);
+    if (token->type() == '(' || token->type() == Token::JS_FUNCTION_GLYPH ||
+         token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+      END(ExportableDefinition);
+      AstNode* ret = ParseFunctionDecl(false);
+      CHECK_ERROR(ret);
+      ParseTerminator();
+      CHECK_ERROR(ret);
+      return ret;
+    } else {
+      AstNode* ret = ParseVariableDecl(false);
+      CHECK_ERROR(ret);
+      ParseTerminator();
+      CHECK_ERROR(ret);
+      END(ExportableDefinition);
+      return ret;
+    }
+  } else if (token->type() == Token::JS_CLASS) {
+    Advance();
+    AstNode* class_exp = ParseClassDecl(false);
+    CHECK_ERROR(class_exp);
+    END(ExportableDefinition);
+    return class_exp;
+  } else {
+    if (token->type() == Token::JS_CONST) {
+      token = Seek(2);
+      if (token->type() == Token::JS_CLASS) {
+        END(ExportableDefinition);
+        return ParseClassDecl(true);
+      } else if (token->type() == '(' || token->type() == Token::JS_FUNCTION_GLYPH ||
+                  token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+        Advance();
+        END(ExportableDefinition);
+        AstNode* ret = ParseFunctionDecl(true);
+        CHECK_ERROR(ret);
+        ParseTerminator();
+        CHECK_ERROR(ret);
+        ret->CastToExpression()->CastToFunction()->MarkAsConstDeclaration();
+        return ret;
+      } else {
+        Advance();
+        AstNode* ret = ParseVariableDecl(false);
+        CHECK_ERROR(ret);
+        ParseTerminator();
+        CHECK_ERROR(ret);
+        END(ExportableDefinition);
+        ret->CastToExpression()->CastToVariableDeclarationList()->MarkAsConstDeclaration();
+        return ret;
+      }
+    } else if (token->type() == Token::JS_GET) {
+      AstNode* fn = ParseFunctionDecl(false);
+      CHECK_ERROR(fn);
+      fn->CastToExpression()->CastToFunction()->set_attribute(Function::kGet);
+      END(ExportableDefinition);
+      return fn;
+    } else if (token->type() == Token::JS_SET) {
+      AstNode* fn = ParseFunctionDecl(false);
+      CHECK_ERROR(fn);
+      fn->CastToExpression()->CastToFunction()->set_attribute(Function::kSet);
+      END(ExportableDefinition);
+      return fn;
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'exportable definition' expect 'identifier','const','get' or 'set'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(ExportableDefinitionError);
+      return new(pool()) Empty;
+    }
+  }
+}
+
+
+AstNode* Parser::ParseExpression(bool is_noin) {
+  ENTER(Expression);
+  Expression* exp = new(pool()) Expression(Seek()->line_number());
+  AstNode* assignment = ParseAssignmentExpression(is_noin);
+  CHECK_ERROR(exp);
+  exp->AddChild(assignment);
+  TokenInfo* token = Seek();
+  if (token->type() == ',') {
+    Advance();
+    while (1) {
+      AstNode* assignment = ParseAssignmentExpression(is_noin);
+      CHECK_ERROR(exp);
+      exp->AddChild(assignment);
+      token = Seek();
+      if (token->type() == ',') {
+        token = Advance();
+      } else {
+        break;
+      }
+    }
+  }
+  END(Expression);
+  return exp;
+}
+
+bool IsAssignmentOp(int type) {
+  return type == '=' || type == Token::JS_MUL_LET ||
+      type == Token::JS_DIV_LET || type == Token::JS_MOD_LET ||
+      type == Token::JS_ADD_LET || type == Token::JS_SUB_LET ||
+      type == Token::JS_SHIFT_LEFT_LET || type == Token::JS_SHIFT_RIGHT_LET ||
+      type == Token::JS_U_SHIFT_RIGHT_LET || type == Token::JS_AND_LET ||
+      type == Token::JS_NOT_LET || type == Token::JS_OR_LET;
+}
+
+AstNode* Parser::ParseAssignmentExpression(bool is_noin) {
+  ENTER(AssignmentExpression);
+  AstNode* exp = ParseYieldExpression(is_noin);
+  CHECK_ERROR(exp);
+  TokenInfo *token = Seek();
+  if (IsAssignmentOp(token->type())) {
+    Advance();
+    if (exp->CastToExpression() && exp->CastToExpression()->IsValidLhs()) {
+      if (exp->CastToExpression()->IsParenthesis() && exp->child_length() > 0) {
+        AstNode* tmp = exp->last_child();
+        while (tmp->node_type() == AstNode::kExpression) {
+          tmp = tmp->first_child();
+          if (tmp->node_type() == AstNode::kExpression && tmp->child_length() > 1) {
+            SYNTAX_ERROR("invalid left hand side\\nin file "
+                          << filename_ << " at line " << token->line_number());
+            END(AssignmentExpressionError);
+            return exp;
+          }
+        }
+        if (tmp->node_type() == AstNode::kArrayLikeLiteral ||
+             tmp->node_type() == AstNode::kObjectLikeLiteral) {
+          exp = tmp;
+        }
+      }
+      exp->CastToExpression()->MarkAsLhs();
+      AstNode* rhs = ParseAssignmentExpression(is_noin);
+      CHECK_ERROR(rhs);
+      AssignmentExp* assign_exp = new(pool()) AssignmentExp(token->type(), exp, rhs, rhs->line_number());
+      return assign_exp;
+    } else {
+      SYNTAX_ERROR("parse error invalid left hand side expression in 'assignment expression'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(AssignmentExpressionError);
+      return new(pool()) Empty;
+    }
+  }
+  END(AssignmentExpression);
+  return exp;
+}
+
+AstNode* Parser::ParseYieldExpression(bool is_noin) {
+  ENTER(YieldExpression);
+  TokenInfo* token = Seek();
+  if (token->type() == Token::JS_YIELD) {
+    if (state_stack_->Has(StateStack::kFinally)) {
+      SYNTAX_ERROR("yield statement not allowed in 'finally block'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(YieldExpressionError);
+      return new(pool()) Empty;
+    }
+    if (!state_stack_->Has(StateStack::kFunction)) {
+      SYNTAX_ERROR("yield statement only allowed in 'function'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(YieldExpressionError);
+      return new(pool()) Empty;
+    }
+    bits_.Set(YIELD_FLG);
+    Advance();
+    token = Seek();
+    if (token->linebreak_after() || token->type() == ';' || token->type() == '}') {
+      if (token->type() == ';') {
+        Advance();
+      }
+      YieldExp* exp = new(pool()) YieldExp(token->line_number());
+      exp->AddChild(new(pool()) Empty);
+      END(YieldExpression);
+      return exp;
+    } else {
+      YieldExp* exp = new(pool()) YieldExp(token->line_number());
+      AstNode* assignment = ParseAssignmentExpression(false);
+      CHECK_ERROR(exp);
+      exp->AddChild(assignment);
+      END(YieldExpression);
+      return exp;
+    }
+  } else {
+    END(YieldExpression);
+    return ParseConditional(is_noin);
+  }
+}
+
+AstNode* Parser::ParseConditional(bool is_noin) {
+  ENTER(Conditional);
+  AstNode* exp = ParseBinaryExpression(is_noin);
+  CHECK_ERROR(exp);
+  TokenInfo* token = Seek();
+  if (token->type() == '?') {
+    Advance();
+    AstNode* left = ParseAssignmentExpression(is_noin);
+    CHECK_ERROR(exp);
+    token = Seek();
+    if (token->type() == ':') {
+      Advance();
+      AstNode* right = ParseAssignmentExpression(is_noin);
+      CHECK_ERROR(exp);
+      ConditionalExp* cond = new(pool()) ConditionalExp(exp, left, right, token->line_number());
+      END(Conditional);
+      cond->MarkAsInValidLhs();
+      return cond;
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'conditional expression' expect ':'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(ConditionalError);
+      return new(pool()) Empty;
+    }
+  } else {
+    END(Conditional);
+    return exp;
+  }
+}
+
+
+AstNode* Parser::ParseBinaryExpression(bool is_noin) {
+  ENTER(BinaryExpression);
+  AstNode* last = 0;
+  AstNode* first = 0;
+  AstNode* lhs = ParseUnaryExpression();
+  AstNode* exp = 0;
+  CHECK_ERROR(lhs);
+  while (1) {
+    TokenInfo* token = Seek();
+    switch (token->type()) {
+      case Token::JS_LOGICAL_AND :
+      case Token::JS_LOGICAL_OR :
+      case Token::JS_EQUAL :
+      case Token::JS_NOT_EQUAL :
+      case Token::JS_EQ :
+      case Token::JS_NOT_EQ :
+      case Token::JS_LESS_EQUAL :
+      case Token::JS_GREATER_EQUAL :
+      case Token::JS_INSTANCEOF :
+      case '<' :
+      case '>' : {
+        Advance();
+        AstNode* rhs = ParseUnaryExpression();
+        CHECK_ERROR(rhs);
+        if (last == 0) {
+          exp = new(pool()) CompareExp(token->type(), lhs, rhs, token->line_number());
+          first = exp;
+        } else {
+          exp = new(pool()) CompareExp(token->type(), last, rhs, token->line_number());
+        }
+        exp->CastToExpression()->MarkAsInValidLhs();
+        last = exp;
+      }
+        break;
+
+      case Token::JS_IN : {
+        if (!is_noin) {
+          Advance();
+          AstNode* rhs = ParseUnaryExpression();
+          CHECK_ERROR(rhs);
+          if (last == 0) {
+            exp = new(pool()) CompareExp(token->type(), lhs, rhs, token->line_number());
+            first = exp;
+          } else {
+            exp = new(pool()) CompareExp(token->type(), last, rhs, token->line_number());
+          }
+          exp->CastToExpression()->MarkAsInValidLhs();
+          last = exp;
+        } else {
+          END(BinaryExpressionNoIn);
+          return (first == 0)? lhs : exp;
+        }
+      }
+        break;
+
+      case '|' :
+      case '^' :
+      case '&' :
+      case '+' :
+      case '-' :
+      case '*' :
+      case '/' :
+      case '%' :
+      case Token::JS_SHIFT_LEFT :
+      case Token::JS_SHIFT_RIGHT :
+      case Token::JS_U_SHIFT_RIGHT :{
+        Advance();
+        AstNode* rhs = ParseUnaryExpression();
+        CHECK_ERROR(rhs);
+        if (last == 0) {
+          exp = new(pool()) BinaryExp(token->type(), lhs, rhs, token->line_number());
+          first = exp;
+        } else {
+          exp = new(pool()) BinaryExp(token->type(), last, rhs, token->line_number());
+        }
+        exp->CastToExpression()->MarkAsInValidLhs();
+        last = exp;
+      }
+        break;
+
+      default :
+        END(BinaryExpression);
+        return (exp == 0)? lhs : exp;
+    }
+  }
+}
+
+
+
+bool IsUnaryOp(int type) {
+  return type == Token::JS_DELETE || type == Token::JS_VOID ||
+      type == Token::JS_TYPEOF || type == Token::JS_INCREMENT ||
+      type == Token::JS_DECREMENT || type == '+' ||
+      type == '-' || type == '~' || type == '!';
+}
+
+
+AstNode* Parser::ParseUnaryExpression() {
+  ENTER(UnaryExpression);
+  TokenInfo* token = Seek();
+  if (IsUnaryOp(token->type())) {
+    Advance();
+    AstNode* post_exp = ParseUnaryExpression();
+    CHECK_ERROR(post_exp);
+    post_exp->CastToExpression()->MarkAsInValidLhs();
+    UnaryExp* unary = new(pool()) UnaryExp(token->type(), post_exp, token->line_number());
+    post_exp->CastToExpression()->MarkAsUnary();
+    END(UnaryExpression);
+    return unary;
+  } else {
+    END(UnaryExpression);
+    return ParsePostfixExpression();
+  }
+}
+
+
+AstNode* Parser::ParsePostfixExpression() {
+  ENTER(PostfixExpression);
+  AstNode* lhs = ParseLeftHandSideExpression();
+  CHECK_ERROR(lhs);
+  TokenInfo *token = Seek();
+  if (!token->linebreak_before() && (token->type() == Token::JS_INCREMENT || token->type() == Token::JS_DECREMENT)) {
+    lhs->CastToExpression()->MarkAsInValidLhs();
+    PostfixExp* post = new(pool()) PostfixExp(token->type(), lhs, token->line_number());
+    Advance();
+    END(PostfixExpression);
+    return post;
+  }
+  END(PostfixExpression);
+  return lhs;
+}
+
+
+AstNode* Parser::ParseLeftHandSideExpression() {
+  ENTER(LeftHandSideExpression);
+  TokenInfo *token = Seek();
+  AstNode* node;
+  if (token->type() == Token::JS_NEW) {
+    node = ParseNewExpression();
+    node->CastToExpression()->MarkAsInValidLhs();
+  } else {
+    node = ParseCallExpression();
+  }
+  END(LeftHandSide);
+  return node;
+}
+
+NewExp* Parser::ParseNewExpression() {
+  ENTER(NewExpression);
+  Advance();
+  TokenInfo* token = Seek();
+  NewExp* exp = new(pool()) NewExp(token->line_number());
+  NewExp* first = exp;
+  while (token->type() == Token::JS_NEW) {
+    Advance();
+    NewExp *next = new(pool()) NewExp(token->line_number());
+    exp->AddChild(next);
+    exp = next;
+    token = Seek();
+  }
+  AstNode* member = ParseCallExpression();
+  CHECK_ERROR(exp);
+  exp->AddChild(member);
+  END(NewExpression);
+  return first;
+}
+
+AstNode* Parser::ParseCallExpression() {
+  ENTER(CallExpression);
+  AstNode* member = ParseMemberExpression();
+  CHECK_ERROR(member);
+  TokenInfo* token = Seek();
+  if (token->type() == '(') {
+    Advance();
+    AstNode* arguments = ParseArguments();
+    CHECK_ERROR(arguments);
+    token = Advance();
+    if (token->type() != ')') {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'call expression' expect ')'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+    }
+    token = Seek();
+    bool is_function_decl = (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT);
+    Literal* symbol = member->CastToLiteral();
+    if (symbol && symbol->value_type() == Literal::kIdentifier && is_function_decl) {
+      Advance();
+      AstNode* fn = ParseArrowFunctionExpression(member, arguments, token->type());
+      CHECK_ERROR(fn);
+      END(ParseCallExpression_);
+      return fn;
+    } else if (is_function_decl) {
+      SYNTAX_ERROR("parse error arrow function expression name must be 'identifier'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+    }
+    CallExp* exp = new(pool()) CallExp(CallExp::kNormal, token->line_number());
+    exp->set_callable(member);
+    exp->set_args(arguments);
+    token = Seek();
+    if (token->type() == '.' || token->type() == '[' || token->type() == '(') {
+      if (token->type() != '(') {
+        exp = ParseEachMember(token->type(), true, exp);
+      }
+      token = Seek();
+      while (1) {
+        CallExp* ret = 0;
+        if (token->type() != '(') {
+          ret = ParseEachMember(token->type(), false, exp);
+        } else if (token->type() == '(') {
+          Advance();
+          AstNode* arguments = ParseArguments();
+          CHECK_ERROR(arguments);
+          token = Advance();
+          if (token->type() != ')') {
+            SYNTAX_ERROR("parse error got unexpected token "
+                          << TokenConverter(token).cstr()
+                          << " in 'call expression' expect ')'\\nin file "
+                          << filename_ << " at line " << token->line_number());
+            END(CallExpressionError);
+            return exp;
+          }
+          ret = new(pool()) CallExp(CallExp::kNormal, token->line_number());
+          ret->set_callable(exp);
+          ret->MarkAsInValidLhs();
+          if (arguments->child_length() == 0) {
+            ret->set_args(new(pool()) Empty);
+          } else {
+            ret->set_args(arguments);
+          }
+        }
+        if (ret == 0) {
+          END(CallExpression);
+          return exp;
+        } else {
+          exp = ret;
+        }
+        token = Seek();
+      }
+      END(CallExpression);
+      return exp;
+    } else if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+      Advance();
+      END(CallExpression);
+      return ParseArrowFunctionExpression(member, arguments, token->type());
+    } else {
+      END(CallExpression);
+      exp->CastToExpression()->MarkAsInValidLhs();
+      return exp;
+    }
+  } else {
+    END(CallExpression);
+    return member;
+  }
+}
+
+
+AstNode* Parser::ParseArguments() {
+  ENTER(Arguments);
+  TokenInfo* token = Seek();
+  NodeList* list = new(pool()) NodeList;
+  if (token->type() != ')') {
+    while (token->type() != ')') {
+      if (token->type() == Token::JS_PARAMETER_REST) {
+        Advance();
+        token = Seek();
+        if (token->type() == Token::JS_IDENTIFIER) {
+          AstNode* value = ParseLiteral();
+          CHECK_ERROR(list);
+          value->CastToLiteral()->set_value_type(Literal::kSpread);
+          list->AddChild(value);
+        } else {
+          SYNTAX_ERROR("parse error got unexpected token "
+                        << TokenConverter(token).cstr()
+                        << " in 'formal parameter rest or arguments spread' expect 'identifier'\\nin file "
+                        << filename_ << " at line " << token->line_number());
+          END(FormalParameterErrror);
+          return list;
+        }
+      } else {
+        AstNode* exp = ParseAssignmentExpression(false);
+        CHECK_ERROR(list);
+        list->AddChild(exp);
+      }
+      token = Seek();
+      if (token->type() == ',') {
+        Advance();
+        token = Seek();
+      }
+    }
+    END(Arguments);
+    return list;
+  } else {
+    END(Arguments);
+    return new(pool()) Empty;
+  }
+}
+
+
+AstNode* Parser::ParseMemberExpression() {
+  ENTER(MemberExpression);
+  TokenInfo* token = Seek();
+  CallExp* exp;
+  if (token->type() == Token::JS_PRIVATE) {
+    TokenInfo* pr_sym = token;
+    Literal* private_literal = new(pool()) Literal(Literal::kProperty, token->line_number());
+    private_literal->set_value(pr_sym);
+    private_literal->MarkAsInValidLhs();
+    Advance();
+    token = Seek();
+    if (token->type() != '.' && token->type() != '[') {
+      END(MemberExpression);
+      private_literal->set_value_type(Literal::kPrivate);
+      return private_literal;
+    }
+    exp = new(pool()) CallExp(CallExp::kPrivate, token->line_number());
+    exp->set_callable(private_literal);
+    ParseEachMember(token->type(), true, exp);
+    token = Seek();
+  } else {
+    AstNode *primary = ParsePrimaryExpression();
+    CHECK_ERROR(primary);
+    token = Seek();
+    if (token->type() != '.' && token->type() != '[') {
+      END(MemberExpression);
+      return primary;
+    }
+    int call_type = (token->type() == '.')? CallExp::kDot : CallExp::kBracket;
+    exp = new(pool()) CallExp(call_type, token->line_number());
+    exp->set_callable(primary);
+    ParseEachMember(token->type(), true, exp);
+    token = Seek();
+  }
+  while (1) {
+    CallExp* ret = ParseEachMember(token->type(), false, exp);
+    if (ret == 0) {
+      END(MemberExpression);
+      return exp;
+    } else {
+      exp = ret;
+    }
+    token = Seek();
+  }
+  END(MemberExpression);
+  return exp;
+}
+
+
+AstNode* Parser::ParseBracketMember() {
+  ENTER(BracketMember);
+  Advance();
+  AstNode* node = ParseExpression(false);
+  CHECK_ERROR(node);
+  TokenInfo* token = Advance();
+  if (token->type() != ']') {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'member expression' expect ']'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(BracketMemberError);
+    return node;
+  }
+  END(BracketMember);
+  return node;
+}
+
+
+AstNode* Parser::ParseDotMember(bool *is_extend) {
+  ENTER(DotMember);
+  TokenInfo* token = Seek();
+  int extend_type = Seek(2)->type();
+  if (extend_type == '{') {
+    *is_extend = true;
+    Advance(2);
+    AstNode* node = ParseObjectLiteral();
+    CHECK_ERROR(node);
+    return node;
+  } else {
+    Advance();
+    AstNode* node = ParseLiteral();
+    CHECK_ERROR(node);
+    Literal* maybe_ident = node->CastToLiteral();
+    if (!maybe_ident || maybe_ident->value_type() != Literal::kIdentifier) {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'member expression' expect 'identifier'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(DotMemberError);
+      return node;
+    } else if (maybe_ident->value_type() == Literal::kIdentifier) {
+      maybe_ident->set_value_type(Literal::kProperty);
+    }
+    END(DotMember);
+    return node;
+  }
+}
+
+
+CallExp* Parser::ParseEachMember(int type, bool is_first, CallExp* exp) {
+  ENTER(EachMember);
+  int64_t line = Seek(-1)->line_number();
+  if (type == '[') {
+    AstNode* node = ParseBracketMember();
+    CHECK_ERROR(exp);
+    if (is_first) {
+      if (exp->call_type() == CallExp::kNormal) {
+        CallExp* accessor = new(pool()) CallExp(CallExp::kBracket, line);
+        accessor->set_callable(exp);
+        accessor->set_args(node);
+        return accessor;
+      } else {
+        exp->set_args(node);
+        END(EachMember);
+        return exp;
+      }
+    } else {
+      CallExp* accessor = new(pool()) CallExp(CallExp::kBracket, line);
+      accessor->set_callable(exp);
+      accessor->set_args(node);
+      END(EachMember);
+      return accessor;
+    }
+  } else if (type == '.') {
+    bool is_extend = false;
+    AstNode* node = ParseDotMember(&is_extend);
+    CHECK_ERROR(exp);
+    if (is_first) {
+      if (exp->call_type() == CallExp::kNormal) {
+        int type = (is_extend)? CallExp::kExtend : CallExp::kDot;
+        CallExp* accessor = new(pool()) CallExp(type, line);
+        accessor->set_callable(exp);
+        accessor->set_args(node);
+        return accessor;
+      } else {
+        exp->set_args(node);
+        END(EachMember);
+        return exp;
+      }
+    } else {
+      int type = (is_extend)? CallExp::kExtend : CallExp::kDot;
+      CallExp* accessor = new(pool()) CallExp(type, line);
+      accessor->set_callable(exp);
+      accessor->set_args(node);
+      END(EachMember);
+      return accessor;
+    }
+  } else {
+    END(EachMember);
+    return 0;
+  }
+}
+
+
+AstNode* Parser::ParsePrimaryExpression() {
+  ENTER(PrimaryExpression);
+  TokenInfo* token = Advance();
+  TokenInfo* function_signature = Seek();
+  if (token->type() == Token::JS_FUNCTION) {
+    AstNode* fn = ParseFunctionDecl(false);
+    CHECK_ERROR(fn);
+    fn->CastToExpression()->MarkAsInValidLhs();
+    END(MemberExpression);
+    return fn;
+  } else if (token->type() == Token::JS_CLASS) {
+    AstNode* class_exp = ParseClassDecl(false);
+    CHECK_ERROR(class_exp);
+    class_exp->CastToExpression()->MarkAsInValidLhs();
+    return class_exp;
+  } else if (token->type() == Token::JS_IDENTIFIER && strcmp(token->token(), "trait") == 0 &&
+              (Seek()->type()  == '{' || Seek(2)->type() == '{')) {
+    AstNode* trait = ParseTrait();
+    CHECK_ERROR(trait);
+    return trait;
+  } else if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    AstNode* fn = ParseArrowFunctionExpression(token->type());
+    CHECK_ERROR(fn);
+    fn->CastToExpression()->MarkAsInValidLhs();
+    END(MemberExpression);
+    return fn;
+  } else if (token->type() == Token::JS_IDENTIFIER && (function_signature->type() == Token::JS_FUNCTION_GLYPH ||
+                                                         function_signature->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT)) {
+    Undo();
+    END(MemberExpression);
+    return ParseFunctionDecl(false);
+  } else if (token->type() == '{') {
+    END(PrimaryExpression);
+    return ParseObjectLiteral();
+  } else if (token->type() == '[') {
+    END(PrimaryExpression);
+    return ParseArrayLiteral();
+  } else if (token->type() == '(') {
+    AstNode* exp = ParseExpression(false);
+    CHECK_ERROR(exp);
+    if (exp->child_length() > 1) {
+      exp->CastToExpression()->MarkAsInValidLhs();
+    }
+    token = Seek();
+    if (token->type() == ')') {
+      Advance();
+      token = Seek();
+      Expression *expression = exp->CastToExpression();
+      expression->MarkParenthesis();
+    } else if (token->type() == Token::JS_FOR) {
+      AstNode* generator = ParseGeneratorExpression(exp);
+      CHECK_ERROR(generator);
+      token = Advance();
+      if (token->type() != ')') {
+        SYNTAX_ERROR("unmatched parensis\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        return generator;
+      }
+      return generator;
+    } else {
+      SYNTAX_ERROR("parse error unmatched parensis\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      return exp;
+    }
+    if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+      Advance();
+      END(PrimaryExpression);
+      AstNode* ret = ParseArrowFunctionExpression(exp, token->type());
+      CHECK_ERROR(ret);
+      ret->CastToExpression()->MarkAsInValidLhs();
+      return ret;
+    } else {
+      END(PrimaryExpression);
+      return exp;
+    }
+  } else if (token->type() == '#') {
+    token = Advance();
+    if (token->type() == '[') {
+      AstNode* elem = ParseArrayLiteral();
+      CHECK_ERROR(elem);
+      elem->CastToExpression()->MarkAsInValidLhs();
+      elem->CastToExpression()->CastToArrayLikeLiteral()->MarkAsTuple();
+      return elem;
+    } else if (token->type() == '{') {
+      AstNode* elem = ParseObjectLiteral();
+      CHECK_ERROR(elem);
+      elem->CastToExpression()->MarkAsInValidLhs();
+      elem->CastToExpression()->CastToObjectLikeLiteral()->MarkAsRecord();
+      return elem;
+    } else {
+      SYNTAX_ERROR("got unexpected token "
+                    << TokenConverter(token).cstr() <<
+                    " expect '[' \\nin file "
+                    << filename_ << " at line " << token->line_number());
+      return new(pool()) Empty;
+    }
+  } else if (token->type() == Token::JS_FUNCTION_GLYPH ||
+              token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    AstNode* fn = ParseArrowFunctionExpression(token->type());
+    END(PrimaryExpression);
+    fn->CastToExpression()->MarkAsInValidLhs();
+    return fn;
+  } else if (token->type() == Token::JS_DO) {
+    AstNode* ret = ParseDoWhileStatement(true);
+    CHECK_ERROR(ret);
+    return ret;
+  } else {
+    Undo();
+    END(PrimaryExpression);
+    return ParseLiteral();
+  }
+}
+
+
+AstNode* Parser::ParseGeneratorExpression(AstNode* exp) {
+  AstNode* node = ParseArrayComprehensions();
+  CHECK_ERROR(node);
+  GeneratorExpression* generator = new(pool()) GeneratorExpression(exp, Seek(-1)->line_number());
+  generator->AddChild(node);
+  return generator;
+}
+
+
+AstNode* Parser::ParseObjectLiteral() {
+  ENTER(ObjectLiteral);
+  TokenInfo* token = Seek();
+  int maybe_colon = Seek(2)->type();
+  ObjectLikeLiteral* object = new(pool()) ObjectLikeLiteral(token->line_number());
+  if (token->type() != '}') {
+    while (1) {
+      if (maybe_colon == '}') {
+        AstNode* node = ParseObjectElement(token->type(), token, object);
+        CHECK_ERROR(node);
+        node->AddChild(node->Clone(pool()));
+        break;
+      } else if (maybe_colon == ',') {
+        AstNode* node = ParseObjectElement(token->type(), token, object);
+        CHECK_ERROR(object);
+        node->AddChild(node->Clone(pool()));
+        token = Seek();
+      } else if (maybe_colon == ':') {
+        AstNode* node = ParseLiteral();
+        CHECK_ERROR(node);
+        Literal* prop = node->CastToLiteral();
+        if (prop->value_type() == Literal::kIdentifier) {
+          prop->set_value_type(Literal::kProperty);
+        }
+        Advance();
+        token = Seek();
+        AstNode* assign;
+        if (token->type() == '{' || token->type() == '[') {
+          assign = ParseAssignmentExpression(false);
+        } else {
+          assign = ParseAssignmentExpression(false);
+          if (assign->CastToLiteral()) {
+            Literal* literal = assign->CastToLiteral();
+            if (literal->value_type() != Literal::kIdentifier) {
+              object->MarkAsInValidLhs();
+            }
+          } else {
+            object->MarkAsInValidLhs();
+          }
+        }
+        CHECK_ERROR(assign);
+        node->AddChild(assign);
+        object->set_element(node);
+        token = Seek();
+      } else if (token->type() == '[') {
+        AstNode* node = ParseObjectElement(token->type(), token, object);
+        CHECK_ERROR(node);
+        token = Advance();
+        if (token->type() == ':') {
+          AstNode* assign;
+          token = Seek();
+          if (token->type() == '{') {
+            Advance();
+            assign = ParseObjectLiteral();
+          } else {
+            assign = ParseAssignmentExpression(false);
+          }
+          CHECK_ERROR(assign);
+          node->AddChild(assign);
+          token = Seek();
+        }
+      } else if (maybe_colon == '(' || maybe_colon == Token::JS_FUNCTION_GLYPH ||
+                  maybe_colon == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+        AstNode* fn = ParseFunctionDecl(false);
+        CHECK_ERROR(fn);
+        Literal* val = fn->CastToExpression()->CastToFunction()->name()->Clone(pool())->CastToLiteral();
+        val->set_value_type(Literal::kProperty);
+        fn->CastToExpression()->CastToFunction()->set_name(new(pool()) Empty);
+        val->AddChild(fn);
+        object->set_element(val);
+        val->set_value_type(Literal::kProperty);
+        token = Seek();
+        object->MarkAsInValidLhs();
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << ". In 'object literal'\\n"
+                      << filename_ << " at line " << token->line_number());
+        END(ObjectLiteralError);
+        return object;
+      }
+      if (token->type() == ',') {
+        Advance();
+      } else if (token->type() == '}') {
+        Advance();
+        break;
+      }
+      token = Seek();
+      maybe_colon = Seek(2)->type();
+    }
+  } else {
+    Advance();
+  }
+  END(ObjectLiteral);
+  return object;
+}
+
+
+
+AstNode* Parser::ParseObjectElement(int type, TokenInfo* token, ObjectLikeLiteral* list) {
+  ENTER(ObjectElement);
+  if (IsValidPropertyName(type)) {
+    AstNode* node = ParseLiteral();
+    CHECK_ERROR(node);
+    Advance();
+    list->set_element(node);
+    END(ObjectElement);
+    Literal* name = node->CastToLiteral();
+    if (name->value_type() == Literal::kIdentifier) {
+      name->set_value_type(Literal::kProperty);
+    }
+    return node;
+  } else if (type == '[') {
+    Advance();
+    AstNode* node = ParseAssignmentExpression(true);
+    TokenInfo* token = Seek();
+    if (token->type() != ']') {
+      SYNTAX_ERROR("in 'object literal private property' expect ']' but got " << TokenConverter(token).cstr()
+                    << "\\nin file " << filename_ << " at line " << token->line_number());
+      END(ObjectElementError);
+      return node;
+    } else {
+      Advance();
+      Literal* value = new(pool()) Literal(Literal::kPrivateProperty, token->line_number());
+      value->set_node(node);
+      list->set_element(value);
+      list->MarkAsInValidLhs();
+      return value;
+    }
+  } else {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << ". In 'object literal'"
+                  " member only allowed 'string literal','number' or 'identifier'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(ObjectElementError);
+    return new(pool()) Empty;
+  }
+}
+
+
+AstNode* Parser::ParseArrayLiteral() {
+  ENTER(ArrayLiteral);
+  ArrayLikeLiteral* array = new(pool()) ArrayLikeLiteral(Seek(-1)->line_number());
+  TokenInfo* token = Seek();
+  int count = 0;
+  if (token->type() == ']') {
+    Advance();
+    END(ArrayLiteral);
+    return array;
+  } else {
+    while (1) {
+      if (token->type() == ',') {
+        array->set_element(new(pool()) Empty);
+        int last_type = Seek(-1)->type();
+        token = Advance();
+        if (token->type() == ']') {
+          Advance();
+          if (last_type == '[') {
+            array->set_element(new(pool()) Empty);
+          }
+          break;
+        }
+      } else if (token->type() == Token::JS_PARAMETER_REST) {
+        token = Advance(2);
+        if (token->type() == Token::JS_IDENTIFIER) {
+          Literal* rest = new(pool()) Literal(Literal::kRest, token->line_number());
+          rest->set_value(token);
+          array->set_element(rest);
+          token = Seek();
+          if (token->type() == ']') {
+            Advance();
+            break;
+          }
+        } else {
+          SYNTAX_ERROR("unexpected token "
+                        << TokenConverter(token).cstr()
+                        << " expect 'identifier' in 'rest expression'\\nin file "
+                        << filename_ << " at line " << token->line_number());
+          END(ArrayLiteralError);
+          return array;
+        }
+      } else {
+        AstNode* node = ParseAssignmentExpression(false);
+        CHECK_ERROR(node);
+        array->set_element(node);
+        token = Seek();
+        if (token->type() == Token::JS_FOR) {
+          if (count > 0) {
+            SYNTAX_ERROR("parse error got unexpected token "
+                          << TokenConverter(token).cstr()
+                          << " in 'array comprehensions expect' 'assignment expression'\\nin file "
+                          << filename_ << " at line " << token->line_number());
+            END(ArrayLiteralError);
+            return array;
+          }
+          AstNode* cmp_node = ParseArrayComprehensions();
+          CHECK_ERROR(cmp_node);
+          array->elements()->RemoveChild(node);
+          NodeList* children = new(pool()) NodeList;
+          children->AddChild(node);
+          children->AddChild(cmp_node);
+          array->set_element(children);
+          array->MarkAsComprehensions();
+          token = Seek();
+          if (token->type() != ']') {
+            SYNTAX_ERROR("parse error got unexpected token "
+                          << TokenConverter(token).cstr()
+                          << " in 'array comprehensions expect' ']'\\nin file "
+                          << filename_ << " at line " << token->line_number());
+            END(ArrayLiteralError);
+            return array;
+          } else {
+            Advance();
+          }
+          END(ArrayLiteral);
+          return array;
+        } else if (token->type() == ',') {
+          Advance();
+          token = Seek();
+        } else if (token->type() == ']') {
+          Advance();
+          break;
+        }
+      }
+      count++;
+    }
+  }
+  END(ArrayLiteral);
+  return array;
+}
+
+
+AstNode* Parser::ParseLiteral() {
+  ENTER(Literal);
+  TokenInfo* token = Advance();
+  int value_type = 0;
+  bool is_invalid_lhs = false;
+  switch (token->type()) {
+    case Token::JS_NAN :
+      value_type = Literal::kNaN;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_SUPER :
+      value_type = Literal::kSuper;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_THIS :
+      value_type = Literal::kThis;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_IDENTIFIER : {
+      value_type = Literal::kIdentifier;
+      const char* ident = token->token();
+      int len = strlen(ident);
+      if (ident[ 0 ] == '@') {
+        Literal* this_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kThis),
+                                                      Token::JS_THIS, token->line_number(), Literal::kThis);
+        if (len > 1) {
+          Literal* value = builder()->CreateNameNode(&ident[ 1 ], Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
+          CallExp* this_accessor = builder()->CreateDotAccessor(this_sym, value, this_sym->line_number());
+          return this_accessor;
+        } else {
+          return this_sym;
+        }
+      } else if (len > 1 && ident[ 0 ] == '_' && ident[ 1 ] == '@') {
+        Literal* private_sym = builder()->CreateNameNode(JsToken::GetTokenFromNumber(Token::JS_PRIVATE),
+                                                         Token::JS_PRIVATE, token->line_number(), Literal::kPrivate);
+        if (len > 2) {
+          Literal* value = builder()->CreateNameNode(&ident[ 2 ], Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
+          CallExp* private_accessor = new(pool()) CallExp(CallExp::kPrivate, token->line_number());
+          private_accessor->set_callable(private_sym);
+          private_accessor->set_args(value);
+          return private_accessor;
+        } else {
+          return private_sym;
+        }
+      }
+    }
+      break;
+
+    case Token::JS_PARAMETER_REST : {
+      token = Seek();
+      if (token->type() == Token::JS_IDENTIFIER) {
+        AstNode* value = ParseLiteral();
+        CHECK_ERROR(value);
+        value->CastToLiteral()->set_value_type(Literal::kRest);
+        return value;
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                     << TokenConverter(token).cstr()
+                     << " in 'formal parameter rest' expect 'identifier'\\nin file "
+                     << filename_ << " at line " << token->line_number());
+        END(FormalParameterErrror);
+      }
+    }
+      break;
+
+    case Token::JS_TRUE :
+      value_type = Literal::kTrue;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_FALSE :
+      value_type = Literal::kFalse;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_NUMERIC_LITERAL :
+      value_type = Literal::kNumeric;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_STRING_LITERAL :
+      value_type = Literal::kString;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_REGEXP_LITERAL :
+      value_type = Literal::kRegExp;
+      is_invalid_lhs = true;
+      break;
+
+    case Token::JS_K_NULL :
+      value_type = Literal::kNull;
+      is_invalid_lhs = true;
+      break;
+
+    default : {
+      SYNTAX_ERROR("parse error got unexpected token '"
+                    << TokenConverter(token).cstr()
+                    << "' expect " << literals << "\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(LiteralError);
+      return new(pool()) Empty;
+    }
+  }
+  Literal* value = new(pool()) Literal(value_type, token->line_number());
+  value->set_value(token);
+  if (is_invalid_lhs) {
+    value->MarkAsInValidLhs();
+  }
+  END(Literal);
+  return value;
+}
+
+
+bool IsValidFormalParameter(int type) {
+  return type == Token::JS_IDENTIFIER || type == '{' || type == '[' || type == Token::JS_THIS || type == Token::JS_PRIVATE;
+}
+
+
+AstNode* Parser::ParseFunctionDecl(bool is_const) {
+  ENTER(FunctionDecl);
+  TokenInfo* token = Seek();
+  Function* fn = new(pool()) Function(token->line_number());
+  if (token->type() == Token::JS_IDENTIFIER) {
+    AstNode* name = ParseLiteral();
+    CHECK_ERROR(name);
+    fn->set_name(name);
+    token = Seek();
+  } else {
+    fn->set_name(new(pool()) Empty);
+  }
+
+  if (token->type() == '(') {
+    Advance();
+    token = Seek();
+    if (token->type() != ')') {
+      AstNode* list = ParseFormalParameter();
+      fn->set_argv(list);
+      token = Advance(2);
+    } else {
+      fn->set_argv(new(pool()) Empty);
+      token = Advance(2);
+    }
+  } else {
+    fn->set_argv(new(pool()) Empty);
+    token = Seek();
+    if (token->type() == Token::JS_FUNCTION_GLYPH ||
+         token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+      Advance();
+    }
+  }
+
+  if (token->type() == Token::JS_FUNCTION_GLYPH ||
+       token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    if (token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+      fn->set_context_type(Function::kThis);
+    }
+    token = Seek();
+    if (token->type() == '{') {
+      Advance();
+      state_stack_->Push(StateStack::kFunction);
+      bool has_return = bits_.At(RETURN_FLG);
+      bool has_yield = bits_.At(YIELD_FLG);
+      bits_.UnSet(RETURN_FLG);
+      bits_.UnSet(YIELD_FLG);
+      AstNode* body = ParseStatementList(BlockBodyMatcher, "}");
+      CHECK_ERROR(body);
+      builder()->FindDirectivePrologue(body, fn);
+      if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
+        SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(FunctionDeclError);
+        return fn;
+      }
+      if (!has_return) {
+        bits_.UnSet(RETURN_FLG);
+      }
+      if (!has_yield) {
+        bits_.UnSet(YIELD_FLG);
+      }
+      state_stack_->Pop();
+      CHECK_ERROR(body);
+      fn->Append(body);
+      Advance();
+      return fn;
+    } else {
+      AstNode* node = ParseAssignmentExpression(false);
+      CHECK_ERROR(node);
+      fn->AddChild(node);
+      fn->set_function_type(Function::kShorten);
+      END(FunctionDecl);
+      return fn;
+    }
+  } else {
+    if (token->type() == '{') {
+      state_stack_->Push(StateStack::kFunction);
+      bool has_return = bits_.At(RETURN_FLG);
+      bool has_yield = bits_.At(YIELD_FLG);
+      bits_.UnSet(RETURN_FLG);
+      bits_.UnSet(YIELD_FLG);
+      AstNode* body = ParseStatementList(BlockBodyMatcher, "}");
+      CHECK_ERROR(body);
+      builder()->FindDirectivePrologue(body, fn);
+      if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
+        SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(FunctionDeclError);
+        return fn;
+      }
+      if (!has_return) {
+        bits_.UnSet(RETURN_FLG);
+      }
+      if (!has_yield) {
+        bits_.UnSet(YIELD_FLG);
+      }
+      state_stack_->Pop();
+      CHECK_ERROR(body);
+      Advance();
+      fn->Append(body);
+      END(FunctionDecl);
+      return fn;
+    } else {
+      SYNTAX_ERROR("parse error got unexpected token "
+                    << TokenConverter(token).cstr()
+                    << " in 'function declaration' expect '{'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(FunctionDeclError);
+      return fn;
+    }
+  }
+}
+
+
+AstNode* Parser::ParseFormalParameter() {
+  ENTER(FormalParameter);
+  TokenInfo* token = Seek();
+  NodeList* list = new(pool()) NodeList;
+  while (token->type() != ')' && !IsEnd(token->type())) {
+    if (IsValidFormalParameter(token->type())) {
+      AstNode* node;
+      if(token->type() == '{' || token->type() == '['){
+        node = ParseDestructuringLeftHandSide();
+        CHECK_ERROR(node);
+        token = Seek();
+        if (token->type() == '=') {
+          AstNode* exp = ParseAssignmentExpression(false);
+          CHECK_ERROR(exp);
+          AssignmentExp* assign = new(pool()) AssignmentExp('=', node, exp, token->line_number());
+          node = assign;
+        }
+      } else {
+        node = ParseAssignmentExpression(false);
+        CHECK_ERROR(node);
+      }
+      CHECK_ERROR(node);
+      list->AddChild(node);
+      token = Seek();
+      if (token->type() != ')' && token->type() != ',') {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'formal parameter' expect ')' or ','\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(FormalParameterError);
+        return list;
+      } else if (token->type() == ',') {
+        Advance();
+      } else if (token->type() == ')') {
+        break;
+      }
+      token = Seek();
+    } else if (token->type() == Token::JS_PARAMETER_REST) {
+      Advance();
+      token = Seek();
+      if (token->type() == Token::JS_IDENTIFIER) {
+        AstNode* value = ParseLiteral();
+        CHECK_ERROR(value);
+        value->CastToLiteral()->set_value_type(Literal::kRest);
+        token = Seek();
+        list->AddChild(value);
+        if (token->type() != ')' && token->type() != ',') {
+          SYNTAX_ERROR("parse error got unexpected token "
+                        << TokenConverter(token).cstr()
+                        << " in 'formal parameter rest' can not continue after any 'formal parameter'\\nin file "
+                        << filename_ << " at line " << token->line_number());
+          END(FormalParameterError);
+          return list;
+        } else if (token->type() == ')') {
+          break;
+        }
+        token = Advance();
+      } else {
+        SYNTAX_ERROR("parse error got unexpected token "
+                      << TokenConverter(token).cstr()
+                      << " in 'formal parameter rest' expect 'identifier'\\nin file "
+                      << filename_ << " at line " << token->line_number());
+        END(FormalParameterErrror);
+        return list;
+      }
+    }
+  }
+  if (IsEnd(token->type())) {
+    SYNTAX_ERROR("parse error got unexpected token "
+                  << TokenConverter(token).cstr()
+                  << " in 'formal parameter' expect ')'\\nin file "
+                  << filename_ << " at line " << token->line_number());
+    END(FormalParameter);
+    return list;
+  }
+  return list;
+}
+
+
+AstNode* Parser::ParseArrowFunctionExpression(AstNode* exp, int type) {
+  ENTER(ArrowFunctionExpression);
+  Function* fn = new(pool()) Function(Seek(-1)->line_number());
+  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    fn->set_context_type(Function::kThis);
+  }
+  NodeList* list = FormalParameterConvertor(exp);
+  CHECK_ERROR(list);
+  fn->set_argv(list);
+  fn->set_name(new(pool()) Empty);
+  END(ArrowFunctionExpression);
+  return ParseArrowFunctionBody(fn);
+}
+
+AstNode* Parser::ParseArrowFunctionExpression(AstNode* member, AstNode* args, int type) {
+  ENTER(ArrowFunctionExpression);
+  Function* fn = new(pool()) Function(Seek(-1)->line_number());
+  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    fn->set_context_type(Function::kThis);
+  }
+  Literal* maybe_ident = member->CastToLiteral();
+  if (!maybe_ident || maybe_ident->value_type() != Literal::kIdentifier) {
+    SYNTAX_ERROR("parse error illegal function name "
+                  "in 'arrow function expression' expect 'identifier'\\nin file"
+                  << filename_ << " at line " << member->line_number());
+    END(ArrowFunctionExpression);
+    return fn;
+  }
+  fn->set_name(maybe_ident);
+  NodeList* list = FormalParameterConvertor(args);
+  CHECK_ERROR(list);
+  fn->set_argv(list);
+  END(ArrowFunctionExpression);
+  return ParseArrowFunctionBody(fn);
+}
+
+AstNode* Parser::ParseArrowFunctionExpression(int type) {
+  ENTER(ArrowFunctionExpression);
+  Function* fn = new(pool()) Function(Seek(-1)->line_number());
+  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
+    fn->set_context_type(Function::kThis);
+  }
+  fn->set_argv(new(pool()) Empty);
+  fn->set_name(new(pool()) Empty);
+  END(ArrowFunctionExpression);
+  return ParseArrowFunctionBody(fn);
+}
+
+AstNode* Parser::ParseArrowFunctionBody(Function* fn) {
+  ENTER(ArrowFunctionBody);
+  TokenInfo* token = Seek();
+  if (token->type() == '{') {
+    Advance();
+    state_stack_->Push(StateStack::kFunction);
+    bool has_return = bits_.At(RETURN_FLG);
+    bool has_yield = bits_.At(YIELD_FLG);
+    bits_.UnSet(RETURN_FLG);
+    bits_.UnSet(YIELD_FLG);
+    AstNode* list = ParseStatementList(BlockBodyMatcher, "}");
+    CHECK_ERROR(list);
+    builder()->FindDirectivePrologue(list, fn);
+    if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
+      SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
+                    << filename_ << " at line " << token->line_number());
+      END(FunctionDeclError);
+      return fn;
+    }
+    if (!has_return) {
+      bits_.UnSet(RETURN_FLG);
+    }
+    if (!has_yield) {
+      bits_.UnSet(YIELD_FLG);
+    }
+    state_stack_->Pop();
+    CHECK_ERROR(list);
+    fn->Append(list);
+    Advance();
+  } else {
+    AstNode* node = ParseAssignmentExpression(false);
+    CHECK_ERROR(node);
+    fn->AddChild(node);
+    fn->set_function_type(Function::kShorten);
+  }
+  END(ArrowFunctionBody);
+  return fn;
+}
+
+
+AstNode* Parser::ParseArrayComprehensions() {
+  ENTER(ArrayComprehensions);
+  TokenInfo* token = Advance();
+  NodeList *list = new(pool()) NodeList;
+  while (token->type() == Token::JS_FOR) {
+    AstNode* node = ParseForStatement(true);
+    CHECK_ERROR(node);
+    list->AddChild(node);
+    token = Advance();
+  }
+  if (token->type() == Token::JS_IF) {
+    AstNode* if_stmt = ParseIFStatement(true);
+    CHECK_ERROR(if_stmt);
+    list->AddChild(if_stmt);
+  } else {
+    Undo();
+  }
+  END(ArrayComprehensions);
+  return list;
+}
+}
diff --git a/src/mocha/roaster/nexc/parser/parser.h b/src/mocha/roaster/nexc/parser/parser.h
new file mode 100755
index 0000000..9094de9
--- /dev/null
+++ b/src/mocha/roaster/nexc/parser/parser.h
@@ -0,0 +1,133 @@
+#ifndef mocha_parser_h_
+#define mocha_parser_h_
+#include <string.h>
+#include <string>
+#include <mocha/roaster/ast/ast_foward_decl.h>
+#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
+#include <mocha/roaster/binding/parser_connector.h>
+#include <mocha/roaster/tokens/token_info.h>
+#include <mocha/roaster/tokens/js_token.h>
+#include <mocha/roaster/memory/pool.h>
+namespace mocha {
+class ErrorReporter;
+class ParserConnector;
+class AstBuilder;
+class Parser{
+ public :
+  Parser(ParserConnector* connector_, ErrorReporter* reporter, const char* filename);
+  ~Parser();
+  FileRoot* Parse();
+  class ParseEventListener {
+   public :
+    void operator()(CompilationEvent* event);
+  };
+ private :
+  typedef bool (*StatementListMatcher)(int type);
+  memory::Pool* pool() { return pool_; }
+  AstBuilder* builder() { return builder_; }
+  TokenInfo* Advance(int len = 1) {
+    TokenInfo* info = connector_->Advance(len);
+    //printf("advance %s\n", static_cast<const char*>(TokenConverter(info)));
+    return info;
+  }
+  TokenInfo* Undo(int len = 1) { return connector_->Undo(len); }
+  TokenInfo* Seek(int len = 1) {
+    TokenInfo* info = connector_->Seek(len);
+    //printf("seek %s\n", static_cast<const char*>(TokenConverter(info)));
+    return info;
+  }
+  void IllegalEnd(const char* expect, int64_t line);
+  void ParseTerminator();
+  NodeList* FormalParameterConvertor(AstNode *args);
+  AstNode* ParseProgram();
+  AstNode* ParseSourceElements();
+  AstNode* ParseSourceElement();
+  AstNode* ParseStatementList(StatementListMatcher matcher, const char* expect);
+  AstNode* ParseStatement();
+  AstNode* ParseBlockStatement();
+  AstNode* ParseModuleStatement();
+  AstNode* ParseExportStatement();
+  AstNode* ParseImportStatement();
+  AstNode* ParseImportExpression();
+  AstNode* ParseDebuggerStatement(TokenInfo* token);
+  AstNode* ParseVersionStatement();
+  AstNode* ParseAssertStatement();
+  AstNode* ParseVariableStatement();
+  AstNode* ParseVariableDecl(bool is_noin);
+  AstNode* ParseLetExpressionOrLetStatement();
+  AstNode* ParseLetExpressionExp();
+  AstNode* ParseDestructuringLeftHandSide();
+  AstNode* ParseArrayPattern();
+  AstNode* ParseObjectPattern();
+  AstNode* ParseObjectPatternElement(int type, TokenInfo* token, ObjectLikeLiteral* list);
+  AstNode* CheckLabellOrExpressionStatement();
+  AstNode* ParseIFStatement(bool is_comprehensions);
+  AstNode* ParseWhileStatement();
+  AstNode* ParseDoWhileStatement(bool is_exp);
+  AstNode* ParseForStatement(bool is_comprehensions);
+  void ParseForStatementCondition(NodeList* list);
+  void ParseForInStatementCondition(NodeList* list);
+  AstNode* ParseContinueStatement();
+  AstNode* ParseBreakStatement();
+  AstNode* ParseReturnStatement();
+  AstNode* ParseWithStatement();
+  AstNode* ParseSwitchStatement();
+  AstNode* ParseCaseClauses();
+  AstNode* ParseLabelledStatement();
+  AstNode* ParseThrowStatement();
+  AstNode* ParseTryStatement();
+  AstNode* ParseCatchBlock();
+  AstNode* ParseFinallyBlock();
+  AstNode* ParseTrait();
+  void ParseTraitBody(Trait* trait);
+  AstNode* ParseMixin();
+  AstNode* ParseClassDecl(bool is_const);
+  AstNode* ParseInheritDecl();
+  AstNode* ParseClassBody();
+  AstNode* ParseClassMemberStatement();
+  ClassMember* ParseClassMember();
+  AstNode* ParseExportableDefinition();
+  AstNode* ParseExpression(bool is_noin);
+  AstNode* ParseAssignmentExpression(bool is_noin);
+  AstNode* ParseYieldExpression(bool is_noin);
+  AstNode* ParseConditional(bool is_noin);
+  AstNode* ParseBinaryExpression(bool is_noin);
+  AstNode* ParseUnaryExpression();
+  AstNode* ParsePostfixExpression();
+  AstNode* ParseLeftHandSideExpression();
+  NewExp* ParseNewExpression();
+  AstNode* ParseCallExpression();
+  AstNode* ParseArguments();
+  AstNode* ParseMemberExpression();
+  AstNode* ParseBracketMember();
+  AstNode* ParseDotMember(bool *is_bool);
+  CallExp* ParseEachMember(int type, bool is_first, CallExp* exp);
+  AstNode* ParsePrimaryExpression();
+  AstNode* ParseGeneratorExpression(AstNode* exp);
+  AstNode* ParseObjectLiteral();
+  AstNode* ParseObjectElement(int type, TokenInfo* token, ObjectLikeLiteral* object);
+  AstNode* ParseArrayLiteral();
+  AstNode* ParseLiteral();
+  AstNode* ParseFunctionDecl(bool is_const);
+  AstNode* ParseFormalParameter();
+  AstNode* ParseArrowFunctionExpression(AstNode* exp, int type);
+  AstNode* ParseArrowFunctionExpression(AstNode* member, AstNode* args, int type);
+  AstNode* ParseArrowFunctionExpression(int type);
+  AstNode* ParseArrowFunctionBody(Function* fn);
+  AstNode* ParseArrayComprehensions();
+
+  const char* filename_;
+  std::string indent_;
+  class StateStack;
+  int depth_;
+  memory::Pool* pool_;
+  AstBuilder* builder_;
+  BitVector8 bits_;
+  ParserConnector* connector_;
+  ErrorReporter* reporter_;
+  ScopedPtr<StateStack> state_stack_;
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/scanner/encoding/encoding.cc b/src/mocha/roaster/nexc/scanner/encoding/encoding.cc
new file mode 100755
index 0000000..587e157
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/encoding/encoding.cc
@@ -0,0 +1,45 @@
+#include <string.h>
+#include <iostream>
+#include <mocha/roaster/nexc/scanner/encoding/encoding.h>
+namespace mocha {
+SharedPtr<DetectResult> ICUWrapper::GetEncode(const char* source) {
+  UErrorCode error = U_ZERO_ERROR;
+  UCharsetDetector* detector = ucsdet_open(&error);
+  ucsdet_setText(detector, source, strlen(source), &error);
+  const UCharsetMatch* match = ucsdet_detect(detector, &error);
+  SharedPtr<DetectResult> result(new DetectResult);
+  if (U_FAILURE(error)) {
+    result->charset = 0;
+    result->lang = 0;
+    result->error = true;
+  } else {
+    result->charset = ucsdet_getName(match, &error);
+    result->lang = ucsdet_getLanguage(match, &error);
+    result->error = false;
+  }
+  ucsdet_close(detector);
+  return result;
+}
+
+SharedStr ICUWrapper::Convert(icu::UnicodeString* src) {
+  int length = src->extract(0, src->length(), NULL, "UTF-8");
+  std::vector<char> result(length + 1);
+  src->extract(0, src->length(), &result[0], "UTF-8");
+  std::string tmp(result.begin(), result.end() - 1);
+  char* ret = new char[ tmp.size() + 1 ];
+  strcpy(ret, tmp.c_str());
+  return SharedStr(ret);
+}
+
+SharedStr ICUWrapper::EncodeToUtf8(const char* source, const char* type) {
+  icu::UnicodeString src(source, type);
+  return Convert(&src);
+}
+
+SharedStr ICUWrapper::EncodeToUtf8(const wchar_t* source) {
+  wprintf(L"%s\n", source);
+  icu::UnicodeString src(reinterpret_cast<const UChar*>(source));
+  return Convert(&src);
+}
+
+}
diff --git a/src/mocha/roaster/nexc/scanner/encoding/encoding.h b/src/mocha/roaster/nexc/scanner/encoding/encoding.h
new file mode 100755
index 0000000..92e3e09
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/encoding/encoding.h
@@ -0,0 +1,28 @@
+#ifndef mocha_encoding_h_
+#define mocha_encoding_h_
+#include <vector>
+#include <string>
+#include <unicode/ucsdet.h>
+#include <unicode/ucnv.h>
+#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
+#include <mocha/roaster/misc/class_traits/static.h>
+namespace mocha {
+
+struct DetectResult {
+  const char* charset;
+  const char* lang;
+  bool error;
+};
+
+class ICUWrapper : private Static{
+ public :
+  static SharedPtr<DetectResult> GetEncode(const char* source);
+  static SharedStr EncodeToUtf8(const char* source, const char* type);
+  static SharedStr EncodeToUtf8(const wchar_t* source);
+ private :
+  static SharedStr Convert(icu::UnicodeString *str);
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/scanner/scanner.cc b/src/mocha/roaster/nexc/scanner/scanner.cc
new file mode 100755
index 0000000..8a6d139
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/scanner.cc
@@ -0,0 +1,964 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <string.h>
+#include <string>
+#include <sstream>
+#include <mocha/roaster/memory/pool.h>
+#include <mocha/roaster/misc/bits.h>
+#include <mocha/roaster/misc/int_types.h>
+#include <mocha/roaster/utils/error_reporter.h>
+#include <mocha/roaster/nexc/nexc.h>
+#include <mocha/roaster/nexc/scanner/scanner.h>
+#include <mocha/roaster/nexc/scanner/token_stream.h>
+#include <mocha/roaster/nexc/scanner/source_stream.h>
+#include <mocha/roaster/nexc/tokens/js_token.h>
+#include <mocha/roaster/nexc/tokens/token_info.h>
+#include <mocha/roaster/nexc/binding/parser_connector.h>
+#include <mocha/roaster/nexc/events/compilation_event/compilation_event.h>
+namespace mocha {
+
+#define FLAG_LB 0
+#define FLAG_REST 1
+#define FLAG_NUMERIC 2
+#define FLAG_REGEXP 3
+
+void Scanner::ScannerEventListener::operator()(CompilationEvent* e) {
+  const char* source = e->source();
+  const char* path = e->path();
+  memory::Pool* pool = e->pool();
+  SourceStream* stream = SourceStream::New(source, path, e->charset(), pool);
+  ErrorReporter* reporter = e->error_reporter();
+  const char* filename = e->filename();
+  Scanner* scanner = Scanner::New(stream, reporter, filename);
+  ParserConnector* connector = new(pool) ParserConnector(scanner, reporter);
+  e->set_parser_connector(connector);
+  e->NotifyForKey(Nexc::kParse);
+}
+
+class Scanner::InternalScanner {
+ public :
+  InternalScanner(SourceStream* source, ErrorReporter* reporter, const char* filename) :
+      line_(1),
+      filename_(filename),
+      token_stream_(TokenStream::New(memory::Pool::Local())),
+      source_stream_(source),
+      reporter_(reporter) {
+    flags_.Set(FLAG_REGEXP);
+    flags_.Set(FLAG_NUMERIC);
+  }
+
+  /**
+   * @public
+   * Collect token and push into the token queue.
+   */
+  inline void CollectToken() {
+    while (!IsEof()) {
+      Skip();
+      if (flags_.At(FLAG_LB)) {
+        TokenInfo* info = token_stream_->last();
+        if (info) {
+          info->set_linebreak_after();
+        }
+        flags_.UnSet(FLAG_LB);
+      }
+      uint8_t ch = Advance();
+      if (IsIdentStart(ch, true)) {
+        //identifier
+        CaseIdent(ch);
+      } else if (isdigit(ch)) {
+        //numeric begin with 0...9
+        CaseDigit(ch);
+      } else if (flags_.At(FLAG_NUMERIC) && ch == '.') {
+        //numeric begin with '.'
+        //treat as float.
+        CaseDigitBeginWithDot(ch);
+      } else if (IsSingleOperator(ch)) {
+        //operator that is not continue after operator. Like { } [ ]
+        token_stream_->Append("", ch, line_);
+      } else if (IsNotSingleOperator(ch)) {
+        //operator like + - =
+        CaseNotSingleOperator(ch);
+      } else if (ch != 0 && ch != Token::END_OF_INPUT){
+        std::stringstream st;
+        st << "Illegal token '"
+           << ch << "' in " << filename_ << " at : " << line_;
+        reporter_->ReportSyntaxError(st.str().c_str());
+      }
+      SetRegExpAfter();
+      SetNumericAfter();
+    }
+    TokenInfo* last = token_stream_->last();
+    if (last) {
+      last->set_linebreak_after();
+    }
+    //Sentinel.
+    token_stream_->Append("", Token::END_TOKEN, 0);
+  }
+
+  inline TokenStream* GetStream() {
+    return token_stream_;
+  }
+
+ private :
+
+  /**
+   * @private
+   * Check char is unicode's byte order mark or not.
+   */
+  bool IsByteOrderMark(char data) {
+    return (data == 0xFEFF || data == 0xFFFE);
+  }
+
+  /**
+   * @private
+   * Check source end or not.
+   */
+  inline bool IsEof() {
+    return source_stream_->Seek(1) == Token::END_OF_INPUT;
+  }
+
+
+  inline uint8_t Seek(int len) {
+    return source_stream_->Seek(len);
+  }
+
+  /**
+   * @private
+   * Get next char form source.
+   */
+  inline uint8_t Advance(int len = 1) {
+    if (IsEof()) {
+      return 0;
+    } else {
+      return source_stream_->Advance(len);
+    }
+  }
+
+  /**
+   * @private
+   * Decrement source index.
+   */
+  inline void Undo(int len = 1) {
+    source_stream_->Undo(len);
+  }
+
+  /**
+   * @private
+   * Skip all comment, unicode's byte order mark, whitespace and linebreak.
+   */
+  void Skip() {
+    char ch = Seek(1);
+    char next = Seek(2);
+    bool isbreak = IsBreak(ch);
+    //Check that token is whitespace or line break.
+    if (IsWhiteSpace(ch) || IsByteOrderMark(ch) || isbreak) {
+      Advance();
+      //Add line number.
+      if (isbreak) {
+        flags_.Set(FLAG_LB);
+        line_++;
+      }
+      isbreak = false;
+      Skip ();
+    } else if (ch == '/' && next == '*') {
+      Advance(2);
+      //Process multiline comment.
+      SkipMultiLineComment ();
+      //Check is whitespace or singleline comment continue.
+      Skip();
+    } else if (ch == '/' && next == '/') {
+      Advance(2);
+      //Process single line comment.
+      SkipComment();
+      //Check is whitespace or multiline comment continue.
+      Skip();
+    }
+  }
+
+  /**
+   * @private
+   * @param {char}
+   * @returns {bool}
+   * Check is whitespace or not.
+   */
+  inline bool IsWhiteSpace(char ch) {
+    if (ch == ' ' ||
+        ch == '\t'||
+        ch == '\r') {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * @private
+   * @param {char}
+   * @return {bool}
+   * Check is line break or not.
+   */
+  inline bool IsBreak(char ch) {
+    if (ch == '\n') {
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * @private
+   * cosume token while multiline comment block is continue.
+   */
+  inline void SkipMultiLineComment() {
+    int ch;
+    while (!IsEof()) {
+      ch = Advance();
+      char next = Advance();
+      //End of multiline comment.
+      if (ch == '*' && next == '/') {
+        return;
+      } else {
+        if (ch == '\n') {
+          line_++;
+          flags_.Set(FLAG_LB);
+        }
+        Undo();
+      }
+    }
+  }
+
+  /**
+   * @private
+   * Consume token while single line comment is continue.
+   */
+  inline void SkipComment() {
+    int ch;
+    while (!IsEof()) {
+      ch = Advance();
+      if (ch == '\n') {
+        line_++;
+        flags_.Set(FLAG_LB);
+        return;
+      }
+    }
+  }
+
+  /**
+   * @private
+   * @param {char}
+   * @returns {bool}
+   * Check is identifier token start or not.
+   */
+  inline bool IsIdentStart(char ch, bool is_begin) {
+    char next = Seek(1);
+    if (isalpha(ch) ||
+        ch == '_' ||
+        ch == '$' ||
+        //treat special token.
+        ch == '@') {
+      return true;
+    } else if (is_begin && ch == '\\' && next == 'u') {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+
+  /**
+   * @private
+   * @param {char}
+   * Collect identifier.
+   */
+  inline void CaseIdent(char ch) {
+    token_str_ = ch;
+    char next = Advance();
+    while (IsIdentStart(next, false) || isdigit(next)) {
+      token_str_ += next;
+      next = Advance();
+    }
+    Undo();
+    PushBack(token_str_.c_str());
+  }
+
+
+  /**
+   * @private
+   * @param {char}
+   * In case of numeric literal.
+   */
+  inline void CaseDigit(char ch) {
+    token_str_ = ch;
+    char next = tolower(Advance());
+
+    if (next == '.') {
+      CaseDigitFloat(next);
+    } else if (next == 'x' && ch == '0') {
+      CaseDigitHex(next);
+    } else if (isdigit (next) || next == 'e') {
+      CaseDigitNumber(next);
+    } else {
+      Undo();
+    }
+    PushBack(token_str_.c_str(), Token::JS_NUMERIC_LITERAL);
+  }
+
+
+  /**
+   * @private
+   * @param {char}
+   * Case float.
+   */
+  inline void CaseDigitFloat(char ch) {
+    token_str_ += ch;
+    bool hasIndex = false;
+    char next;
+    char last;
+
+    while ((next = Advance())) {
+      next = tolower (next);
+
+      if (isdigit (next)) {
+        token_str_ += next;
+        last = next;
+        hasIndex = false;
+      } else if ((next == 'e' && !hasIndex) &&
+                 last != 'e') {
+        token_str_ += next;
+        last = next;
+        hasIndex = true;
+      } else if ((next == '+' || next == '-') && last == 'e') {
+        token_str_ += next;
+        last = next;
+        hasIndex = false;
+      } else {
+        Undo();
+        break;
+      }
+    }
+  }
+
+
+  inline bool IsHex(char ch) {
+    if (isdigit(ch) ||
+        ch == 'a' ||
+        ch == 'b' ||
+        ch == 'c' ||
+        ch == 'd' ||
+        ch == 'e' ||
+        ch == 'f')            {
+      return true;
+    }
+    return false;
+  }
+
+
+  inline void CaseDigitHex(char ch) {
+
+    char next;
+    token_str_ += ch;
+    Advance();
+    while ((next = Advance())) {
+      next = tolower (next);
+
+      if (IsHex(next)) {
+        token_str_ += next;
+      } else if (isdigit(next)) {
+        token_str_ += next;
+      } else {
+        Undo();
+        break;
+      }
+    }
+  }
+
+
+  inline void CaseDigitNumber(char ch) {
+    token_str_ += ch;
+    bool hasIndex = (ch == 'e')? true : false;
+    char last = ch;
+    char next;
+
+    while ((next = Advance())) {
+      next = tolower (next);
+
+      if (isdigit (next)) {
+        token_str_ += next;
+        last = next;
+      } else if (next == '.') {
+        token_str_ += next;
+        return CaseDigitFloat(Advance());
+      } else if (next == 'e' &&
+                 !hasIndex &&
+                 last != 'e') {
+        token_str_ += next;
+        last = next;
+      } else if ((next == '+' || next == '-') &&
+                 last == 'e') {
+        token_str_ += next;
+        last = next;
+      } else {
+        Undo();
+        break;
+      }
+    }
+  }
+
+
+  inline void CaseDigitBeginWithDot(char ch) {
+    token_str_ = ch;
+    bool hasIndex = false;
+    char last;
+    char next;
+    int index = 0;
+
+    while ((next = Advance())) {
+      if (isdigit (next)) {
+        token_str_ += next;
+        last = next;
+      } else if (next == '.' && index == 0) {
+        if (Advance() == '.') {
+          token_str_ += "..";
+          PushBack(token_str_.c_str(), Token::JS_PARAMETER_REST);
+          return;
+        } else {
+          Undo(1);
+        }
+      } else if (next == 'e' &&
+                 !hasIndex &&
+                 last != 'e') {
+        token_str_ += next;
+        last = next;
+      } else if ((next == '+' || next == '-') &&
+                 last == 'e') {
+        token_str_ += next;
+        last = next;
+      } else {
+        Undo();
+        break;
+      }
+      index++;
+    }
+    PushBack(token_str_.c_str(), Token::JS_NUMERIC_LITERAL);
+  }
+
+
+  /**
+   * @private
+   * @param {char}
+   * @returns {bool}
+   * Distinct parameter char is operators that is continue after operator.
+   */
+  inline bool IsSingleOperator(char ch) {
+    if (ch == '(' || ch == ')' ||
+        ch == '{' || ch == '}' ||
+        ch == '[' || ch == ']' ||
+        ch == '~' || ch == ',' ||
+        ch == '.' || ch == ':' ||
+        ch == ';' || ch == '?' ||
+        ch == '#') {
+      char next = Seek(1);
+      char next_after_ = Seek(2);
+      if (ch == '.' && next == ch && next_after_ == ch) {
+        flags_.Set(FLAG_REST);
+        return false;
+      }
+      return true;
+    }
+    return false;
+  }
+
+
+  /**
+   * @private
+   * @param {char}
+   * @returns {bool}
+   * Check operator like + = -
+   */
+  inline bool IsNotSingleOperator(char ch) {
+    if (!IsSingleOperator(ch) &&
+        ((ch > 32 && ch < 48) ||
+         (ch > 57 && ch < 65) ||
+         (ch > 90 && ch < 97) ||
+         (ch > 122 && ch < 127) ||
+         flags_.At(FLAG_REST)) &&
+        ch != 35 && ch != 127 && ch != 96 &&
+        !isalpha (ch)) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+
+  inline void CaseNotSingleOperator(char ch) {
+    token_str_ = ch;
+
+    switch (ch) {
+      case '.' :
+        {
+          if (flags_.At(FLAG_REST)) {
+            token_str_ += Advance();
+            token_str_ += Advance();
+            PushBack(token_str_.c_str(), Token::JS_PARAMETER_REST);
+            flags_.UnSet(FLAG_REST);
+          }
+        }
+        break;
+
+      case '"' :
+      case '\'' :
+        {
+          CaseStringLiteral(ch);
+        }
+        break;
+
+      case '=' :
+      case '!' :
+        {
+          CaseEqualitiesORFunGlyph();
+        }
+        break;
+
+      case '-' :
+      case '+' :
+        {
+          CaseAddAndSubORFunGlyph(ch);
+        }
+        break;
+
+      case '/' :
+      case '*' :
+      case '%' :
+        {
+          if (ch == '/' &&
+              flags_.At(FLAG_REGEXP)) {
+            CaseRegExpLiteral();
+          } else {
+            CaseUnary();
+          }
+        }
+        break;
+
+      case '|' :
+      case '&' :
+      case '^' :
+      case '<' :
+        {
+          CaseLogical(ch);
+        }
+        break;
+
+      case '>' :
+        {
+          CaseShiftRight();
+        }
+        break;
+    }
+  }
+
+
+  inline void CaseStringLiteral(char ch) {
+    char next = Seek(1);
+    char next_after_ = Seek(2);
+    bool escaped = false;
+
+    if (next == ch && next_after_ == ch) {
+      Advance(2);
+      while ((next = Advance())) {
+        if (next == '\n') {
+          line_++;
+        } else if (next != '\r') {
+          token_str_ += next;
+        }
+        char next_after = Advance();
+        char next_after_after = Advance();
+        if (next == ch && next_after == ch && next_after_after == ch) {
+          break;
+        } else {
+          Undo(2);
+        }
+      }
+    } else {
+      if (next == ch) {
+        token_str_ += ch;
+        Advance();
+      } else {
+        while ((next = Advance())) {
+          if (!escaped && next == '\\') {
+            escaped = true;
+          } else {
+            escaped = false;
+          }
+
+          token_str_ += next;
+          next = Seek(1);
+
+          if (!escaped && next == '\n') {
+            break;
+          }
+
+          if (!escaped && next == ch) {
+            token_str_ += next;
+            Advance();
+            break;
+          }
+        }
+      }
+    }
+    PushBack(token_str_.c_str(), Token::JS_STRING_LITERAL);
+  }
+
+
+  inline void CaseEqualitiesORFunGlyph() {
+    char next = Advance();
+    if (next == '=') {
+      token_str_ += next;
+      next = Advance();
+      if (next == '=') {
+        token_str_ += next;
+      } else {
+        Undo();
+      }
+    } else if (next == '>') {
+      token_str_ += next;
+    } else {
+      Undo();
+    }
+
+    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str (), true));
+  }
+
+
+
+  inline void CaseAddAndSubORFunGlyph(char ch) {
+    char next = Advance();
+    if (next == ch || next == '=') {
+      token_str_ += next;
+    } else if (ch == '-' && next == '>') {
+      token_str_ += next;
+    } else {
+      Undo();
+    }
+    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str (), true));
+  }
+
+
+  inline void CaseRegExpLiteral() {
+    bool isescaped = false;
+    bool ischar_class = false;
+    char next;
+    while ((next = Advance())) {
+      if (!isescaped &&
+          next == '\\') {
+        isescaped = true;
+        token_str_ += next;
+      } else if (!isescaped &&
+                 next == '[') {
+        ischar_class = true;
+        isescaped = false;
+        token_str_ += next;
+      } else if (!isescaped &&
+                 ischar_class &&
+                 next == ']') {
+        ischar_class = false;
+        token_str_ += next;
+      } else if (!isescaped &&
+                 !ischar_class &&
+                 next == '/') {
+        CaseRegExpFlag(next);
+        break;
+      } else {
+        isescaped = false;
+        token_str_ += next;
+      }
+    }
+  }
+
+  inline void CaseRegExpFlag(char ch) {
+    token_str_ += ch;
+    char flag = Seek(1);
+    bool has_error = false;
+    std::string flag_list;
+    BitVector8 flags;
+    while (isalpha(flag)) {
+      if (flag == 'i' ||
+          flag == 'g' ||
+          flag == 'm') {
+        if (!CheckRegExpFlags(&flags, flag, &flag_list)) {
+          has_error = true;
+        } else {
+        }
+      } else {
+        has_error = true;
+        flag_list += flag;
+      }
+      Advance();
+      flag = Seek(1);
+    }
+    if (has_error) {
+      std::stringstream st;
+      st << "Illegal regular expression flags '"
+         << flag_list << "' in " << filename_ << " at : " << line_;
+      reporter_->ReportSyntaxError(st.str().c_str());
+    } else {
+      PushBack(token_str_.c_str(), Token::JS_REGEXP_LITERAL);
+    }
+  }
+
+
+  inline bool CheckRegExpFlags(BitVector8 *flags, char flag, std::string *flag_list) {
+    if (flag == 'i') {
+      return SetRegExpFlags(flags, flag, flag_list, 0);
+    } else if (flag == 'g') {
+      return SetRegExpFlags(flags, flag, flag_list, 1);
+    } else if (flag == 'm') {
+      return SetRegExpFlags(flags, flag, flag_list, 2);
+    }
+    return false;
+  }
+
+
+  inline bool SetRegExpFlags(BitVector8 *flags, char flag, std::string *flag_list, int pos) {
+    if (!flags->At(pos)) {
+      flags->Set(pos);
+      token_str_ += flag;
+      (*flag_list) += flag;
+      return true;
+    } else {
+      (*flag_list) += flag;
+      return false;
+    }
+  }
+
+
+  inline void CaseUnary() {
+    char next = Advance();
+    if (next == '=') {
+      token_str_ += next;
+    } else {
+      Undo();
+    }
+    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str (), true));
+  }
+
+
+  inline void CaseLogical(char ch) {
+    char next = Advance();
+
+    if (next == ch) {
+      token_str_ += next;
+      if (ch == '<' && next == '<') {
+        next = Seek(1);
+        if (next == '=') {
+          token_str_ += next;
+          Advance();
+        }
+      }
+    } else if ((ch == '|' ||
+                ch == '^' ||
+                ch == '<' ||
+                ch == '&') &&
+               next == '=') {
+      token_str_ += next;
+    } else {
+      Undo();
+    }
+    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str(), true));
+  }
+
+
+  inline void CaseShiftRight() {
+    char next = Advance();
+    if (next == '>') {
+      token_str_ += next;
+      next = Advance();
+      if (next == '>') {
+        token_str_ += next;
+        next = Seek(1);
+        if (next == '=') {
+          token_str_ += next;
+          Advance();
+        }
+      } else if (next == '=') {
+        token_str_ += next;
+      } else {
+        Undo();
+      }
+    } else if (next == '=') {
+      token_str_ += next;
+    } else {
+      Undo();
+    }
+    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str(), true));
+  }
+
+
+  inline void SetNumericAfter() {
+    int type = (token_stream_->size() > 0)? token_stream_->last()->type() : 0;
+    if (JsToken::IsBinaryOperatorNoIn(type) ||
+        type == '[' ||
+        type == '{' ||
+        type == '(' ||
+        type == '*' ||
+        type == '/' ||
+        type == '+' ||
+        type == '-' ||
+        type == '=' ||
+        type == '^' ||
+        type == '&' ||
+        type == '|' ||
+        type == ':' ||
+        type == ',' ||
+        type == ';' ||
+        type == '~' ||
+        type == '>' ||
+        type == '<' ||
+        type == '!' ||
+        type == Token::JS_RETURN) {
+      flags_.Set(FLAG_NUMERIC);
+    } else {
+      flags_.UnSet(FLAG_NUMERIC);
+    }
+  }
+
+
+  inline void SetRegExpAfter() {
+    int type = (token_stream_->size() > 0)? token_stream_->last()->type() : 0;
+    if (JsToken::IsBinaryOperator(type) ||
+        type == '}' ||
+        type == '|' ||
+        type == '{' ||
+        type == '^' ||
+        type == '[' ||
+        type == '?' ||
+        type == '=' ||
+        type == ';' ||
+        type == ':' ||
+        type == ',' ||
+        type == '(' ||
+        type == '&' ||
+        type == '!' ||
+        type == '+' ||
+        type == '-' ||
+        type == '/' ||
+        type == '%' ||
+        type == '*' ||
+        type == '~' ||
+        type == '>' ||
+        type == '<' ||
+        type == Token::JS_RETURN) {
+      flags_.Set(FLAG_REGEXP);
+    } else {
+      flags_.UnSet(FLAG_REGEXP);
+    }
+  }
+
+
+  /**
+   * @private
+   * @param {const char*}
+   * Get type of token and call DoPushBack_.
+   */
+  inline void PushBack(const char* ctoken, int opt_type = 0) {
+    int type = (opt_type == 0)? JsToken::GetType(ctoken) : opt_type;
+    if (type == Token::JS_EACH) {
+      if (token_stream_->size() > 0 && token_stream_->last()->type() != Token::JS_FOR) {
+        type = Token::JS_IDENTIFIER;
+      }
+    }
+    DoPushBack(ctoken, type);
+  }
+
+  /**
+   * @private
+   * @param {char}
+   * Call DoPushBack_ with set type to arguments.
+   */
+  inline void PushBack(int ch) {
+    if (ch == '(' && token_stream_->size() >= 2) {
+      TokenInfo* info = token_stream_->Seek(2);
+      if (info != Scanner::kEmpty && info->type() == Token::JS_IDENTIFIER) {
+        if (info && strcmp(info->token(), "get") == 0) {
+          info->set_type(Token::JS_GET);
+        } else if (info && strcmp(info->token(), "set") == 0) {
+          info->set_type(Token::JS_SET);
+        }
+      }
+    }
+    DoPushBack("", ch);
+  }
+
+  /**
+   * @private
+   * @param {const char*}
+   * @param {int}
+   * Push back a pointer of TokenInfo to token_stream_.
+   */
+  inline void DoPushBack(const char* ctoken, int type) {
+    TokenInfo* info = token_stream_->last();
+    token_stream_->Append(ctoken, type, line_);
+    if (info && info->linebreak_after()) {
+      token_stream_->last()->set_linebreak_befor();
+    }
+  }
+
+  int64_t line_;
+  const char* filename_;
+  BitVector8 flags_;
+  TokenStream* token_stream_;
+  SourceStream* source_stream_;
+  std::string token_str_;
+  ErrorReporter *reporter_;
+};
+
+Scanner* Scanner::New(SourceStream* stream, ErrorReporter* reporter, const char* filename) {
+  Scanner* scanner = new(memory::Pool::Local()) Scanner(stream, reporter, filename);
+  scanner->CreateTokenStream();
+  scanner->token_stream_ = scanner->scanner_->GetStream();
+  return scanner;
+}
+
+Scanner::Scanner(SourceStream* source, ErrorReporter* reporter, const char* filename)
+    : scanner_(new InternalScanner(source, reporter, filename)),
+      reporter_(reporter){}
+Scanner::~Scanner(){}
+
+TokenInfo* Scanner::Advance(int index) {
+  return token_stream_->Advance(index);
+}
+
+TokenInfo* Scanner::Undo(int index) {
+  return token_stream_->Undo(index);
+}
+
+TokenInfo* Scanner::Seek(int index) {
+  return token_stream_->Seek(index);
+}
+
+void Scanner::CreateTokenStream() {
+  scanner_->CollectToken();
+}
+
+TokenInfo* Scanner::kEmpty = 0;
+
+}
diff --git a/src/mocha/roaster/nexc/scanner/scanner.h b/src/mocha/roaster/nexc/scanner/scanner.h
new file mode 100755
index 0000000..2741a9c
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/scanner.h
@@ -0,0 +1,57 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_roaster_nexc_scanner_scanner_h_
+#define mocha_roaster_nexc_scanner_scanner_h_
+#include <mocha/roaster/memory/pool.h>
+#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
+namespace mocha {
+class ErrorReporter;
+class SourceStream;
+class TokenInfo;
+class TokenStream;
+class JsToken;
+class CompilationEvent;
+class Scanner : public memory::Allocated {
+ public :
+  static Scanner* New(SourceStream* source, ErrorReporter *reporter, const char* filename);
+  class ScannerEventListener {
+   public :
+    void operator()(CompilationEvent* event);
+  };
+  ~Scanner();
+  TokenInfo* Advance(int index = 1);
+  TokenInfo* Undo(int index = 1);
+  TokenInfo* Seek(int index);
+  static TokenInfo* kEmpty;
+ private :
+  Scanner(SourceStream* source, ErrorReporter *reporter, const char* filename);
+  void CreateTokenStream();
+
+  class InternalScanner;
+  ScopedPtr<InternalScanner> scanner_;
+  TokenStream* token_stream_;
+  ErrorReporter* reporter_;
+};
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/scanner/source_stream.cc b/src/mocha/roaster/nexc/scanner/source_stream.cc
new file mode 100755
index 0000000..ef231e2
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/source_stream.cc
@@ -0,0 +1,130 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <mocha/roaster/smart_pointer/common/ptr_deleter.h>
+#include <mocha/roaster/nexc/scanner/source_stream.h>
+#include <mocha/roaster/nexc/scanner/encoding/encoding.h>
+namespace mocha {
+
+SharedStr Encode(const char* source, const char* charset) {
+  if (charset == NULL) {
+    SharedPtr<DetectResult> detected = ICUWrapper::GetEncode(source);
+    SharedStr data = ICUWrapper::EncodeToUtf8(source, detected->charset);
+    return data;
+  } else {
+    SharedStr data = ICUWrapper::EncodeToUtf8(source, charset);
+    return data;
+  }
+}
+
+SourceStream* SourceStream::New(const char* source, const char* path, const char* charset, memory::Pool* pool) {
+  SharedStr str_handle = Encode(source, charset);
+  SourceStream* stream = new(pool) SourceStream();
+  stream->CreateStream(str_handle.Get());
+  return stream;
+}
+
+
+SourceStream::SourceStream()
+  : cursor_(-1),
+    line_(1),
+    size_(0){};
+
+
+SourceStream::~SourceStream() {
+  free(stream_);
+}
+
+
+void SourceStream::CreateStream(const char* utf8_str) {
+  int size = strlen(utf8_str);
+  int count = 0;
+  stream_ = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * size + sizeof(uint8_t)));
+  for (int i = 0; i < size; i++) {
+    if (utf8_str[ i ] == '\n') line_++;
+    if (utf8_str[ i ] != '\r') {
+      stream_[ count ] = utf8_str[ i ];
+      count++;
+    }
+  }
+  size_ = count;
+  stream_[ count ] = '\0';
+}
+
+
+uint8_t SourceStream::At(int index) const {
+  return (index > 0 && index < size_)? stream_[ index ] : (index < 0)? Token::ILLEGAL : Token::END_OF_INPUT;
+}
+
+
+uint8_t SourceStream::Advance(int index) {
+  if (index < 0) return Token::ILLEGAL;
+  if (cursor_ == size_) {
+    cursor_++;
+    return Token::END_OF_INPUT;
+  } else {
+    cursor_ += index;
+    char ret = stream_[ cursor_ ];
+    return ret;
+  }
+}
+
+
+uint8_t SourceStream::Undo(int index) {
+  if (index < 0) return Token::ILLEGAL;
+  int i = 0;
+  for (; i < index; i++) {}
+  cursor_ -= i;
+  return (cursor_ > 0 && size_ > 0)? stream_[ cursor_ ] : Token::ILLEGAL;
+}
+
+
+uint8_t SourceStream::Seek(int index) const {
+  int i = 0,pos = 0;
+  if (index > 0) {
+    for (; i < index; i++) {}
+  } else {
+    for (; i > index; i--) {}
+  }
+  pos = cursor_ + i;
+  if (pos < size_) {
+    return stream_[ pos ];
+  }
+  return Token::END_OF_INPUT;
+}
+
+
+uint8_t SourceStream::Last() const {
+  return stream_[ size_ - 1 ];
+}
+
+
+uint8_t SourceStream::First() const {
+  return stream_[ 0 ];
+}
+
+
+int SourceStream::Size() const { return size_; }
+
+}
diff --git a/src/mocha/roaster/nexc/scanner/source_stream.h b/src/mocha/roaster/nexc/scanner/source_stream.h
new file mode 100755
index 0000000..01d1c0f
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/source_stream.h
@@ -0,0 +1,52 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_roaster_nexc_scanner_source_stream_h_
+#define mocha_roaster_nexc_scanner_source_stream_h_
+#include <mocha/roaster/misc/int_types.h>
+#include <mocha/roaster/nexc/tokens/js_token.h>
+#include <mocha/roaster/memory/pool.h>
+#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
+namespace mocha {
+class CompilationInfo;
+class SourceStream : public memory::Allocated {
+ public :
+  static SourceStream* New(const char* source, const char* path, const char* charset, memory::Pool* pool);
+  ~SourceStream();
+  int Size() const;
+  uint8_t At(int index) const;
+  uint8_t Advance(int index = 1);
+  uint8_t Undo(int index = 0);
+  uint8_t Seek(int index) const;
+  uint8_t Last() const;
+  uint8_t First() const;
+ private :
+  SourceStream();
+  void CreateStream(const char* utf8_str);
+  int cursor_;
+  int line_;
+  int size_;
+  uint8_t *stream_;
+};
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/scanner/token_stream.cc b/src/mocha/roaster/nexc/scanner/token_stream.cc
new file mode 100755
index 0000000..cad3994
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/token_stream.cc
@@ -0,0 +1,163 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#include <mocha/roaster/nexc/scanner/token_stream.h>
+#include <mocha/roaster/nexc/tokens/token_info.h>
+#include <mocha/roaster/misc/int_types.h>
+
+namespace mocha {
+
+static const int max_element = 6;
+
+class TokenContainer : public memory::Allocated {
+ public :
+  TokenContainer(const char* token, int type, int64_t line, memory::Pool* pool)
+      :  size(0),
+         next(0),
+         prev(0) {
+    Push(token, type, line, pool);
+  }
+
+  void Push(const char* token, int type, int64_t line, memory::Pool* pool) {
+    TokenInfo* info = new(pool) TokenInfo(token, type, line);
+    array[ size ] = reinterpret_cast<uintptr_t>(info);
+    size++;
+  }
+
+  TokenInfo* Get(int index) {
+    return reinterpret_cast<TokenInfo*>(array[index]);
+  }
+
+  int size;
+  TokenContainer* next;
+  TokenContainer* prev;
+
+ private :
+  uintptr_t array[max_element];
+};
+
+
+TokenStream* TokenStream::New(memory::Pool* pool) {
+  return new(pool) TokenStream();
+}
+
+TokenStream::TokenStream()
+    : cursor_(0),
+      size_(0),
+      current_(0),
+      first_(0),
+      last_(0),
+      pool_(memory::Pool::Local()){};
+
+TokenStream::~TokenStream() {};
+
+TokenInfo* TokenStream::Advance(int index) {
+  if (index < 1) return 0;
+  int count = cursor_;
+  TokenContainer* tmp = current_;
+  TokenInfo* ret;
+  for (int i = 0; i < index; i++) {
+    if (count == current_->size) {
+      current_ = current_->next;
+      if (current_ == 0) {
+        current_ = tmp;
+        return kEmpty;
+      } else {
+        count = 0;
+      }
+    }
+    ret = current_->Get(count);
+    count++;
+  }
+  cursor_ = count;
+  return ret;
+}
+
+
+
+void TokenStream::Append(const char* token, int type, int64_t line) {
+  if (first_ == 0) {
+    first_ = new(pool()) TokenContainer(token, type, line, pool());
+    current_ = last_ = first_;
+  } else {
+    if (first_->size < max_element) {
+      last_->Push(token, type, line, pool());
+    } else {
+      TokenContainer* tmp = new(pool()) TokenContainer(token, type, line, pool());
+      last_->next = tmp;
+      tmp->prev = last_;
+      last_ = tmp;
+    }
+  }
+  size_++;
+}
+
+
+TokenInfo* TokenStream::Undo(int index) {
+  if (index < 0) return kEmpty;
+  int count = cursor_;
+  TokenContainer* tmp = current_;
+  TokenInfo* ret;
+  for (int i = 0; i < index; i++) {
+    if (count < 0) {
+      current_ = current_->prev;
+      if (current_ == 0) {
+        current_ = tmp;
+        return kEmpty;
+      } else {
+        count = current_->size;
+      }
+    }
+    count--;
+    ret = current_->Get(count);
+  }
+  cursor_ = count;
+  return ret;
+}
+
+
+TokenInfo* TokenStream::Seek(int index) {
+  int cursor = cursor_;
+  TokenContainer* tmp = current_;
+  TokenInfo* info = (index > 0)? Advance(index) : Undo((-1 * index));
+  current_ = tmp;
+  cursor_ = cursor;
+  return info;
+}
+
+TokenInfo* TokenStream::first() const {
+  if (first_) {
+    return first_->Get(0);
+  }
+  return 0;
+}
+
+TokenInfo* TokenStream::last() const {
+  if (last_) {
+    return last_->Get(last_->size - 1);
+  }
+  return 0;
+}
+
+TokenInfo* TokenStream::kEmpty = 0;
+
+}
diff --git a/src/mocha/roaster/nexc/scanner/token_stream.h b/src/mocha/roaster/nexc/scanner/token_stream.h
new file mode 100755
index 0000000..0a466b2
--- /dev/null
+++ b/src/mocha/roaster/nexc/scanner/token_stream.h
@@ -0,0 +1,55 @@
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_scanner_token_stream_h_
+#define mocha_scanner_token_stream_h_
+#include <mocha/roaster/misc/int_types.h>
+#include <mocha/roaster/memory/pool.h>
+namespace mocha {
+class TokenContainer;
+class TokenInfo;
+class TokenStream : public memory::Allocated {
+ public :
+  ~TokenStream();
+  static TokenStream* New(memory::Pool* pool);
+  TokenInfo* Advance(int index = 1);
+  TokenInfo* Seek(int index);
+  TokenInfo* Undo(int index = 0);
+  void Append(const char* token, int type, int64_t line);
+  int size() const { return size_; }
+  TokenInfo* last() const;
+  TokenInfo* first() const;
+  static TokenInfo* kEmpty;
+ private :
+  TokenStream();
+  memory::Pool* pool() { return pool_; }
+  int cursor_;
+  int size_;
+  TokenContainer* current_;
+  TokenContainer* first_;
+  TokenContainer* last_;
+  memory::Pool* pool_;
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/tokens/js_token.cc b/src/mocha/roaster/nexc/tokens/js_token.cc
new file mode 100755
index 0000000..3a30374
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/js_token.cc
@@ -0,0 +1,566 @@
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <string>
+#include <mocha/roaster/nexc/tokens/js_token.h>
+#include <mocha/roaster/nexc/tokens/token_info.h>
+
+namespace mocha {
+
+
+#define NOT_USE -1
+#define ASCII_MAX_RANGE 127
+
+char reserved_words[][ 20 ] = {
+  "abstract",
+  "boolean" ,
+  "break" ,
+  "byte" ,
+  "case" ,
+  "catch" ,
+  "char" ,
+  "class" ,
+  "const" ,
+  "continue" ,
+  "debugger" ,
+  "default" ,
+  "delete" ,
+  "do" ,
+  "double" ,
+  "else" ,
+  "enum" ,
+  "export" ,
+  "extends" ,
+  "false" ,
+  "final" ,
+  "finally" ,
+  "float" ,
+  "for" ,
+  "function" ,
+  "goto" ,
+  "if" ,
+  "implements" ,
+  "import" ,
+  "in" ,
+  "instanceof" ,
+  "int" ,
+  "interface" ,
+  "let",
+  "long" ,
+  "module",
+  "NaN",
+  "native",
+  "new" ,
+  "null" ,
+  "package" ,
+  "private" ,
+  "protected",
+  "public" ,
+  "return" ,
+  "short" ,
+  "static" ,
+  "super"  ,
+  "switch" ,
+  "synchronized" ,
+  "this" ,
+  "throw" ,
+  "throws" ,
+  "transient" ,
+  "true" ,
+  "try" ,
+  "typeof" ,
+  "var" ,
+  "void" ,
+  "volatile" ,
+  "while" ,
+  "with",
+  "each",
+  "yield",
+  "@assert",
+  "@version",
+  "@pragma",
+  "++", "--", "==", "<<", ">>", "<=", ">=", "===", "!=" ,
+  "!==", ">>>", "+=", "-=", "/=", "%=", "*=", "&&", "||", "<<=",
+  ">>=", ">>>=", "^=", "&=", "|=", "->", "=>"
+};
+
+
+
+char builtins[][ 30 ] = {
+  "Array",
+  "JSON",
+  "Boolean"
+  "Date",
+  "Error",
+  "EvalError",
+  "Function",
+  "Infinity",
+  "Math",
+  "NaN",
+  "Number",
+  "Object",
+  "RangeError",
+  "ReferenceError",
+  "RegExp",
+  "String",
+  "SyntaxError",
+  "TypeError",
+  "URIError",
+  "arguments",
+  "decodeURI",
+  "decodeURIComponent",
+  "encodeURI",
+  "encodeURIComponent",
+  "escape",
+  "eval",
+  "isFinite",
+  "isNaN",
+  "parseFloat",
+  "parseInt",
+  "undefined",
+  "unescape",
+  "Attr",
+  "CDATASection",
+  "CharacterData",
+  "Comment",
+  "DOMException",
+  "DOMImplementation",
+  "Document",
+  "DocumentFragment"
+  "DocumentType",
+  "Element",
+  "Entity",
+  "EntityReference",
+  "ExceptionCode",
+  "NamedNodeMap",
+  "Node",
+  "NodeList",
+  "Notation"
+  "ProcessingInstruction",
+  "Text",
+  "HTMLAnchorElement",
+  "HTMLAppletElement",
+  "HTMLAreaElement",
+  "HTMLBRElement",
+  "HTMLBaseElement",
+  "HTMLBaseFontElement",
+  "HTMLBodyElement",
+  "HTMLButtonElement",
+  "HTMLCollection",
+  "HTMLDListElement",
+  "HTMLDirectoryElement",
+  "HTMLDivElement",
+  "HTMLDocument",
+  "HTMLElement",
+  "HTMLFieldSetElement",
+  "HTMLFontElement",
+  "HTMLFormElement",
+  "HTMLFrameElement",
+  "HTMLFrameSetElement",
+  "HTMLHRElement",
+  "HTMLHeadElement",
+  "HTMLHeadingElement",
+  "HTMLHtmlElement",
+  "HTMLIFrameElement",
+  "HTMLImageElement",
+  "HTMLInputElement",
+  "HTMLIsIndexElement",
+  "HTMLLIElement",
+  "HTMLLabelElement",
+  "HTMLLegendElement",
+  "HTMLLinkElement",
+  "HTMLMapElement",
+  "HTMLMenuElement",
+  "HTMLMetaElement",
+  "HTMLModElement",
+  "HTMLOListElement",
+  "HTMLObjectElement",
+  "HTMLOptGroupElement",
+  "HTMLOptionElement",
+  "HTMLOptionsCollection",
+  "HTMLParagraphElement",
+  "HTMLParamElement",
+  "HTMLPreElement",
+  "HTMLQuoteElement",
+  "HTMLScriptElement",
+  "HTMLSelectElement",
+  "HTMLStyleElement",
+  "HTMLTableCaptionElement",
+  "HTMLTableCellElement",
+  "HTMLTableColElement",
+  "HTMLTableElement",
+  "HTMLTableRowElement",
+  "HTMLTableSectionElement",
+  "HTMLTextAreaElement",
+  "HTMLTitleElement",
+  "HTMLUListElement",
+  "DOMConfiguration",
+  "DOMError",
+  "DOMException",
+  "DOMImplementationList",
+  "DOMImplementationSource",
+  "DOMLocator",
+  "DOMStringList",
+  "NameList",
+  "TypeInfo",
+  "UserDataHandler"
+  "window",
+  "alert",
+  "confirm",
+  "document",
+  "java",
+  "navigator",
+  "prompt",
+  "screen",
+  "self",
+  "top",
+  "CSSCharsetRule",
+  "CSSFontFace",
+  "CSSFontFaceRule",
+  "CSSImportRule",
+  "CSSMediaRule",
+  "CSSPageRule",
+  "CSSPrimitiveValue",
+  "CSSProperties",
+  "CSSRule",
+  "CSSRuleList",
+  "CSSStyleDeclaration",
+  "CSSStyleRule",
+  "CSSStyleSheet",
+  "CSSValue",
+  "CSSValueList",
+  "Counter",
+  "DOMImplementationCSS",
+  "DocumentCSS",
+  "DocumentStyle",
+  "ElementCSSInlineStyle",
+  "LinkStyle",
+  "MediaList",
+  "RGBColor",
+  "Rect",
+  "StyleSheet",
+  "StyleSheetList",
+  "ViewCSS",
+  "EventListener",
+  "EventTarget",
+  "Event",
+  "DocumentEvent",
+  "UIEvent",
+  "MouseEvent",
+  "MutationEvent",
+  "KeyboardEvent",
+  "DocumentRange",
+  "Range",
+  "RangeException",
+  "XPathResult",
+  "XMLHttpRequest",
+  "importScript",
+  "WeakMap"
+};
+
+static bool binary_operator[] = {
+  false,//NOT_USE:0
+  false,//NOT_USE:1
+  false,//NOT_USE:2
+  false,//NOT_USE:3
+  false,//NOT_USE:4
+  false,//NOT_USE:5
+  false,//NOT_USE:6
+  false,//NOT_USE:7
+  false,//NOT_USE:8
+  false,//NOT_USE:9
+  false,//NOT_USE:10
+  false,//NOT_USE:11
+  false,//NOT_USE:12
+  false,//NOT_USE:13
+  false,//NOT_USE:14
+  false,//NOT_USE:15
+  false,//NOT_USE:16
+  false,//NOT_USE:17
+  false,//NOT_USE:18
+  false,//NOT_USE:19
+  false,//NOT_USE:20
+  false,//NOT_USE:21
+  false,//NOT_USE:22
+  false,//NOT_USE:23
+  false,//NOT_USE:24
+  false,//NOT_USE:25
+  false,//NOT_USE:26
+  false,//NOT_USE:27
+  false,//NOT_USE:28
+  false,//NOT_USE:29
+  false,//NOT_USE:30
+  false,//NOT_USE:31
+  false,//NOT_USE:32
+  false,//'!':33
+  false,//'"':34
+  false,//'#':35
+  false,//'$':36
+  false,//'%':37
+  false,//'&':38
+  false,//'\':/39
+  false,//'(':40
+  false,//')':41
+  false,//'*':42
+  false,//'+':43
+  false,//',':44
+  false,//'-':45
+  false,//'.':46
+  false,//'/':47
+  false,//NOT_USE:48
+  false,//NOT_USE:49
+  false,//NOT_USE:50
+  false,//NOT_USE:51
+  false,//NOT_USE:52
+  false,//NOT_USE:53
+  false,//NOT_USE:54
+  false,//NOT_USE:55
+  false,//NOT_USE:56
+  false,//NOT_USE:57
+  false,//':':58
+  false,//':':59
+  false,//'<':60
+  false,//'=':61
+  false,//'>':62
+  false,//'?':63
+  false,//'@':64
+  false,//NOT_USE:65
+  false,//NOT_USE:66
+  false,//NOT_USE:67
+  false,//NOT_USE:68
+  false,//NOT_USE:69
+  false,//NOT_USE:70
+  false,//NOT_USE:71
+  false,//NOT_USE:72
+  false,//NOT_USE:73
+  false,//NOT_USE:74
+  false,//NOT_USE:75
+  false,//NOT_USE:76
+  false,//NOT_USE:77
+  false,//NOT_USE:78
+  false,//NOT_USE:79
+  false,//NOT_USE:80
+  false,//NOT_USE:81
+  false,//NOT_USE:82
+  false,//NOT_USE:83
+  false,//NOT_USE:84
+  false,//NOT_USE:85
+  false,//NOT_USE:86
+  false,//NOT_USE:87
+  false,//NOT_USE:88
+  false,//NOT_USE:89
+  false,//NOT_USE:90
+  false,//'[':91
+  false,//'\\:92
+  false,//']':93
+  false,//'^':94
+  false,//'_':95
+  false,//'`':96
+  false,//NOT_USE:97
+  false,//NOT_USE:98
+  false,//NOT_USE:99
+  false,//NOT_USE:100
+  false,//NOT_USE:101
+  false,//NOT_USE:102
+  false,//NOT_USE:103
+  false,//NOT_USE:104
+  false,//NOT_USE:105
+  false,//NOT_USE:106
+  false,//NOT_USE:107
+  false,//NOT_USE:108
+  false,//NOT_USE:109
+  false,//NOT_USE:110
+  false,//NOT_USE:111
+  false,//NOT_USE:112
+  false,//NOT_USE:113
+  false,//NOT_USE:114
+  false,//NOT_USE:115
+  false,//NOT_USE:116
+  false,//NOT_USE:117
+  false,//NOT_USE:118
+  false,//NOT_USE:119
+  false,//NOT_USE:120
+  false,//NOT_USE:121
+  false,//NOT_USE:122
+  false,//'{':123
+  false,//'|':124
+  false,//'}':125
+  false,//'~':126
+  false,//NOT_USE:127
+  false,//JS_ABSTRACT
+  false,//JS_BOOLEAN
+  false,//JS_BREAK
+  false,//JS_BYTE
+  false,//JS_CASE
+  false,//JS_CATCH
+  false,//JS_CHAR
+  false,//JS_CLASS
+  false,//JS_CONST
+  false,//JS_CONTINUE
+  false,//JS_DEBUGGER
+  false,//JS_DEFAULT
+  false,//JS_DELETE
+  false,//JS_DO
+  false,//JS_DOUBLE
+  false,//JS_ELSE
+  false,//JS_ENUM
+  false,//JS_EXPORT
+  false,//JS_EXTENDS
+  false,//JS_FALSE
+  false,//JS_FINAL
+  false,//JS_FINALLY
+  false,//JS_FLOAT
+  false,//JS_FOR
+  false,//JS_FUNCTION
+  false,//JS_GOTO
+  false,//JS_IF
+  false,//JS_IMPLEMENTS
+  false,//JS_IMPORT
+  false,//JS_IN
+  false,//JS_INSTANCEOF
+  false,//JS_INT
+  false,//JS_INTERFACE
+  false,//JS_LET
+  false,//JS_LONG
+  false,//JS_MODULE
+  false,//JS_NATIVE
+  false,//JS_NEW
+  false,//JS_K_NULL
+  false,//JS_PACKAGE_RESERVED
+  false,//JS_PRIVATE
+  false,//JS_PROTECTED
+  false,//JS_PUBLIC
+  false,//JS_RETURN
+  false,//JS_SHORT
+  false,//JS_STATIC
+  false,//JS_SUPER
+  false,//JS_SWITCH
+  false,//JS_SYNCHRONIZED
+  false,//JS_THIS
+  false,//JS_THROW
+  false,//JS_THROWS
+  false,//JS_TRANSIENT
+  false,//JS_TRUE
+  false,//JS_TRY
+  false,//JS_TYPEOF
+  false,//JS_VAR
+  false,//JS_VOID
+  false,//JS_VOLATILE
+  false,//JS_WHILE
+  false,//JS_WITH
+  false,//JS_EACH
+  false,//JS_FROM
+  false,//MOCHA_VERSIONOF
+  false,//JS_INCREMENT,
+  false,//JS_DECREMENT,
+  true,//JS_EQUAL,
+  true,//JS_SHIFT_LEFT,
+  true,//JS_SHIFT_RIGHT,
+  true,//JS_LESS_EQUAL,
+  true,//JS_GRATER_EQUAL,
+  true,//JS_EQ,
+  true,//JS_NOT_EQUAL,
+  true,//JS_NOT_EQ,
+  true,//JS_U_SHIFT_RIGHT,
+  true,//JS_ADD_LET,
+  true,//JS_SUB_LET,
+  true,//JS_DIV_LET,
+  true,//JS_MOD_LET,
+  true,//JS_MUL_LET,
+  true,//JS_LOGICAL_AND,
+  true,//JS_LOGICAL_OR,
+  true,//JS_SHIFT_LEFT_LET,
+  true,//JS_SHIFT_RIGHT_LET,
+  true,//JS_U_SHIFT_RIGHT_LET,
+  true,//JS_NOT_LET,
+  true,//JS_AND_LET,
+  true,//JS_OR_LET,
+  false,//JS_FUNCTION_GLYPH,
+  false,//JS_FUNCTION_GLYPH_WITH_CONTEXT
+  false,//TOKEN::JS_IDENTIFIER,
+  false,//TOKEN::JS_NUMERIC_LITERAL,
+  false,//TOKEN::JS_STRING_LITERAL,
+  false,//TOKEN::JS_REGEXP_LITERAL,
+  false,//TOKEN::JS_LINE_BREAK,
+  false,//TOKEN::JS_SET,
+  false,//TOKEN::JS_GET,
+  false,//ILLEGAL
+  false,//END_OF_INPUT
+  false//END_TOKEN
+};
+
+int keywords_length = sizeof (reserved_words) / sizeof (reserved_words[ 0 ]);
+int builtin_length = sizeof(builtins) / sizeof(builtins[ 0 ]);
+
+void JsToken::Initialize() {
+  for (int i = 0; i < keywords_length; i++) {
+    int id = i + (ASCII_MAX_RANGE + 1);
+    reserved_map_.insert(TokenEntry(reserved_words[ i ], id));
+  }
+  for (int i = 0; i < builtin_length; i++) {
+    builtin_map_.insert(TokenEntry(builtins[ i ], 1));
+  }
+}
+
+bool JsToken::IsBinaryOperatorNoIn(int token) {
+  return binary_operator[ token ];
+}
+
+bool JsToken::IsBinaryOperator(int token) {
+  return (token == Token::JS_IN || token == Token::JS_INSTANCEOF)? true : binary_operator[ token ];
+}
+
+int JsToken::GetType (const char* token, bool is_operator) {
+  if (is_operator && strlen(token) == 1) {
+    return token[ 0 ];
+  } else {
+    ReservedTokenTable::iterator finded = reserved_map_.find(token);
+    if (finded != reserved_map_.end()) {
+      return finded->second;
+    }
+    return (is_operator)? 0 : Token::JS_IDENTIFIER;
+  }
+}
+
+bool JsToken::IsBuiltin(const char* token) {
+  BuiltinTokenTable::iterator find = builtin_map_.find(token);
+  if (find != builtin_map_.end()) {
+    return true;
+  }
+  return false;
+}
+
+bool JsToken::IsReserved(const char* token) {
+  ReservedTokenTable::iterator find = reserved_map_.find(token);
+  if (find != reserved_map_.end()) {
+    return true;
+  }
+  return false;
+}
+
+const char* JsToken::GetTokenFromNumber(int id) {
+  int token_id = id - (ASCII_MAX_RANGE + 1);
+  if (token_id < keywords_length) {
+    return reserved_words[ token_id ];
+  }
+  return 0;
+}
+
+JsToken::ReservedTokenTable JsToken::reserved_map_;
+JsToken::BuiltinTokenTable JsToken::builtin_map_;
+os::Mutex JsToken::mutex_;
+
+TokenConverter::TokenConverter(TokenInfo* info) : info_(info){}
+
+const char* TokenConverter::cstr() {
+  buffer_.clear();
+  if (info_->type() > 127) {
+    return info_->token();
+  } else {
+    buffer_ += info_->type();
+    return buffer_.c_str();
+  }
+}
+
+
+}
diff --git a/src/mocha/roaster/nexc/tokens/js_token.h b/src/mocha/roaster/nexc/tokens/js_token.h
new file mode 100755
index 0000000..7fb5d65
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/js_token.h
@@ -0,0 +1,152 @@
+#ifndef mocha_js_token_h_
+#define mocha_js_token_h_
+#include <mocha/roaster/misc/class_traits/static.h>
+#include <mocha/roaster/platform/thread/thread.h>
+#include <mocha/roaster/lib/unordered_map.h>
+namespace mocha{
+class TokenInfo;
+//Bison compatible token list.
+class Token : private Static {
+ public :
+  enum {
+    JS_ABSTRACT = 128,//Token index begin from the out of ascii code range.
+    JS_BOOLEAN,
+    JS_BREAK,
+    JS_BYTE,
+    JS_CASE,
+    JS_CATCH,
+    JS_CHAR,
+    JS_CLASS,
+    JS_CONST,
+    JS_CONTINUE,
+    JS_DEBUGGER,
+    JS_DEFAULT,
+    JS_DELETE,
+    JS_DO,
+    JS_DOUBLE,
+    JS_ELSE,
+    JS_ENUM,
+    JS_EXPORT,
+    JS_EXTENDS,
+    JS_FALSE,
+    JS_FINAL,
+    JS_FINALLY,
+    JS_FLOAT,
+    JS_FOR,
+    JS_FUNCTION,
+    JS_GOTO,
+    JS_IF,
+    JS_IMPLEMENTS,
+    JS_IMPORT,
+    JS_IN,
+    JS_INSTANCEOF,
+    JS_INT,
+    JS_INTERFACE,
+    JS_LET,
+    JS_LONG,
+    JS_MODULE,
+    JS_NAN,
+    JS_NATIVE,
+    JS_NEW,
+    JS_K_NULL,
+    JS_PACKAGE_RESERVED,
+    JS_PRIVATE,
+    JS_PROTECTED,
+    JS_PUBLIC,
+    JS_RETURN,
+    JS_SHORT,
+    JS_STATIC,
+    JS_SUPER,
+    JS_SWITCH,
+    JS_SYNCHRONIZED,
+    JS_THIS,
+    JS_THROW,
+    JS_THROWS,
+    JS_TRANSIENT,
+    JS_TRUE,
+    JS_TRY,
+    JS_TYPEOF,
+    JS_VAR,
+    JS_VOID,
+    JS_VOLATILE,
+    JS_WHILE,
+    JS_WITH,
+    JS_EACH,
+    JS_YIELD,
+    JS_ASSERT,
+    MOCHA_VERSIONOF,
+    MOCHA_PRAGMA,
+    JS_INCREMENT,
+    JS_DECREMENT,
+    JS_EQUAL,
+    JS_SHIFT_LEFT,
+    JS_SHIFT_RIGHT,
+    JS_LESS_EQUAL,
+    JS_GREATER_EQUAL,
+    JS_EQ,
+    JS_NOT_EQUAL,
+    JS_NOT_EQ,
+    JS_U_SHIFT_RIGHT,
+    JS_ADD_LET,
+    JS_SUB_LET,
+    JS_DIV_LET,
+    JS_MOD_LET,
+    JS_MUL_LET,
+    JS_LOGICAL_AND,
+    JS_LOGICAL_OR,
+    JS_SHIFT_LEFT_LET,
+    JS_SHIFT_RIGHT_LET,
+    JS_U_SHIFT_RIGHT_LET,
+    JS_NOT_LET,
+    JS_AND_LET,
+    JS_OR_LET,
+    JS_FUNCTION_GLYPH,
+    JS_FUNCTION_GLYPH_WITH_CONTEXT,
+    JS_IDENTIFIER,
+    JS_NUMERIC_LITERAL,
+    JS_STRING_LITERAL,
+    JS_REGEXP_LITERAL,
+    JS_LINE_BREAK,
+    JS_SET,
+    JS_GET,
+    JS_PARAMETER_REST,
+    ILLEGAL,
+    END_OF_INPUT,
+    END_TOKEN = -1,
+  };
+};
+
+class JsToken : private Static {
+  typedef std::pair<std::string,int> TokenEntry;
+  typedef roastlib::unordered_map<std::string,int> ReservedTokenTable;
+  typedef roastlib::unordered_map<std::string,int> BuiltinTokenTable;
+ public:
+  static bool IsBinaryOperatorNoIn(int token);
+  static bool IsBinaryOperator(int token);
+  static int GetType(const char* token, bool isOperator = false);
+  static bool IsBuiltin(const char* token);
+  static bool IsReserved(const char* token);
+  static const char* GetTokenFromNumber(int id);
+  static void Initialize();
+ private :
+  static os::Mutex mutex_;
+  static ReservedTokenTable reserved_map_;
+  static BuiltinTokenTable builtin_map_;
+};
+
+
+class TokenConverter {
+ public :
+  TokenConverter(TokenInfo* info);
+  ~TokenConverter(){}
+  const char* cstr();
+ private :
+  std::string buffer_;
+  TokenInfo* info_;
+};
+
+}
+
+#endif
+
+
diff --git a/src/mocha/roaster/nexc/tokens/symbol_list.cc b/src/mocha/roaster/nexc/tokens/symbol_list.cc
new file mode 100755
index 0000000..56eedff
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/symbol_list.cc
@@ -0,0 +1,96 @@
+#include <mocha/roaster/tokens/symbol_list.h>
+
+namespace mocha {
+
+static const char runtime[][50] = {
+  "_mochaGlobalExport",
+  "_mochaGlobalAlias",
+  "_mochaLocalExport",
+  "_mochaLocalTmp",
+  "_mochaPrivateHolder",
+  "toArray",
+  "Runtime",
+  "createUnenumProp",
+  "__typeid__",
+  "constant",
+  "__private__",
+  "extendClass",
+  "extendPrototype",
+  "__MODULE__",
+  "__FILE__",
+  "__LINE__",
+  "_yieldState",
+  "next",
+  "send",
+  "exceptionHandler",
+  "_yieldResult",
+  "_isYieldSend",
+  "_isYieldSafe",
+  "_mochaGenerator",
+  "_mochaIsNewBorn",
+  "StopIteration",
+  "throwException",
+  "close",
+  "_mochaFinallyCache",
+  "_mochaCatchCache",
+  "_mochaException",
+  "createGenerator",
+  "__nothrowNext__",
+  "extend",
+  "assert",
+  "__ref_iterator__",
+  "throwStopIteration",
+  "hasIterator",
+  "getIterator",
+  "__typeid__",
+  "getUid",
+  "createPrivateRecord",
+  "getPrivateRecord",
+  "_mochaSuper",
+  "getSuper",
+  "__harmony_class__",
+  "_mochaTraitPrivate",
+  "_mochaTraitPublic",
+  "_mochaTraitMark",
+  "traitMixin",
+  "_mochaRequires",
+  "classMixin",
+  "checkRequirements",
+  "createTuple",
+  "createRecord",
+  "initializeClass"
+};
+
+static const char builtin[][50] = {
+  "arguments",
+  "undefined",
+  "constructor",
+  "this",
+  "apply",
+  "call",
+  "prototype",
+  "length",
+  "true",
+  "false",
+  "bind",
+  "push",
+  "trait",
+  "from",
+  "of",
+  "NaN",
+  "Function",
+  "Array",
+  "Object",
+  "String",
+  "Number"
+};
+
+
+const char* SymbolList::symbol(RuntimeSymbol runtime_symbol) {
+  return runtime[ runtime_symbol ];
+}
+const char* SymbolList::symbol(BuiltinSymbol builtin_symbol) {
+  return builtin[ builtin_symbol ];
+}
+
+}
diff --git a/src/mocha/roaster/nexc/tokens/symbol_list.h b/src/mocha/roaster/nexc/tokens/symbol_list.h
new file mode 100755
index 0000000..79a89f5
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/symbol_list.h
@@ -0,0 +1,97 @@
+#ifndef mocha_symbol_list_h_
+#define mocha_symbol_list_h_
+#include <mocha/roaster/misc/class_traits/static.h>
+namespace mocha {
+
+class SymbolList : private Static {
+ public :
+  typedef enum {
+    kGlobalExport,
+    kGlobalAlias,
+    kLocalExport,
+    kLocalTmp,
+    kPrivateHolder,
+    kToArray,
+    kRuntime,
+    kCreateUnenumProp,
+    kTypeId,
+    kConstant,
+    kPrivateField,
+    kExtendClass,
+    kExtendPrototype,
+    kScopeModule,
+    kFile,
+    kLine,
+    kYieldState,
+    kYieldNext,
+    kYieldSend,
+    kExceptionHandler,
+    kYieldResult,
+    kYieldSendFlag,
+    kYieldSafeFlag,
+    kGenerator,
+    kIsNewBorn,
+    kStopIteration,
+    kThrowException,
+    kClose,
+    kFinallyCache,
+    kCatchCache,
+    kException,
+    kCreateGenerator,
+    kNoThrow,
+    kExtend,
+    kAssert,
+    kIteratorKey,
+    kThrowStopIteration,
+    kHasIterator,
+    kGetIterator,
+    kTypeid,
+    kGetUid,
+    kCreatePrivateRecord,
+    kGetPrivateRecord,
+    kSuper,
+    kGetSuper,
+    kClassMark,
+    kTraitPrivate,
+    kTraitPublic,
+    kTraitMark,
+    kMixin,
+    kRequires,
+    kClassMixin,
+    kCheckRequirements,
+    kCreateTuple,
+    kCreateRecord,
+    kInitializeClass
+  } RuntimeSymbol;
+
+  typedef enum {
+    kArguments,
+    kUndefined,
+    kConstructor,
+    kThis,
+    kApply,
+    kCall,
+    kPrototype,
+    kLength,
+    kTrue,
+    kFalse,
+    kBind,
+    kPush,
+    kTrait,
+    kFrom,
+    kOf,
+    kNaN,
+    kFunctionConstructor,
+    kArrayConstructor,
+    kObjectConstructor,
+    kStringConstructor,
+    kNumberConstructor
+  } BuiltinSymbol;
+
+  static const char* symbol(RuntimeSymbol runtime_symbol);
+  static const char* symbol(BuiltinSymbol builtin_symbol);
+};
+
+}
+
+#endif
diff --git a/src/mocha/roaster/nexc/tokens/token_info.cc b/src/mocha/roaster/nexc/tokens/token_info.cc
new file mode 100755
index 0000000..8a2f983
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/token_info.cc
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <mocha/roaster/nexc/tokens/token_info.h>
+
+using namespace mocha;
+
+TokenInfo::TokenInfo(){};
+TokenInfo::TokenInfo(const char* token, int type, int64_t line)
+    : type_(type),
+      line_(line),
+      value_(token){};
+
+TokenInfo::TokenInfo(const std::string& token, int type, int64_t line)
+    : type_(type),
+      line_(line),
+      value_(token){};
+
+TokenInfo::TokenInfo(const std::stringstream& token, int type, int64_t line)
+    : type_(type),
+      line_(line),
+      value_(token.str()){};
+
+TokenInfo& TokenInfo::operator = (const TokenInfo& info) {
+  type_ = info.type_;
+  line_ = info.line_;
+  value_ = info.value_;
+  compressed_value_ = info.compressed_value_;
+  flags_ = info.flags_;
+  return (*this);
+}
+
+TokenInfo::~TokenInfo(){}
+
diff --git a/src/mocha/roaster/nexc/tokens/token_info.h b/src/mocha/roaster/nexc/tokens/token_info.h
new file mode 100755
index 0000000..d9d2768
--- /dev/null
+++ b/src/mocha/roaster/nexc/tokens/token_info.h
@@ -0,0 +1,55 @@
+
+#ifndef mocha_token_info_h_
+#define mocha_token_info_h_
+#include <string>
+#include <sstream>
+#include <mocha/roaster/misc/bits.h>
+#include <mocha/roaster/misc/int_types.h>
+#include <mocha/roaster/memory/pool.h>
+#define SET(num) flags_.Set(num);
+#define HAS(num) flags_.At(num);
+namespace mocha {
+class CompilerInfo;
+class TokenInfo : public memory::Allocated {
+ public:
+  TokenInfo();
+  TokenInfo(const char* val, int type, int64_t line);
+  TokenInfo(const std::string& val, int type, int64_t line);
+  TokenInfo(const std::stringstream& val, int type, int64_t line);
+  TokenInfo& operator = (const TokenInfo& info);
+  ~TokenInfo();
+  const char* token() const { return value_.c_str(); }
+  inline const char* compressed_name() const { return (compressed_value_.size() > 0)? compressed_value_.c_str() : value_.c_str(); };
+  inline void set_compressed_name(const char* token) { compressed_value_ = token; }
+  inline void set_token(const char* token) { value_ = token; }
+  inline void set_token(const std::string& value) { value_ = value; }
+  inline void set_token(const std::stringstream& value) { value_ = value.str(); }
+  inline bool IsCompressed() const { return !compressed_value_.empty(); }
+  inline void Rollback() { compressed_value_.clear(); }
+  inline int type() const { return type_; };
+  inline void set_type(int type) { type_ = type; };
+  inline int64_t line_number() const { return line_; }
+  inline void set_const_declaration() { SET(0); }
+  inline bool const_declaration() const { return HAS(0); }
+  inline void set_let_declaration() { SET(1); }
+  inline bool let_declaration() const { return HAS(1); }
+  inline void set_compile_info(CompilerInfo* info) { info_ = info; }
+  inline CompilerInfo* compile_info() const { return info_; }
+  inline bool linebreak_before() const { return HAS(2); }
+  inline bool linebreak_after() const { return HAS(3); }
+  inline void set_linebreak_befor() { SET(2); }
+  inline void set_linebreak_after() { SET(3); }
+ private:
+  int type_;
+  int64_t line_;
+  std::string value_;
+  std::string compressed_value_;
+  BitVector8 flags_;
+  CompilerInfo* info_;
+};
+
+}
+#undef SET
+#undef HAS
+#endif
+
diff --git a/src/mocha/roaster/parser/parser.cc b/src/mocha/roaster/parser/parser.cc
deleted file mode 100755
index 71a2da3..0000000
--- a/src/mocha/roaster/parser/parser.cc
+++ /dev/null
@@ -1,3888 +0,0 @@
-#include <assert.h>
-#include <vector>
-#include <sstream>
-#include <mocha/roaster/ast/ast.h>
-#include <mocha/roaster/ast/builder/ast_builder.h>
-#include <mocha/roaster/utils/error_reporter.h>
-#include <mocha/roaster/parser/parser.h>
-#include <mocha/roaster/scanner/token_stream.h>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/tokens/symbol_list.h>
-
-namespace mocha {
-
-static const char use_strict[] = { "use strict" };
-static const char literals[] = { "'identifier', 'String', 'Number', 'Boolean', 'this', 'RegExp'" };
-#define RETURN_FLG 0
-#define YIELD_FLG 1
-//Shortcut for syntax error reporter.
-#define SYNTAX_ERROR(msg) {                           \
-    std::stringstream st;                               \
-    st << msg;                                          \
-    reporter_->ReportSyntaxError(st.str().c_str());   \
-  }
-
-//Check error occured or not.
-//If error occured, immediate return an argument value.
-#define CHECK_ERROR(name) {                     \
-    if (reporter_->Error()) {                 \
-      return name;                              \
-    }                                           \
-  }
-
-//Debug flag.
-//#define PARSER_DEBUG 1
-
-//Print parser move to fp.
-#ifdef PARSER_DEBUG
-
-#define ENTER(mode)                                                     \
-  fflush(stdout);                                                       \
-  indent_+=' ';                                                         \
-  fprintf(stdout, "%snext token = %s enter %s %d\n", indent_.c_str(),TokenConverter(Seek()).cstr(),#mode, depth_); \
-  depth_++
-
-#define END(mode)                                                       \
-  fflush(stdout);                                                       \
-  fprintf(stdout, "%snext token = %s end %s %d\n", indent_.c_str(),TokenConverter(Seek()).cstr(),#mode, depth_); \
-  depth_--;                                                             \
-  indent_.erase(0,1)
-
-#else
-#define ENTER(mode)
-#define END(mode)
-#endif
-
-/**
- * @param {int} type
- * @returns bool
- * Check current token type is END_TOKEN or END_OF_INPUT.
- */
-bool IsEnd(int type) {
-  return type == Token::END_TOKEN || type == Token::END_OF_INPUT;
-}
-
-/**
- * @param {int} type
- * @returns bool
- * Callback function for ParseStatementList_.
- * Match block like structure.
- */
-bool BlockBodyMatcher(int type) {
-  return type != '}';
-}
-
-/**
- * @param {int} type
- * @returns bool
- * Callback function for ParseStatementList_.
- * Match case clause body.
- */
-bool CaseBodyMatcher(int type) {
-  return type != '}' && type != Token::JS_CASE && type != Token::JS_DEFAULT;
-}
-
-/**
- * @param {int} type
- * @returns bool
- * Check the type is a valid object literal property name.
- */
-bool IsValidPropertyName(int type) {
-  return type == Token::JS_IDENTIFIER ||
-      type == Token::JS_STRING_LITERAL ||
-      type == Token::JS_NUMERIC_LITERAL;
-}
-
-/**
- * @param {int} type
- * @returns bool
- * Check the type is a valid object literal member.
- */
-bool IsValidProperty(int type) {
-  return type == Literal::kString ||
-      type == Literal::kNumeric ||
-      type == Literal::kIdentifier ||
-      type == Literal::kProperty;
-}
-
-
-Parser::ParseEventListener::operator()(CompilationEvent* event) {
-  ParserConnector* connector = event->parser_connector();
-  ErrorReporter* reporter = event->error_reporter();
-  const char* filename = event->filename();
-  Parser parser(connector, reporter, filename);
-  event->set_ast(parser.Parse());
-  event->notificator()->NotifyForKey(CompilationEvent::EventKey::kTransform, event);
-}
-
-
-/**
- * @param {AstNode} args
- * @param {AstNode} list
- * Arrow function expression with formal parameter is parsed as expression at first.
- * So we convert an arrow function expression's formal parameter list to a valid formal parameter list.
- */
-NodeList* Parser::FormalParameterConvertor(AstNode *args) {
-  NodeIterator iterator = args->ChildNodes();
-  NodeList* result = new(pool()) NodeList;
-  while (iterator.HasNext()) {
-    AstNode* item = iterator.Next();
-    result->AddChild(item);
-    Expression* maybe_exp = item->CastToExpression();
-    Literal* maybe_ident = item->CastToLiteral();
-    CallExp* maybe_member = maybe_exp->CastToCallExp();
-    ObjectLikeLiteral* maybe_dst = item->CastToExpression()->CastToObjectLikeLiteral();
-    ArrayLikeLiteral* maybe_dst_array = item->CastToExpression()->CastToArrayLikeLiteral();
-    //process ...rest parameter
-    if (!maybe_ident &&
-         !maybe_dst &&
-         !maybe_dst_array &&
-         !maybe_member &&
-         item->node_type() != Literal::kAssignmentExp) {
-      SYNTAX_ERROR("malformed formal parameter list\\nin file "
-                    << filename_ << " at line " << Seek(-1)->line_number());
-      return result;
-    } else if (maybe_dst || maybe_dst_array) {
-      if (!item->CastToExpression()->IsValidLhs()) {
-        SYNTAX_ERROR("malformed formal parameter list\\nin file "
-                      << filename_ << " at line " << Seek(-1)->line_number());
-      }
-    } else if (maybe_ident) {
-      if (maybe_ident->value_type() == Literal::kSpread) {
-        maybe_ident->set_value_type(Literal::kRest);
-      }
-    } else if (item->node_type() == Literal::kAssignmentExp) {
-      AssignmentExp* assign = item->CastToExpression()->CastToAssigment();
-      AstNode* left = assign->left_value();
-      maybe_ident = left->CastToLiteral();
-      maybe_dst = left->CastToExpression()->CastToObjectLikeLiteral();
-      maybe_dst_array = left->CastToExpression()->CastToArrayLikeLiteral();
-      if (!maybe_ident &&
-           !maybe_dst &&
-           !maybe_dst_array) {
-        SYNTAX_ERROR("malformed formal parameter list\\nin file "
-                      << filename_ << " at line " << Seek(-1)->line_number());
-        return result;
-      }
-    } else if (maybe_member) {
-      AstNode* callable = maybe_member->callable();
-      while (callable->node_type() == AstNode::kCallExp) {
-        callable = callable->CastToExpression()->CastToCallExp()->callable();
-      }
-      Literal* literal = callable->CastToLiteral();
-      if (!literal && literal->value_type() != Literal::kThis &&
-           literal->value_type() != Literal::kPrivate) {
-        SYNTAX_ERROR("malformed formal parameter list\\nin file "
-                      << filename_ << " at line " << Seek(-1)->line_number());
-        return result;
-      }
-    }
-    result->AddChild(item);
-  }
-  return result;
-}
-
-
-class Parser::StateStack {
- public :
-  typedef enum {
-    kClassDecl,
-    kParseBegin,
-    kFinally,
-    kFunction,
-    kModule
-  } ParserState;
-  typedef std::vector<ParserState> StateArray;
-  void Push(ParserState state) { stack_.push_back(state); }
-  void Pop() { stack_.pop_back(); }
-  bool Has(ParserState state) {
-    StateArray::iterator begin = stack_.begin();
-    StateArray::iterator end = stack_.end();
-    while (begin != end) {
-      if (state == (*begin)) {
-        return true;
-      }
-      ++begin;
-    }
-    return false;
-  }
- private :
-  StateArray stack_;
-};
-
-Parser::Parser(ParserConnector* connector, ErrorReporter* reporter, const char* filename)
-    : filename_(filename),
-      depth_(0),
-      pool_(memory::Pool::Local()),
-      builder_(AstBuilder::Local()),
-      connector_(connector),
-      reporter_(reporter),
-      state_stack_(new StateStack){}
-Parser::~Parser(){}
-
-
-//The entrance for parser.
-//We return the FileRoot node not AstRoot.
-FileRoot* Parser::Parse() {
-  FileRoot* root = new(pool()) FileRoot(filename_);
-  root->Append(ParseProgram());
-  builder()->FindDirectivePrologue(root, root);
-  /**
-   * The finally data structure image.
-   * ---------------FileRoot------------
-   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
-   * statement statement statement statement
-   */
-  return root;
-}
-
-//Report illegal end of input.
-void Parser::IllegalEnd(const char* expect, int64_t line) {
-  SYNTAX_ERROR("parse error got unexpected end of input expect "
-                << expect << "\\nin file " << filename_ << " at line " << line);
-}
-
-
-void Parser::ParseTerminator() {
-  TokenInfo *token = Seek();
-  int type = token->type();
-  if (type == ';' || type == '}' || IsEnd(type) || token->linebreak_before()) {
-    if (type == ';') {
-      Advance();
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " expect ';' or 'line break'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-  }
-}
-
-//Begining of parse.
-AstNode* Parser::ParseProgram() {
-  ENTER(Program);
-  /*
-   *program
-   * : source_elements
-   */
-  AstNode* list = ParseSourceElements();
-  END(Program);
-  return list;
-}
-
-
-//ParseSourceElements_ is only called by ParseProgram.
-//If this function is called,
-//this function search until got END_TOKEN or END_OF_INPUT.
-//This function is only called once in each parse time.
-AstNode* Parser::ParseSourceElements() {
-  ENTER(SourceElements);
-  /*
-   *source_elements
-   *: source_element
-   *| source_elements source_element
-   */
-  //Check once flag.
-  assert(state_stack_->Has(StateStack::kParseBegin) == false);
-  state_stack_->Push(StateStack::kParseBegin);
-  TokenInfo* token;
-  NodeList* list = new(pool()) NodeList;
-  while ((token = Seek()) && token != 0 && token->type() != Token::END_TOKEN && token->type() != Token::END_OF_INPUT) {
-    AstNode* statement = ParseSourceElement();
-    CHECK_ERROR(statement);
-    list->AddChild(statement);
-  }
-  END(SourceElements);
-  /**
-   * The finally data structure image.
-   * ---------------NodeList------------
-   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
-   * statement statement statement statement
-   */
-  return list;
-}
-
-AstNode* Parser::ParseSourceElement() {
-  ENTER(SourceElement);
-  /*
-   * [bison/yacc compat syntax]
-   * source_element
-   * : statement
-   * | class_declaration
-   * | function_declaration
-   * | const_declaration
-   * ;
-   */
-  TokenInfo* info = Advance();
-  AstNode* result = 0;//init after;
-  if (info == 0 || info->type() == Token::END_TOKEN || info->type() == Token::END_OF_INPUT) {
-    return new(pool()) Empty;
-  }
-  /*
-   * The declaration of class,function and const or let is declarable only in
-   * the block statement body or function body or global.
-   */
-  switch (info->type()) {
-    case Token::JS_CLASS :{
-      result = ParseClassDecl(false);
-      ExpressionStmt* stmt = new(pool()) ExpressionStmt(info->line_number());
-      stmt->AddChild(result);
-      result = stmt;
-    }
-      break;
-
-    case Token::JS_FUNCTION : {
-      result = ParseFunctionDecl(false);
-      CHECK_ERROR(result);
-      Function* fn = result->CastToExpression()->CastToFunction();
-      fn->MarkAsDeclaration();
-    }
-      break;
-
-      //Now the const decaration is parsable, but not create block scope,
-      //because block scoping overhead are heavy for the current javascript.
-    case Token::JS_CONST : {
-      info = Seek();
-      //check syntax for const class decl.
-      if (info->type() == Token::JS_CLASS) {
-        Advance();
-        result = ParseClassDecl(true);
-        CHECK_ERROR(result);
-      } else {
-        TokenInfo* function_signature = Seek(2);
-        //check syntax for const function.
-        if (function_signature->type() == '(' || function_signature->type() == Token::JS_FUNCTION_GLYPH ||
-             function_signature->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-          result = ParseFunctionDecl(true);
-          CHECK_ERROR(result);
-          Function* fn = result->CastToExpression()->CastToFunction();
-          fn->MarkAsConstDeclaration();
-        } else {
-          result = ParseVariableStatement();
-          CHECK_ERROR(result);
-          result->first_child()->CastToExpression()->CastToVariableDeclarationList()->MarkAsConstDeclaration();
-        }
-      }
-      break;
-    }
-      //Now the let statement is parsable, but not create block scope,
-      //same reasons with above const declaration.
-    case Token::JS_LET :
-      result = ParseLetExpressionOrLetStatement();
-      CHECK_ERROR(result);
-      break;
-
-    default :
-      Undo();
-      result = ParseStatement();
-      CHECK_ERROR(result);
-  }
-  END(SourceElement);
-  return result;
-}
-
-//Parse the statement list,
-//like the block statement body or the function body.
-AstNode* Parser::ParseStatementList(StatementListMatcher matcher, const char* expect) {
-  /**
-   * [bison/yacc compat syntax]
-   * statement_list
-   * : statement
-   * | statement_list statement
-   * ;
-   */
-  ENTER(StatementList);
-  TokenInfo* token = Seek();
-  StatementList* list = new(pool()) StatementList;
-  while (matcher(token->type())) {
-    AstNode* statement = ParseSourceElement();
-    CHECK_ERROR(statement);
-    list->AddChild(statement);
-    token = Seek();
-    if (IsEnd(token->type())) {
-      SYNTAX_ERROR("parse error unexpected end of input expect "
-                    << expect
-                    << " in file " << filename_ << " at line " << token->line_number());
-      return list;
-    }
-  }
-  END(StatementList);
-  /**
-   * The finally data structure image.
-   * ---------------StatementList--------------
-   * |                                                                                                                                                                   |                                                                                                                                                                                      |                                                                                                                                                                                       |
-   * statement statement                                                                statement statement
-   */
-  return list;
-}
-
-
-//Parse statement.
-AstNode* Parser::ParseStatement() {
-  ENTER(Statement);
-  /*
-   *statement_no_block
-   *: block
-   *| module_block
-   *| export_statement
-   *| variable_statement
-   *| empty_statement
-   *| if_statement
-   *| iteration_statement
-   *| continue_statement
-   *| break_statement
-   *| return_statement
-   *| with_statement
-   *| labelled_statement
-   *| switch_statement
-   *| throw_statement
-   *| try_statement
-   *| import_statement
-   *| version_statement
-   *| function_declaration
-   *| exportable_denifinition
-   *| debugger_statement
-   *| expression_statement
-   *;
-   */
-  TokenInfo* token = Advance();
-  AstNode* result;
-  switch (token->type()) {
-    case '{' :
-      result = ParseBlockStatement();
-      break;
-
-    case Token::JS_MODULE :
-      result = ParseModuleStatement();
-      break;
-
-    case Token::JS_EXPORT :
-      result = ParseExportStatement();
-      break;
-
-    case Token::JS_VAR :
-      result = ParseVariableStatement();
-      break;
-
-    case ';' :
-      result = new(pool()) Empty;
-      break;
-
-    case Token::JS_IF :
-      result = ParseIFStatement(false);
-      break;
-
-    case Token::JS_FOR :
-      result = ParseForStatement(false);
-      break;
-
-    case Token::JS_WHILE :
-      result = ParseWhileStatement();
-      break;
-
-    case Token::JS_DO :
-      result = ParseDoWhileStatement(false);
-      break;
-
-    case Token::JS_CONTINUE :
-      result = ParseContinueStatement();
-      break;
-
-    case Token::JS_BREAK :
-      result = ParseBreakStatement();
-      break;
-
-    case Token::JS_RETURN :
-      result = ParseReturnStatement();
-      break;
-
-    case Token::JS_WITH :
-      result = ParseWithStatement();
-      break;
-
-    case Token::JS_SWITCH :
-      result = ParseSwitchStatement();
-      break;
-
-    case Token::JS_THROW :
-      result = ParseThrowStatement();
-      break;
-
-    case Token::JS_TRY :
-      result = ParseTryStatement();
-      break;
-
-    case Token::JS_IMPORT :
-      result = ParseImportStatement();
-      break;
-
-      //a mocha special keyword not harmony.
-    case Token::JS_ASSERT :
-      result = ParseAssertStatement();
-      break;
-
-      //a mocha special keyword not harmony.
-    case Token::MOCHA_VERSIONOF :
-      result = ParseVersionStatement();
-      break;
-
-    case Token::JS_FUNCTION : {
-      result = ParseFunctionDecl(false);
-      CHECK_ERROR(result);
-      Function* fn = result->CastToExpression()->CastToFunction();
-      fn->MarkAsDeclaration();
-    }
-      break;
-
-    case Token::JS_DEBUGGER :
-      result = ParseDebuggerStatement(token);
-      break;
-
-      //The exportable definition is only acceptable in class declaration,
-      //but private accessor is allowed in any place.
-    case Token::JS_PRIVATE :
-    case Token::JS_PUBLIC :
-    case Token::JS_STATIC : {
-      TokenInfo *token = Seek();
-      if (token->type() == '.' || token->type() == '[') {
-        //private accessor.
-        result = CheckLabellOrExpressionStatement();
-      } else {
-        result = ParseClassMemberStatement();
-      }
-    }
-      break;
-
-    default : {
-      if (token->type() == Token::JS_IDENTIFIER) {
-        TokenInfo* ident = token;
-        TokenInfo* token = Seek(2);
-        //Check trait declaration.
-        //The trait keyword is not treated as the reserved word.
-        if (strcmp(ident->token(), SymbolList::symbol(SymbolList::kTrait)) == 0 && token->type() == '{') {
-          result = ParseTrait();
-          CHECK_ERROR(result);
-          result->CastToExpression()->CastToTrait()->MarkAsDeclaration();
-          break;
-        }
-      }
-      result = CheckLabellOrExpressionStatement();
-      CHECK_ERROR(result);
-      //If shorten function expression is parsed as expression,
-      //we mark as function declaration.
-      if (result->node_type() == AstNode::kExpressionStmt) {
-        Expression* exp = result->first_child()->CastToExpression();
-        if (!exp->IsParenthesis() && exp->child_length() == 1) {
-          AstNode* item = exp->first_child();
-          if (item->node_type() == AstNode::kFunction) {
-            item->CastToExpression()->CastToFunction()->MarkAsDeclaration();
-            result = item;
-          }
-        } else if (!exp->IsParenthesis() && exp->child_length() > 1) {
-          if (exp->first_child()->node_type() == AstNode::kFunction) {
-            SYNTAX_ERROR("illegal trailing comma after function declaration.\\nIn file"
-                          << filename_ << " at line " << exp->line_number());
-          }
-        }
-      }
-    }
-  }
-  CHECK_ERROR(result);
-  END(Statement);
-  return result;
-}
-
-AstNode* Parser::ParseBlockStatement() {
-  ENTER(BlockStatement);
-  /*
-   * [bison/yacc compat syntax]
-   * block
-   * : '{' '}'
-   * | '{' statement_list '}'
-   */
-  TokenInfo* token = Seek();
-  BlockStmt* block = new(pool()) BlockStmt(token->line_number());
-  //Check block statement has body or not.
-  //If block body is empty -> {}, set Empty node to block body.
-  if (token->type() != '}') {
-    while (1) {
-      AstNode* statement = ParseSourceElement();
-      CHECK_ERROR(statement);
-      block->AddChild(statement);
-      token = Seek();
-      if (token->type() == '}') {
-        Advance();
-        break;
-      } else if (IsEnd(token->type())) {
-        IllegalEnd("'}'", token->line_number());
-        END(BlockStatementError);
-        return block;
-      }
-    }
-  } else {
-    Advance();
-  }
-  END(BlockStatement);
-  /**
-   * The finally data structure image.
-   * --------------BlockStmt------------
-   * |                                                                                                                                                                   |                                                                                                                      |                                                                                                                        |
-   * statement statement statement statement
-   */
-  return block;
-}
-
-
-//Parse module statement.
-AstNode* Parser::ParseModuleStatement() {
-  ENTER(ModuleStatement);
-  /*
-   * [bison/yacc compat syntax]
-   * module_statement
-   * : JS_MODULE identifier__opt statement
-   * ;
-   */
-  TokenInfo* token = Seek();
-  AstNode* name = 0;//init after.
-  if (token->type() == Token::JS_IDENTIFIER) {
-    name = ParseLiteral();
-    CHECK_ERROR(new(pool()) Empty);
-  } else {
-    name = new(pool()) Empty;
-  }
-  ModuleStmt* module_stmt = new(pool()) ModuleStmt(name, token->line_number());
-  AstNode* statement = ParseSourceElement();
-  module_stmt->AddChild(statement);
-  END(ModuleStatement);
-  /**
-   * The finally data structure image.
-   * ModuleStmt--name
-   * |                                                                                                                                                                   |
-   * |                                   Literal or Empty
-   * |
-   * statement
-   */
-  return module_stmt;
-}
-
-//Parse export statement.
-AstNode* Parser::ParseExportStatement() {
-  ENTER(ExportStatement);
-  /*
-   * [bison/yacc compat syntax]
-   * export_statement
-   * : JS_EXPORT exportable_definition
-   */
-  TokenInfo* token = Seek(-1);
-  ExportStmt* export_stmt = new(pool()) ExportStmt(token->line_number());
-  AstNode* exportable = ParseExportableDefinition();
-  CHECK_ERROR(export_stmt);
-  export_stmt->AddChild(exportable);
-  END(ExportStatement);
-  /**
-   * The finally data structure image.
-   * ExportStmt
-   * |
-   * function or class or variable decl or const decl
-   */
-  return export_stmt;
-}
-
-//Parse import statement.
-AstNode* Parser::ParseImportStatement() {
-  ENTER(ImportStatement);
-  /*
-   * [bison/yacc compat syntax]
-   * import_statement
-   * : JS_IMPORT JS_IDENTIFIER JS_FROM import_expression terminator
-   */
-  TokenInfo* token = Seek();
-  int expression_type;
-  AstNode* exp;
-  if (token->type() == Token::JS_IDENTIFIER) {
-    exp = ParseLiteral();
-    CHECK_ERROR(exp);
-    expression_type = ImportStmt::kVar;
-  } else if (token->type() == '{' || token->type() == '[') {
-    //import statement allow destructuring assignment.
-    exp = ParseDestructuringLeftHandSide();
-    CHECK_ERROR(exp);
-    expression_type = ImportStmt::kDst;
-  }
-  TokenInfo* from = Advance();
-  const char* ident = from->token();
-  //from keyword is not treated as the reserved word,
-  //so we check that an identifier is the valid from keyword or not.
-  if (from->type() == Token::JS_IDENTIFIER &&
-       strlen(ident) > 0 &&
-       strcmp(ident, SymbolList::symbol(SymbolList::kFrom)) == 0) {
-    AstNode* from_exp = ParseImportExpression();
-    CHECK_ERROR(from_exp);
-    Literal* maybe_file = from_exp->first_child()->CastToLiteral();
-    int from_type;
-    //The import statement could accept the filename or the module name.
-    if (maybe_file && maybe_file->value_type() == Literal::kString) {
-      from_type = ImportStmt::kFile;
-    } else {
-      from_type = ImportStmt::kModule;
-    }
-    ImportStmt* stmt = new(pool()) ImportStmt(expression_type, from_type, token->line_number());
-    CHECK_ERROR(stmt);
-    stmt->set_expression(exp);
-    stmt->set_from(from_exp);
-    ParseTerminator();
-    CHECK_ERROR(stmt);
-    END(ImportStatement);
-    /**
-     * The finally data structure image.
-     * ImportStmt---------expression
-     *                                                                                                                                   |                                                                                                                                                                                      |
-     *                                                                                                                                   | identifier or destructuring
-     *                                                                                                                                   |
-     *                                                                                                                                   |-----------from
-     *                                                                                                                                                                                                                                                                                                                                                                  |
-     *                                                                                                                                                                  string literal or call exp
-     */
-    return stmt;
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(from).cstr()
-                  << " after 'import' expect 'from'\\nin file "
-                  << filename_ << " at line " << from->line_number());
-    END(ImportStatementError);
-    return new(pool()) Empty();
-  }
-}
-
-//Parse import expression.
-//import ... from <here>
-AstNode* Parser::ParseImportExpression() {
-  ENTER(ImportExpression);
-  TokenInfo* token = Seek();
-  NodeList* list = new(pool()) NodeList();
-  //In case of filename.
-  if (token->type() == Token::JS_STRING_LITERAL) {
-    AstNode* literal = ParseLiteral();
-    CHECK_ERROR(literal);
-    list->AddChild(literal);
-  } else if (token->type() == Token::JS_IDENTIFIER) {
-    //In case of module name.
-    AstNode* literal = ParseLiteral();
-    CHECK_ERROR(literal);
-    list->AddChild(literal);
-  }
-  token = Seek();
-  while (1) {
-    if (token->type() == '.' || token->type() == '[') {
-      AstNode* literal = ParseLiteral();
-      CHECK_ERROR(literal);
-      list->AddChild(literal);
-      token = Seek();
-    } else {
-      break;
-    }
-  }
-  END(ImportExpression);
-  return list;
-}
-
-//Parse debugger statement.
-AstNode* Parser::ParseDebuggerStatement(TokenInfo* token) {
-  ENTER(DebuggerStatement);
-  Literal* value = new(pool()) Literal(Literal::kIdentifier, token->line_number());
-  value->set_value(token);
-  Expression* exp = new(pool()) Expression(token->line_number());
-  ExpressionStmt* stmt = new(pool()) ExpressionStmt(token->line_number());
-  stmt->AddChild(exp);
-  exp->AddChild(value);
-  END(DebuggerStatement);
-  return stmt;
-}
-
-//Parse version statement
-AstNode* Parser::ParseVersionStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * version_statement
-   * : MOCHA_VERSIONOF '(' JS_IDENTIFIER ')' statement
-   * ;
-   */
-  ENTER(VersionStatement);
-  TokenInfo* token = Advance();
-  if (token->type() == '(') {
-    token = Advance();
-    if (token->type() == Token::JS_IDENTIFIER) {
-      VersionStmt* stmt = new(pool()) VersionStmt(token, token->line_number());
-      token = Advance();
-      if (token->type() == ')') {
-        token = Seek();
-        if (token->type() == '{') {
-          Advance();
-          AstNode* statement = ParseStatementList(BlockBodyMatcher, "}");
-          CHECK_ERROR(stmt);
-          stmt->AddChild(statement);
-          Advance();
-          END(VersionStatement);
-          /**
-           * The finally data structure image.
-           * VersionStmt
-           *                                             |
-           *            statement
-           */
-          return stmt;
-        } else {
-          AstNode* statement = ParseStatement();
-          CHECK_ERROR(stmt);
-          stmt->AddChild(statement);
-          END(VersionStatement);
-          return stmt;
-        }
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'version statement' expect 'identifier' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(VersionStatementError);
-      return new(pool()) Empty;
-    }
-  }
-  SYNTAX_ERROR("parse error got unexpected token "
-                << TokenConverter(token).cstr()
-                << " in 'version statement' expect ')' \\nin file "
-                << filename_ << " at line " << token->line_number());
-  END(VersionStatementError);
-  return new(pool()) Empty;
-}
-
-//Parse assert statement
-AstNode* Parser::ParseAssertStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * mocha_assert_statement
-   * : MOCHA_ASSERT '(' assignment_expression ',' assignment_expression ')'
-   */
-  ENTER(AssertStatement);
-  TokenInfo *token = Seek();
-  int64_t line = token->line_number();
-  if (token->type() == '(') {
-    token = Advance();
-    AstNode* expect = ParseAssignmentExpression(false);
-    CHECK_ERROR(expect);
-    token = Advance();
-    if (token->type() == ',') {
-      AstNode* exp = ParseAssignmentExpression(false);
-      token = Advance();
-      if (token->type() == ')') {
-        ParseTerminator();
-        CHECK_ERROR(exp);
-        AssertStmt* stmt = new(pool()) AssertStmt(line);
-        stmt->AddChild(expect);
-        stmt->AddChild(exp);
-        /**
-         * The finally data structure image.
-         *                                                       AssertStmt
-         *                                                                                                                       |
-         * assignment expression
-         *                                                                                                                       |
-         * assignment expression
-         */
-        return stmt;
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " 'in assert statement' expect ')'\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(AssertStatementError);
-        return expect;
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " 'in assert statement', second arguments must be a 'expression'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(AssertStatementError);
-      return expect;
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " 'in assert statement' expect '('\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(AssertStatementError);
-    return new(pool()) Empty;
-  }
-}
-
-//Parse variable statement
-AstNode* Parser::ParseVariableStatement() {
-  ENTER(VariableStatement);
-  /*
-   * [bison/yacc compat bnf syntax]
-   * variable_statement
-   * : JS_VAR variable_declaration_list terminator
-   * | JS_CONST variable_declaration_list terminator
-   * | JS_LET variable_declaration_list terminator
-   * ;
-   */
-  TokenInfo* token = Seek(-1);
-  VariableStmt* stmt = new(pool()) VariableStmt(token->line_number());
-  AstNode* list = ParseVariableDecl(false);
-  CHECK_ERROR(stmt);
-  token = Seek();
-  if (token->type() == ';') {
-    Advance();
-  }
-  stmt->AddChild(list);
-  END(VariableStatement);
-  /**
-   * The finally data structure image.
-   *                                            - VariableStmt-
-   *                                            |                                                        |                                                                                      |
-   * literal literal literal
-   */
-  return stmt;
-}
-
-//Parse variable declaration.
-AstNode* Parser::ParseVariableDecl(bool is_noin) {
-  ENTER(VariableDecl);
-  /*
-   * [bison/yacc compat bnf syntax]
-   * variable_declaration
-   * : JS_IDENTIFIER initialiser__opt
-   * | destructuring_assignment_left_hand_side initialiser__opt
-   * ;
-   *
-   * variable_declaration_no_in
-   * : JS_IDENTIFIER initialiser_no_in__opt
-   * | destructuring_assignment_left_hand_side initialiser_no_in__opt
-   * ;
-   */
-  TokenInfo* maybe_assign_op = Seek(2);
-  VariableDeclarationList* list = new(pool()) VariableDeclarationList(maybe_assign_op->line_number());
-  TokenInfo* next = Seek();
-  //Get all declarations.
-  //Like var x, y = 200, z;
-  while (1) {
-    AstNode* var_left_hand;
-    bool is_destructuring = false;
-    if (next->type() == '{' || next->type() == '[') {
-      //Treat harmony destructuring.
-      var_left_hand = ParseDestructuringLeftHandSide();
-      CHECK_ERROR(list);
-      is_destructuring = true;
-      maybe_assign_op = Seek();
-    } else if (next->type() == Token::JS_IDENTIFIER) {
-      //Normal idneifier.
-      var_left_hand = ParseLiteral();
-      CHECK_ERROR(var_left_hand);
-      var_left_hand->CastToLiteral()->set_value_type(Literal::kVariable);
-      CHECK_ERROR(list);
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(next).cstr()
-                    << " in 'variable statement' expect 'variable name' or 'destructuring assignment'\\nin file "
-                    << filename_ << " at line " << next->line_number());
-      END(VariableDeclError);
-      return new(pool()) Empty();
-    }
-    /*
-     * We check result of Seek(2) is assignment operator or not.
-     * If that is assignment operator, we treat next token list as expression,
-     * if not, that is treated as just declaration.
-     */
-    if (maybe_assign_op->type() == '=') {
-      Advance();
-      AstNode* assignment_exp = ParseAssignmentExpression(is_noin);
-      CHECK_ERROR(list);
-      var_left_hand->AddChild(assignment_exp);
-      list->AddChild(var_left_hand);
-    } else {
-      var_left_hand->AddChild(new(pool()) Empty);
-      list->AddChild(var_left_hand);
-    }
-    next = Seek();
-    /*
-     * If next token type is semicolon or line break, declarations are end,
-     * if next token type is comma, declaration is continue after,
-     * if not, it's error.
-     */
-    if (next->type() != ',') {
-      break;
-    } else {
-      Advance();
-    }
-    maybe_assign_op = Seek(2);
-    next = Seek();
-  }
-  END(VariableDecl);
-  return list;
-}
-
-
-AstNode* Parser::ParseLetExpressionOrLetStatement() {
-  TokenInfo* token = Seek();
-  if (token->type() == '(') {
-    Advance();
-    AstNode* exp_list = ParseLetExpressionExp();
-    CHECK_ERROR(exp_list);
-    Advance();
-    token = Seek();
-    Function* fn = new(pool()) Function(token->line_number());
-    fn->set_name(new(pool()) Empty);
-    AstNode* list = exp_list->first_child();
-    AstNode* args = list->next_sibling();
-    NodeList* valid_formal = FormalParameterConvertor(list);
-    CHECK_ERROR(valid_formal);
-    fn->set_argv(valid_formal);
-    if (token->type() == '{') {
-      Advance();
-      AstNode* node = ParseStatementList(BlockBodyMatcher, "'}'");
-      Advance();
-      CHECK_ERROR(node);
-      fn->Append(node);
-    } else {
-      AstNode* node = ParseSourceElement();
-      CHECK_ERROR(node);
-      fn->AddChild(node);
-    }
-    Literal* call_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kCall),
-                                                  Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
-    Literal* this_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kThis),
-                                                  Token::JS_THIS, token->line_number(), Literal::kThis);
-    Expression* fn_exp = new(pool()) Expression(fn->line_number());
-    fn_exp->AddChild(fn);
-    fn_exp->MarkParenthesis();
-    args->InsertBefore(this_sym);
-    CallExp* dot_accessor = builder()->CreateDotAccessor(fn_exp, call_sym, fn->line_number());
-    /**
-     * return anonymouse function call
-     * (function (<let expression>) {
-     *   ...
-     * }).call(this, <args>);
-     */
-    return builder()->CreateExpStmt(builder()->CreateNormalAccessor(dot_accessor, args, fn->line_number()), fn->line_number());
-  } else {
-    return ParseVariableStatement();
-  }
-}
-
-
-AstNode* Parser::ParseLetExpressionExp() {
-  TokenInfo* token = Seek();
-  NodeList* list = new(pool()) NodeList;
-  NodeList* args = new(pool()) NodeList;
-  while (1) {
-    AstNode* node = ParseAssignmentExpression(false);
-    CHECK_ERROR(node);
-    AssignmentExp *assign = node->CastToExpression()->CastToAssigment();
-    if (assign) {
-      list->AddChild(assign->left_value());
-      args->AddChild(assign->right_value());
-    } else {
-      list->AddChild(node);
-      args->AddChild(builder()->CreateNameNode(SymbolList::symbol(SymbolList::kUndefined),
-                                                Token::JS_IDENTIFIER, token->line_number(), Literal::kIdentifier));
-    }
-    token = Seek();
-    if (token->type() != ',') {
-      break;
-    }
-    Advance();
-    token = Seek();
-  }
-  return builder()->CreateNodeList(2, list, args);
-}
-
-
-//Parse destructuring assignment
-AstNode* Parser::ParseDestructuringLeftHandSide() {
-  ENTER(DestructuringLeftHandSide);
-  /*
-   * [bison/yacc compat bnf syntax]
-   * destructuring_assignment_left_hand_side
-   * : array_left_hand_side
-   * | object_left_hand_side
-   * ;
-   */
-  TokenInfo* token = Advance();
-  if (token->type() == '[') {
-    END(DestructuringLeftHandSide);
-    return ParseArrayPattern();
-    //We expect error checking is already finished.
-  } else {
-    END(DestructuringLeftHandSide);
-    return ParseObjectPattern();
-  }
-}
-
-
-//Parse destructuring assignment array pattern.
-AstNode* Parser::ParseArrayPattern() {
-  ENTER(ArrayPattern);
-  /*
-   * [bison/yacc compat syntax]
-   * array_left_hand_side
-   * : '[' elision__opt ']'
-   * | '[' array_left_hand_side_list ']'
-   * | '[' ',' elision__opt ']'
-   * ;
-   *
-   * array_left_hand_side_list
-   * : elision__opt JS_IDENTIFIER
-   * | elision__opt formal_parameter_rest
-   * | elision__opt destructuring_assignment_left_hand_side
-   * | array_left_hand_side_list ',' elision__opt JS_IDENTIFIER
-   * | array_left_hand_side_list ',' elision__opt formal_parameter_rest
-   * | array_left_hand_side_list ',' elision__opt destructuring_assignment_left_hand_side
-   * ;
-   */
-  TokenInfo* token = Seek();
-  ArrayLikeLiteral* destructuring = new(pool()) ArrayLikeLiteral(token->line_number());
-  destructuring->MarkAsLhs();
-  while (1) {
-    if (token->type() == '[' || token->type() == '{') {
-      AstNode* elem = ParseDestructuringLeftHandSide();
-      CHECK_ERROR(elem);
-      destructuring->set_element(elem);
-      token = Seek();
-      if (token->type() == ',') {
-        Advance();
-      }
-    } else if (token->type() == ']') {
-      Advance();
-      break;
-    } else {
-      if (token->type() == ',') {
-        destructuring->set_element(new(pool()) Empty);
-        Advance();
-        token = Seek();
-        if (token->type() == ']') {
-          destructuring->set_element(new(pool()) Empty);
-          Advance();
-          break;
-        }
-      } else if (token->type() == Token::JS_IDENTIFIER) {
-        AstNode* value = ParseLiteral();
-        CHECK_ERROR(destructuring);
-        destructuring->set_element(value);
-        token = Seek();
-        if (token->type() == ',') {
-          Advance();
-        }
-      } else if (token->type() == Token::JS_PARAMETER_REST) {
-        token = Advance(2);
-        if (token->type() == Token::JS_IDENTIFIER) {
-          Literal* rest = new(pool()) Literal(Literal::kRest, token->line_number());
-          rest->set_value(token);
-          destructuring->set_element(rest);
-        } else {
-          SYNTAX_ERROR("parse error got undexpected token "
-                        << TokenConverter(token).cstr()
-                        << ". In 'destructuring assignment parameter rest expect 'identifier'\\nin file "
-                        << filename_ << " at line "
-                        << token->line_number());
-          break;
-        }
-      } else {
-        //In destructuring assignemtn, if array pattern used,
-        //it's element is only allowed JS_IDENTIFIER or JS_REST.
-        SYNTAX_ERROR("parse error got undexpected token "
-                      << TokenConverter(token).cstr()
-                      << ". In 'destructuring assignment array pattern' "
-                      "element is only allowed 'identifier' or 'parameter rest'.\\nin file '"
-                      << filename_ << " at line "
-                      << token->line_number());
-        break;
-      }
-    }
-    token = Seek();
-  }
-  END(ArrayPattern);
-  /**
-   * The finally data structure image.
-   *                                            ArrayLikeLiteral
-   *                                                                                                                                            |
-   *            literal or destructuring
-   */
-  return destructuring;
-}
-
-//Parse destructuring assignment object pattern
-AstNode* Parser::ParseObjectPattern() {
-  ENTER(ObjectPattern);
-  /*
-   * [bison/yacc compat syntax]
-   * object_member_left_hand_side_list
-   * :  JS_IDENTIFIER
-   * | property_name ':' JS_IDENTIFIER
-   * | property_name ':' destructuring_assignment_left_hand_side
-   * | object_member_left_hand_side_list ',' property_name ':' JS_IDENTIFIER
-   * | object_member_left_hand_side_list ',' JS_IDENTIFIER
-   * | object_member_left_hand_side_list ',' property_name ':' destructuring_assignment_left_hand
-   * ;
-   */
-  TokenInfo* token = Seek();
-  int maybe_colon = Seek(2)->type();
-  ObjectLikeLiteral* destructuring = new(pool()) ObjectLikeLiteral(token->line_number());
-  destructuring->MarkAsLhs();
-  while (1) {
-    if (maybe_colon == '}') {
-      ParseObjectPatternElement(token->type(), token, destructuring);
-      CHECK_ERROR(destructuring);
-      Advance();
-      break;
-    } else if (maybe_colon == ',') {
-      ParseObjectPatternElement(token->type(), token, destructuring);
-      CHECK_ERROR(destructuring);
-      Advance();
-    } else if (maybe_colon == ':') {
-      AstNode* node = ParseLiteral();
-      CHECK_ERROR(destructuring);
-      Advance();
-      token = Seek();
-      if (token->type() == '[' || token->type() == '{') {
-        AstNode* elem = ParseDestructuringLeftHandSide();
-        CHECK_ERROR(elem);
-        node->AddChild(elem);
-      } else {
-        ParseObjectPatternElement(token->type(), token, destructuring);
-        CHECK_ERROR(destructuring);
-        AstNode* last = destructuring->elements()->last_child();
-        destructuring->elements()->RemoveChild(last);
-        node->AddChild(last);
-      }
-      destructuring->set_element(node);
-      token = Advance();
-      if (token->type() == '}') {
-        break;
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << ". In 'destructuring assignment object pattern'"
-                    " member only allowed normal '{ property_name : idenfier }' or '{ identifier }'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-    }
-    token = Seek();
-    maybe_colon = Seek(2)->type();
-  }
-  END(ObjectPattern);
-  return destructuring;
-}
-
-//Parse destructuring assignment object patter's each element.
-AstNode* Parser::ParseObjectPatternElement(int type, TokenInfo* token, ObjectLikeLiteral* object) {
-  ENTER(ObjectPatternElement);
-  if (type == Token::JS_IDENTIFIER) {
-    AstNode* node = ParseLiteral();
-    CHECK_ERROR(node);
-    object->set_element(node);
-    END(ObjectPatternElement);
-    return node;
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << ". In 'destructuring assignment object pattern'"
-                  " member only allowed normal '{ property_name : idenfier }' or '{ identifier }'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(ObjectPatternElementError);
-    return new(pool()) Empty;
-  }
-}
-
-//Parse labelled statement or expression statement.
-AstNode* Parser::CheckLabellOrExpressionStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * labelled_statement
-   * : JS_IDENTIFIER ':' statement
-   * ;
-   *
-   * expression_statement
-   * : expression
-   * ;
-   */
-  ENTER(LabellOrExpressionStatement);
-  TokenInfo* token = Seek();
-  Undo();
-  //In case of labelled statement.
-  if (token->type() == ':') {
-    AstNode* stmt = ParseLabelledStatement();
-    CHECK_ERROR(stmt);
-    END(LabellOrExpressionStatement);
-    return stmt;
-  } else {
-    AstNode* ret = ParseExpression(false);
-    CHECK_ERROR(ret);
-    ParseTerminator();
-    CHECK_ERROR(ret);
-    ExpressionStmt* stmt = new(pool()) ExpressionStmt(token->line_number());
-    stmt->AddChild(ret);
-    END(LabellOrExpressionStatement);
-    return stmt;
-  }
-}
-
-//Parse if statement
-AstNode* Parser::ParseIFStatement(bool is_comprehensions) {
-  ENTER(IFStatement);
-  /*
-   * [bison/yacc compat syntax]
-   * if_statement
-   * : JS_IF '(' expression ')' statement JS_ELSE statement
-   * | JS_IF '(' expression ')' statement
-   * | JS_IF_OPT expression statement
-   * ;
-   */
-  TokenInfo *token = Advance();
-  IFStmt* if_stmt = new(pool()) IFStmt(token->line_number());
-  if (token->type() == '(') {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(if_stmt);
-    if_stmt->set_condition(exp);
-    token = Advance();
-    if (token->type() == ')') {
-      if (!is_comprehensions) {
-        AstNode* stmt = ParseSourceElement();
-        CHECK_ERROR(stmt);
-        if_stmt->set_then_statement(stmt);
-        token = Seek();
-        if (token->type() == Token::JS_ELSE) {
-          Advance();
-          AstNode* stmt = ParseSourceElement();
-          CHECK_ERROR(stmt)
-              if_stmt->set_else_statement(stmt);
-        } else {
-          if_stmt->set_else_statement(new(pool()) Empty);
-        }
-      } else {
-        if_stmt->set_then_statement(new(pool()) Empty);
-        if_stmt->set_else_statement(new(pool()) Empty);
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'if statement conditional expression end' expect ')' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(IFStatementError);
-      return if_stmt;
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'if statement conditional expression' expect '(' \\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(IFStatementError);
-    return if_stmt;
-  }
-  END(IFStatement);
-
-  return if_stmt;
-}
-
-//Parse do while statement.
-AstNode* Parser::ParseDoWhileStatement(bool is_expression) {
-  /**
-   * [bison/yacc compat syntax]
-   * iteration_statement
-   * : JS_DO statement JS_WHILE '(' expressio ')' terminator
-   * ;
-   *
-   * do_expression
-   * | JS_DO statement
-   */
-  ENTER(DoWhileStatement);
-  int64_t line = Seek(-1)->line_number();
-  AstNode* statement = ParseSourceElement();
-  CHECK_ERROR(statement);
-  TokenInfo* token = Seek();
-  if (token->type() == Token::JS_WHILE && !is_expression) {
-    token = Advance(2);
-    if (token->type() == '(') {
-      AstNode* node = ParseExpression(false);
-      CHECK_ERROR(statement);
-      token = Advance();
-      if (token->type() == ')') {
-        IterationStmt* iter = new(pool()) IterationStmt(IterationStmt::kDoWhile, line);
-        iter->set_expression(node);
-        iter->AddChild(statement);
-        END(DoWhileStatement);
-        return iter;
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'while statement conditional expression' expect ')' \\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(DoWhileStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kWhile, line);
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'do while statement conditional expression' expect '(' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(DoWhileStatementError);
-      return new(pool()) IterationStmt(IterationStmt::kWhile, line);
-    }
-  } else {
-    //do expression.
-    token = Seek();
-    Function* fn = new(pool()) Function(line);
-    fn->set_name(new(pool()) Empty);
-    if (statement->node_type() == AstNode::kBlockStmt) {
-      fn->Append(statement);
-    } else {
-      fn->AddChild(statement);
-    }
-    AstNode* node = fn->last_child();
-    if (node->CastToExpression() || node->node_type() == AstNode::kExpressionStmt) {
-      ReturnStmt* stmt = 0;//init after
-      if (node->node_type() == AstNode::kExpressionStmt) {
-        stmt = builder()->CreateReturnStmt(node->first_child(), node->line_number());
-      } else {
-        stmt = builder()->CreateReturnStmt(node, node->line_number());
-      }
-      fn->ReplaceChild(node, stmt);
-    }
-    fn->set_argv(new(pool()) Empty);
-    ExpressionStmt* ret_stmt = builder()->CreateAnonymousFnCall(fn, new(pool()) Empty, fn->line_number());
-    return (is_expression)? ret_stmt->first_child() : ret_stmt;
-  }
-}
-
-
-//Parse while statement
-AstNode* Parser::ParseWhileStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * iteration_statement
-   * : JS_WHILE '(' expression ')' statement
-   * ;
-   */
-  ENTER(WhileStatement);
-  TokenInfo* token = Advance();
-  int64_t line = token->line_number();
-  if (token->type() == '(') {
-    AstNode* node = ParseExpression(false);
-    CHECK_ERROR(node);
-    token = Advance();
-    if (token->type() == ')') {
-      IterationStmt* iter = new(pool()) IterationStmt(IterationStmt::kWhile, line);
-      iter->set_expression(node);
-      AstNode* statement = ParseSourceElement();
-      CHECK_ERROR(iter);
-      iter->AddChild(statement);
-      END(WhileStatement);
-      return iter;
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'while statement conditional expression' expect ')' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(WhileStatementError);
-      return new(pool()) IterationStmt(IterationStmt::kWhile, line);
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'while statement conditional expression' expect '(' \\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(WhileStatementError);
-    return new(pool()) IterationStmt(IterationStmt::kWhile, line);
-  }
-}
-
-
-//Parse for statement
-//In this method, the for statement includes for_in_statement,
-//for_of_statement and array_comprehensions_iteration.
-AstNode* Parser::ParseForStatement(bool is_comprehensions) {
-  /**
-   * [bison/yacc compat syntax]
-   * iteration_statement
-   * : JS_FOR '(' JS_VAR variable_declaration_list_no_in ';' expression__opt ';' expression__opt) statement
-   * | JS_FOR '(' expression_no_in__opt ';' expression__opt ';' expression__opt ')' statement
-   * | JS_FOR '(' JS_VAR variable_declaration_no_in JS_IN expression ')' statement
-   * | JS_FOR '(' left_hand_side_expression JS_IN expression ')' statement
-   * | JS_FOR '(' JS_VAR variable_declaration_no_in JS_IDENTIFIER expression ')' statement
-   * | JS_FOR '(' left_hand_side_expression JS_IDENTIFIER expression ')' statement
-   * | JS_FOR JS_EACH '(' JS_VAR variable_declaration_no_in JS_IN expression ')' statement
-   * | JS_FOR JS_EACH '(' left_hand_side_expression JS_IN expression ')' statement
-   * ;
-   *
-   * array_comprehensions
-   * : array_comprehension_iteration
-   * | array_comprehensions array_comprehension_iteration
-   * ;
-   *
-   * array_comprehension_iteration
-   * : JS_FOR '(' left_hand_side_expression JS_IDENTIFIER expression ')'
-   * ;
-   */
-  ENTER(ForStatement);
-  TokenInfo *token = Advance();
-  int64_t line = token->line_number();
-  bool is_each = false;
-  NodeList *exp_list = new(pool()) NodeList;
-  IterationStmt* iter_stmt = 0;
-  if (token->type() == Token::JS_EACH) {
-    is_each = true;
-    token = Advance();
-  }
-  if (token->type() == '(') {
-    int next_type = Seek()->type();
-    bool is_var_decl = false;
-    int var_decl_len = 0;
-    if (next_type == Token::JS_VAR) {
-      is_var_decl = true;
-      //The array comprehension for expression could not have variable declaration.
-      if (is_comprehensions) {
-        SYNTAX_ERROR("parse error in 'array comprehensions for expression' could not has variable declaration"
-                      "\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(ForStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kFor, line);
-      } else {
-        Advance();
-        AstNode* var_decl = ParseVariableDecl(true);
-        CHECK_ERROR(var_decl);
-        exp_list->AddChild(var_decl);
-        var_decl_len = var_decl->child_length();
-      }
-    } else if (next_type != ';') {
-      AstNode* exp = ParseExpression(true);
-      CHECK_ERROR(exp);
-      if (exp->first_child()->node_type() == AstNode::kLiteral && is_comprehensions) {
-        AstNode* first = exp->first_child();
-        if (first->child_length() == 0) {
-          first->AddChild(new(pool()) Empty);
-        }
-        first->CastToLiteral()->set_value_type(Literal::kVariable);
-        exp_list->AddChild(first);
-      } else {
-        //Empty first for statement condition expression.
-        exp_list->AddChild(exp);
-      }
-    } else {
-      exp_list->AddChild(new(pool()) Empty);
-    }
-    token = Advance();
-    if (next_type == ';' || (token->type() == ';' && is_each == false)) {
-      //In case of normal for statement.
-      if (is_comprehensions) {
-        SYNTAX_ERROR("parse error in 'array comprehensions' allowed 'for in statement' or 'for of statement'"
-                      "\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(ForStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kFor, line);
-      }
-      int iter_type = (is_var_decl)? IterationStmt::kForWithVar : IterationStmt::kFor;
-      iter_stmt = new(pool()) IterationStmt(iter_type, line);
-      ParseForStatementCondition(exp_list);
-      CHECK_ERROR(iter_stmt);
-    } else if (token->type() == Token::JS_IN) {
-      //In case of for in statement.
-      if (var_decl_len > 1) {
-        SYNTAX_ERROR("parse error 'for in statement' could has only one variable declaration."
-                      "\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(ForStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kFor, line);
-      }
-      if (is_var_decl) {
-        AstNode* initialiser = exp_list->first_child()->first_child();
-        exp_list->ReplaceChild(exp_list->first_child(), initialiser);
-      }
-      if (is_each == false) {
-        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForInWithVar : IterationStmt::kForIn;
-        iter_stmt = new(pool()) IterationStmt(iter_type, line);
-      } else {
-        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForEachWithVar : IterationStmt::kForEach;
-        iter_stmt = new(pool()) IterationStmt(iter_type, line);
-      }
-      ParseForInStatementCondition(exp_list);
-      CHECK_ERROR(iter_stmt);
-    } else if (token->type() == Token::JS_IDENTIFIER &&
-                strcmp(TokenConverter(token).cstr(), SymbolList::symbol(SymbolList::kOf)) == 0) {
-      //For of statement's 'of' keyword is treated as identifier not reserved word,
-      //so we check token is valid 'of' identifier or not.
-      if (var_decl_len > 1) {
-        SYNTAX_ERROR("parse error 'for of statement' could has only one variable declaration."
-                      "\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(ForStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kFor, line);
-      }
-      if (is_var_decl) {
-        AstNode* initialiser = exp_list->first_child()->first_child();
-        exp_list->ReplaceChild(exp_list->first_child(), initialiser);
-      }
-      if (is_each == false) {
-        int iter_type = (is_var_decl || is_comprehensions)? IterationStmt::kForOfWithVar : IterationStmt::kForOf;
-        iter_stmt = new(pool()) IterationStmt(iter_type, line);
-      } else {
-        SYNTAX_ERROR("parse error 'for of statement' can not has 'each'."
-                      "\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(ForStatementError);
-        return new(pool()) IterationStmt(IterationStmt::kFor, line);
-      }
-      ParseForInStatementCondition(exp_list);
-      CHECK_ERROR(iter_stmt);
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'for statement conditional expression' expect 'in', 'of' or ';' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(ForStatementError);
-      return new(pool()) IterationStmt(IterationStmt::kFor, line);
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'for statement conditional expression' expect '(' \\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(ForStatementError);
-    return new(pool()) IterationStmt(IterationStmt::kFor, line);
-  }
-  if (!is_comprehensions) {
-    AstNode* body = ParseStatement();
-    CHECK_ERROR(iter_stmt);
-    iter_stmt->AddChild(body);
-  }
-  iter_stmt->set_expression(exp_list);
-  END(ForStatement);
-  return iter_stmt;
-}
-
-
-//Parse for statement condition expression.
-void Parser::ParseForStatementCondition(NodeList* list) {
-  ENTER(ForStatementCondition);
-  if (Seek()->type() == ';') {
-    list->AddChild(new(pool()) Empty);
-  } else {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(;);
-    list->AddChild(exp);
-  }
-  TokenInfo* token = Advance();
-  if (token->type() == ';') {
-    if (Seek()->type() == ')') {
-      list->AddChild(new(pool()) Empty);
-    } else {
-      AstNode* exp = ParseExpression(false);
-      CHECK_ERROR(;)
-          list->AddChild(exp);
-    }
-    token = Advance();
-    if (token->type() != ')') {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'for statement condition end' expect ')' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-    }
-  }
-  END(ForStatementCondition);
-}
-
-
-//Parse for in statement condition expression.
-void Parser::ParseForInStatementCondition(NodeList* list) {
-  ENTER(ForInStatementCondition);
-  AstNode* target_exp = ParseExpression(false);
-  CHECK_ERROR(;);
-  TokenInfo* token = Advance();
-  list->AddChild(target_exp);
-  if (token->type() != ')') {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'for in statement condition end' expect ')' \\nin file "
-                  << filename_ << " at line " << token->line_number());
-  }
-  END(ForInStatementCondition);
-}
-
-
-//Parse continue statement.
-AstNode* Parser::ParseContinueStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * continue_statement
-   * : JS_CONTINUE identifier__opt terminator
-   */
-  ENTER(ContinueStatement);
-  TokenInfo *token = Seek();
-  ContinueStmt* stmt = new(pool()) ContinueStmt(Seek(-1)->line_number());
-  if (token->type() == Token::JS_IDENTIFIER) {
-    AstNode* identifier = ParseLiteral();
-    CHECK_ERROR(stmt);
-    stmt->AddChild(identifier);
-  }
-  ParseTerminator();
-  CHECK_ERROR(stmt);
-  stmt->AddChild(new(pool()) Empty);
-  END(ContinueStatement);
-  return stmt;
-}
-
-
-//Parse break statement.
-AstNode* Parser::ParseBreakStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * : JS_BREAK identifier__opt terminator
-   * ;
-   */
-  ENTER(BreakStatement);
-  TokenInfo *token = Seek();
-  BreakStmt* stmt = new(pool()) BreakStmt(Seek(-1)->line_number());
-  if (token->type() == Token::JS_IDENTIFIER) {
-    AstNode* identifier = ParseLiteral();
-    CHECK_ERROR(stmt);
-    stmt->AddChild(identifier);
-  }
-  ParseTerminator();
-  CHECK_ERROR(stmt);
-  stmt->AddChild(new(pool()) Empty);
-  END(BreakStatement);
-  return stmt;
-}
-
-//Parse return statement.
-AstNode* Parser::ParseReturnStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * return_statement
-   * : JS_RETURN expression__opt terminator
-   * ;
-   */
-  ENTER(ReturnStatement);
-  if (!state_stack_->Has(StateStack::kFunction)) {
-    SYNTAX_ERROR("return statement only allowed in 'function'\\nin file "
-                  << filename_ << " at line " << Seek(-1)->line_number());
-    END(ReturnStatement);
-    return new(pool()) Empty;
-  }
-  bits_.Set(RETURN_FLG);
-  TokenInfo *token = Seek();
-  ReturnStmt* stmt = new(pool()) ReturnStmt(token->line_number());
-  if (token->type() == ';' || token->type() == '}' || token->linebreak_before()) {
-    stmt->AddChild(new(pool()) Empty);
-  } else {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(stmt);
-    stmt->AddChild(exp);
-    ParseTerminator();
-    CHECK_ERROR(exp);
-  }
-  END(ReturnStatement);
-  return stmt;
-}
-
-
-//Parse with statement.
-AstNode* Parser::ParseWithStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * with_statement
-   * : JS_WITH '(' expression ')' statement
-   */
-  ENTER(WithStatement);
-  TokenInfo *token = Advance();
-  WithStmt* stmt = new(pool()) WithStmt(Seek(-1)->line_number());
-  if (token->type() == '(') {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(stmt);
-    stmt->set_expression(exp);
-    token = Advance();
-    if (token->type() == ')') {
-      AstNode* statement = ParseSourceElement();
-      CHECK_ERROR(stmt);
-      stmt->AddChild(statement);
-    } else {
-      SYNTAX_ERROR("parse error unmatched paren"
-                    " in 'with statement expression'\\nin file"
-                    << filename_ << " at line " << token->line_number());
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'with statement expression' expect '('\\nin file"
-                  << filename_ << " at line " << token->line_number());
-  }
-  END(WithStatement);
-  return stmt;
-}
-
-
-//Parse switch statement.
-AstNode* Parser::ParseSwitchStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * switch_statement
-   * : JS_SWITCH '(' expression ')' case_block
-   * ;
-   */
-  ENTER(SwitchStatement);
-  TokenInfo *token = Advance();
-  SwitchStmt* stmt = new(pool()) SwitchStmt(token->line_number());
-  if (token->type() == '(') {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(stmt);
-    stmt->set_expression(exp);
-    token = Advance();
-    if (token->type() == ')') {
-      AstNode* case_block = ParseCaseClauses();
-      CHECK_ERROR(stmt);
-      stmt->Append(case_block);
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'switch statement expression' expect ')'\\nin file"
-                    << filename_ << " at line " << token->line_number());
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'switch statement expression' expect '('\\nin file"
-                  << filename_ << " at line " << token->line_number());
-  }
-  END(SwitchStatement);
-  return stmt;
-}
-
-
-//Parse case clauses
-AstNode* Parser::ParseCaseClauses() {
-  /**
-   * [bison/yacc compat syntax]
-   * case_clauses
-   * : case_clause
-   * | case_clauses case_clause
-   * ;
-   *
-   * case_clause
-   * : JS_CASE expression ':' statement_list__opt
-   * ;
-   *
-   * default_clause
-   * : JS_DEFAULT ':' statement_list__opt
-   * ;
-   */
-  ENTER(CaseClauses);
-  TokenInfo *token = Advance();
-  NodeList *list = new(pool()) NodeList;
-  if (token->type() == '{') {
-    while (token->type() != '}') {
-      token = Advance();
-      bool is_default = token->type() == Token::JS_DEFAULT;
-      if (token->type() == Token::JS_CASE || is_default) {
-        CaseClause* clause = 0;//init after.
-        if (!is_default) {
-          clause = new(pool()) CaseClause(token->line_number());
-          AstNode* exp = ParseExpression(false);
-          CHECK_ERROR(clause);
-          clause->set_expression(exp);
-        } else {
-          clause = new(pool()) CaseClause(token->line_number());
-          clause->set_expression(new(pool()) Empty);
-        }
-        token = Advance();
-        if (token->type() == ':') {
-          token = Seek();
-          if (token->type() == Token::JS_CASE) {
-            clause->AddChild(new(pool()) Empty);
-            list->AddChild(clause);
-          } else {
-            AstNode* statement_list = ParseStatementList(CaseBodyMatcher, "'case','default' or '}'");
-            CHECK_ERROR(clause);
-            clause->Append(statement_list);
-            list->AddChild(clause);
-          }
-        } else {
-          SYNTAX_ERROR("parse error got unexpected token "
-                        << TokenConverter(token).cstr()
-                        << " in 'switch statement case expression' expect ':'\\nin file"
-                        << filename_ << " at line " << token->line_number());
-          END(SwitchStatementError);
-          return list;
-        }
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'switch statement case block' expect 'case'\\nin file"
-                      << filename_ << " at line " << token->line_number());
-        END(SwitchStatementError);
-        return list;
-      }
-      token = Seek();
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'switch statement case block' expect '{'\\nin file"
-                  << filename_ << " at line " << token->line_number());
-    END(SwitchStatementError);
-    return list;
-  }
-  Advance();
-  END(CaseClause);
-  return list;
-}
-
-
-//Parse labelled statement
-AstNode* Parser::ParseLabelledStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * labelled_statement
-   * : JS_IDENTIFIER ':' statement
-   * ;
-   */
-  ENTER(LabelledStatement);
-  TokenInfo* token = Seek(-1);
-  AstNode* ident = ParseLiteral();
-  CHECK_ERROR(ident)
-      Advance();
-  AstNode* statement = ParseStatement();
-  CHECK_ERROR(statement);
-  LabelledStmt* stmt = new(pool()) LabelledStmt(token->line_number());
-  CHECK_ERROR(stmt);
-  stmt->AddChild(ident);
-  stmt->AddChild(statement);
-  END(LabelledStatement);
-  return stmt;
-}
-
-
-//Parse throw statement
-AstNode* Parser::ParseThrowStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * throw_statement
-   * : JS_THROW expression terminator
-   * ;
-   */
-  ENTER(ThrowStatement);
-  TokenInfo* token = Seek(-1);
-  ThrowStmt* throw_stmt = new(pool()) ThrowStmt(token->line_number());
-  AstNode* exp = ParseExpression(false);
-  CHECK_ERROR(throw_stmt);
-  throw_stmt->set_expression(exp);
-  ParseTerminator();
-  CHECK_ERROR(exp);
-  END(ThrowStatement);
-  return throw_stmt;
-}
-
-
-//Parse try statement
-AstNode* Parser::ParseTryStatement() {
-  /**
-   * [bison/yacc compat syntax]
-   * try_statement
-   * : JS_TRY block catch
-   * | JS_TRY block finally
-   * | JS_TRY block catch finally
-   * ;
-   */
-  ENTER(TryStatement);
-  TokenInfo* token = Seek();
-  TryStmt *stmt = new(pool()) TryStmt(token->line_number());
-  if (token->type() == '{') {
-    Advance();
-    AstNode* block = ParseBlockStatement();
-    CHECK_ERROR(stmt);
-    stmt->AddChild(block);
-    token = Seek();
-    if (token->type() == Token::JS_CATCH) {
-      AstNode* catch_block = ParseCatchBlock();
-      CHECK_ERROR(stmt);
-      stmt->set_catch_block(catch_block);
-      token = Seek();
-    } else {
-      stmt->set_catch_block(new(pool()) Empty);
-    }
-    if (token->type() == Token::JS_FINALLY) {
-      Advance();
-      AstNode* finally_block = ParseFinallyBlock();
-      CHECK_ERROR(stmt);
-      stmt->set_finally_block(finally_block);
-    } else {
-      stmt->set_finally_block(new(pool()) Empty);
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'try statement' expect '{'\\nin file"
-                  << filename_ << " at line " << token->line_number());
-  }
-  END(TryStatement);
-  return stmt;
-}
-
-//Parse catch block
-AstNode* Parser::ParseCatchBlock() {
-  ENTER(CatchBlock);
-  TokenInfo *token = Advance(2);
-  if (token->type() == '(') {
-    AstNode* ident = ParseLiteral();
-    CHECK_ERROR(ident);
-    token = Advance();
-    if (token->type() == ')') {
-      token = Seek();
-      if (token->type() != '{') {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'catch block' expect '{'\\nin file"
-                      << filename_ << " at line " << token->line_number());
-      } else {
-        Advance();
-        AstNode* block = ParseBlockStatement();
-        CHECK_ERROR(ident);
-        ident->AddChild(block);
-        END(CatchBlock);
-        return ident;
-      }
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'catch block' expect ')'\\nin file"
-                    << filename_ << " at line " << token->line_number());
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'catch block' expect '('\\nin file"
-                  << filename_ << " at line " << token->line_number());
-  }
-  END(CatchBlockError);
-  return new(pool()) Empty;
-}
-
-
-AstNode* Parser::ParseFinallyBlock() {
-  ENTER(FinallyBlock);
-  TokenInfo *token = Advance();
-  if (token->type() == '{') {
-    state_stack_->Push(StateStack::kFinally);
-    AstNode* block = ParseBlockStatement();
-    state_stack_->Pop();
-    END(FinallyBlock);
-    return block;
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'finally block' expect '{'\\nin file"
-                  << filename_ << " at line " << token->line_number());
-    END(FinallyBlockError);
-    return new(pool()) Empty;
-  }
-}
-
-
-AstNode* Parser::ParseTrait() {
-  ENTER(Trait);
-  TokenInfo* token = Seek();
-  Trait* trait = new(pool()) Trait(token->line_number());
-  if (token->type() == Token::JS_IDENTIFIER) {
-    AstNode* literal = ParseLiteral();
-    CHECK_ERROR(literal);
-    trait->set_name(literal);
-    token = Seek();
-  } else {
-    trait->set_name(new(pool()) Empty);
-  }
-  if (token->type() == '{') {
-    ParseTraitBody(trait);
-    CHECK_ERROR(trait);
-    Advance();
-    return trait;
-  } else {
-    SYNTAX_ERROR("got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'TraitDeclaration' expect '{'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(TraitError);
-    return trait;
-  }
-  END(Trait);
-}
-
-
-void Parser::ParseTraitBody(Trait* trait) {
-  Advance();
-  TokenInfo* token = Seek();
-  while (1) {
-    if (token->type() == Token::JS_IDENTIFIER) {
-      if (strcmp(token->token(), "requires") == 0) {
-        Advance();
-        while (1) {
-          AstNode* ret = ParseLiteral();
-          CHECK_ERROR(;);
-          Literal* val = ret->CastToLiteral();
-          val->set_value_type(Literal::kProperty);
-          token = Seek();
-          trait->set_require(ret);
-          if (token->type() == ',') {
-            Advance();
-          } else {
-            ParseTerminator();
-            CHECK_ERROR(;);
-            break;
-          }
-        }
-      } else if (strcmp(token->token(), "mixin") == 0) {
-        Advance();
-        AstNode* mixin = ParseMixin();
-        CHECK_ERROR(;);
-        trait->set_mixin(mixin);
-      } else {
-        AstNode* ret = ParseFunctionDecl(false);
-        CHECK_ERROR(;);
-        ParseTerminator();
-        CHECK_ERROR(;);
-        TraitMember *member = new(pool()) TraitMember(TraitMember::kPrivate, ret, token->line_number());
-        trait->set_member(member);
-      }
-    } else if (token->type() == Token::JS_PUBLIC) {
-      Advance();
-      AstNode* ret = ParseFunctionDecl(false);
-      CHECK_ERROR(;);
-      ParseTerminator();
-      CHECK_ERROR(;);
-      TraitMember *member = new(pool()) TraitMember(TraitMember::kPublic, ret, token->line_number());
-      trait->set_member(member);
-    } else if (token->type() == Token::JS_PRIVATE) {
-      Advance();
-      AstNode* ret = ParseFunctionDecl(false);
-      CHECK_ERROR(;);
-      ParseTerminator();
-      CHECK_ERROR(;);
-      TraitMember *member = new(pool()) TraitMember(TraitMember::kPrivate, ret, token->line_number());
-      trait->set_member(member);
-    } else {
-      SYNTAX_ERROR("got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'trait declaration'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(TraitBodyError);
-      return;
-    }
-    token = Seek();
-    if (token->type() == '}') {
-      break;
-    }
-  }
-}
-
-
-AstNode* Parser::ParseMixin() {
-  AstNode* literal = ParseLiteral();
-  CHECK_ERROR(literal);
-  MixinMember* mixin = new(pool()) MixinMember(Seek(-1)->line_number());
-  mixin->set_name(literal);
-  TokenInfo* token = Seek();
-  while (1) {
-    if (token->type() == Token::JS_WITH) {
-      Advance();
-      AstNode* before = ParseLiteral();
-      CHECK_ERROR(before);
-      Literal* val = before->CastToLiteral();
-      val->set_value_type(Literal::kProperty);
-      token = Seek();
-      if (token->type() == Token::JS_IDENTIFIER &&
-           strcmp(token->token(), "as") == 0) {
-        Advance();
-        AstNode* after = ParseLiteral();
-        CHECK_ERROR(after);
-        Literal* after_val = after->CastToLiteral();
-        after_val->set_value_type(Literal::kProperty);
-        NodeList* list = new(pool()) NodeList;
-        list->AddChild(before);
-        list->AddChild(after);
-        mixin->set_rename_list(list);
-        token = Seek();
-        if (token->type() == ',') {
-          Advance();
-          token = Seek();
-        } else {
-          ParseTerminator();
-          CHECK_ERROR(mixin);
-          break;
-        }
-      } else {
-        SYNTAX_ERROR("got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'mixin declaration' expect 'as'\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(MixinError);
-        return mixin;
-      }
-    } else if (token->type() == Token::JS_IDENTIFIER &&
-                strcmp(token->token(), "without") == 0) {
-      Advance();
-      AstNode* remove = ParseLiteral();
-      CHECK_ERROR(remove);
-      remove->CastToLiteral()->set_value_type(Literal::kProperty);
-      mixin->set_remove_list(remove);
-      token = Seek();
-      if (token->type() == ',') {
-        Advance();
-        token = Seek();
-      } else {
-        ParseTerminator();
-        CHECK_ERROR(remove);
-        break;
-      }
-    } else {
-      break;
-    }
-  }
-  return mixin;
-}
-
-
-AstNode* Parser::ParseClassDecl(bool is_const) {
-  ENTER(ClassDecl);
-  TokenInfo* token = Seek();
-  AstNode* name;
-  AstNode* inherit;
-  state_stack_->Push(StateStack::kClassDecl);
-  if (token->type() == Token::JS_IDENTIFIER) {
-    name = ParseLiteral();
-    CHECK_ERROR(name);
-  } else {
-    name = new(pool()) Empty;
-  }
-  token = Seek();
-  if (token->type() == Token::JS_EXTENDS ||
-       (token->type() == Token::JS_IDENTIFIER ||
-         strcmp(token->token(), "prototype") == 0)) {
-    inherit = ParseInheritDecl();
-    CHECK_ERROR(inherit);
-  } else {
-    inherit = new(pool()) Empty;
-  }
-  Class *cls = new(pool()) Class(inherit, token->line_number());
-  if (is_const) {
-    cls->MarkAsConstDeclaration();
-  }
-  cls->set_name(name);
-  token = Advance();
-  if (token->type() == '{') {
-    AstNode* body = ParseClassBody();
-    CHECK_ERROR(cls);
-    cls->set_body(body);
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'class declaration' expect '{'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(ClassDecl);
-    state_stack_->Pop();
-    return cls;
-  }
-  END(ClassDecl);
-  state_stack_->Pop();
-  return cls;
-}
-
-
-AstNode* Parser::ParseInheritDecl() {
-  ENTER(InheritDecl);
-  TokenInfo* token = Advance();
-  ClassExpandar* expandar;
-  if (token->type() == Token::JS_EXTENDS) {
-    expandar = new(pool()) ClassExpandar(ClassExpandar::kExtends, token->line_number());
-  } else {
-    expandar = new(pool()) ClassExpandar(ClassExpandar::kPrototype, token->line_number());
-  }
-  AstNode* member = ParseMemberExpression();
-  CHECK_ERROR(member);
-  expandar->AddChild(member);
-  END(InheritDecl);
-  return expandar;
-}
-
-
-AstNode* Parser::ParseClassBody() {
-  ENTER(ClassBody);
-  TokenInfo* token = Seek();
-  if (token->type() == '}') {
-    Advance();
-    END(ClassBody);
-    return new(pool()) Empty;
-  } else {
-    ClassProperties* list = new(pool()) ClassProperties(token->line_number());
-    while (token->type() != '}') {
-      ClassMember* mem = ParseClassMember();
-      CHECK_ERROR(mem);
-      switch (mem->attribute()) {
-        case ClassMember::kPrivate :
-          list->set_private_member(mem);
-          break;
-
-        case ClassMember::kPublic :
-          list->set_public_member(mem);
-          break;
-
-        case ClassMember::kPublicStatic :
-          list->set_public_static_member(mem);
-          break;
-
-        case ClassMember::kPrivateStatic :
-          list->set_private_static_member(mem);
-          break;
-
-        case ClassMember::kPrototype :
-          list->set_prototype_member(mem);
-          break;
-
-        case ClassMember::kConstructor :
-          list->set_constructor(mem);
-          break;
-
-        case ClassMember::kMixin :
-          list->set_mixin_member(mem->first_child());
-          break;
-      }
-      token = Seek();
-    }
-    Advance();
-    END(ClassBody);
-    return list;
-  }
-}
-
-AstNode* Parser::ParseClassMemberStatement() {
-  TokenInfo* token = Seek(-1);
-  if (state_stack_->Has(StateStack::kClassDecl)) {
-    ClassMember::MemberAttr member_type;
-    if (token->type() == Token::JS_PUBLIC) {
-      member_type = ClassMember::kPublic;
-    } else if (token->type() == Token::JS_PRIVATE) {
-      member_type = ClassMember::kPrivate;
-    }
-    AstNode* node = ParseExportableDefinition();
-    CHECK_ERROR(node);
-    ClassMember* member = new(pool()) ClassMember(member_type, token->line_number());
-    member->AddChild(node);
-    return member;
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'member expression' expect '.' or '['\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(MemberExpressionError);
-    return new(pool()) Empty;
-  }
-}
-
-ClassMember* Parser::ParseClassMember() {
-  ENTER(ClassMember);
-  TokenInfo* token = Seek();
-  ClassMember::MemberAttr member_type;
-  AstNode* exp;
-  if (token->type() == Token::JS_IDENTIFIER && strcmp(token->token(), "constructor") == 0) {
-    exp = ParseFunctionDecl(false);
-    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kConstructor, token->line_number()));
-    ParseTerminator();
-    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kConstructor, token->line_number()));
-    exp->CastToExpression()->CastToFunction()->MarkAsDeclaration();
-    member_type = ClassMember::kConstructor;
-  } else if (token->type() == Token::JS_STATIC) {
-    Advance();
-    exp = ParseExportableDefinition();
-    member_type = ClassMember::kPublicStatic;
-  } else if (token->type() == Token::JS_PRIVATE) {
-    Advance();
-    exp = ParseExportableDefinition();
-    member_type = ClassMember::kPrivate;
-  } else if (token->type() == Token::JS_PUBLIC) {
-    Advance();
-    exp = ParseExportableDefinition();
-    member_type = ClassMember::kPublic;
-  } else if (token->type() == Token::JS_IDENTIFIER &&
-              strcmp(token->token(), "mixin") == 0) {
-    Advance();
-    exp = ParseMixin();
-    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kMixin, token->line_number()));
-    ParseTerminator();
-    CHECK_ERROR(new(pool()) ClassMember(ClassMember::kMixin, token->line_number()));
-    member_type = ClassMember::kMixin;
-  } else {
-    exp = ParseExportableDefinition();
-    if (exp->node_type() == AstNode::kClassMember) {
-      return reinterpret_cast<ClassMember*>(exp);
-    }
-    member_type = ClassMember::kPrototype;
-  }
-  ClassMember* member = new(pool()) ClassMember(member_type, token->line_number());
-  member->AddChild(exp);
-  END(ClassMember);
-  return member;
-}
-
-
-AstNode* Parser::ParseExportableDefinition() {
-  ENTER(ExportableDefinition);
-  TokenInfo *token = Seek();
-  if (token->type() == Token::JS_IDENTIFIER || token->type() == '{' || token->type() == '[') {
-    token = Seek(2);
-    if (token->type() == '(' || token->type() == Token::JS_FUNCTION_GLYPH ||
-         token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-      END(ExportableDefinition);
-      AstNode* ret = ParseFunctionDecl(false);
-      CHECK_ERROR(ret);
-      ParseTerminator();
-      CHECK_ERROR(ret);
-      return ret;
-    } else {
-      AstNode* ret = ParseVariableDecl(false);
-      CHECK_ERROR(ret);
-      ParseTerminator();
-      CHECK_ERROR(ret);
-      END(ExportableDefinition);
-      return ret;
-    }
-  } else if (token->type() == Token::JS_CLASS) {
-    Advance();
-    AstNode* class_exp = ParseClassDecl(false);
-    CHECK_ERROR(class_exp);
-    END(ExportableDefinition);
-    return class_exp;
-  } else {
-    if (token->type() == Token::JS_CONST) {
-      token = Seek(2);
-      if (token->type() == Token::JS_CLASS) {
-        END(ExportableDefinition);
-        return ParseClassDecl(true);
-      } else if (token->type() == '(' || token->type() == Token::JS_FUNCTION_GLYPH ||
-                  token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-        Advance();
-        END(ExportableDefinition);
-        AstNode* ret = ParseFunctionDecl(true);
-        CHECK_ERROR(ret);
-        ParseTerminator();
-        CHECK_ERROR(ret);
-        ret->CastToExpression()->CastToFunction()->MarkAsConstDeclaration();
-        return ret;
-      } else {
-        Advance();
-        AstNode* ret = ParseVariableDecl(false);
-        CHECK_ERROR(ret);
-        ParseTerminator();
-        CHECK_ERROR(ret);
-        END(ExportableDefinition);
-        ret->CastToExpression()->CastToVariableDeclarationList()->MarkAsConstDeclaration();
-        return ret;
-      }
-    } else if (token->type() == Token::JS_GET) {
-      AstNode* fn = ParseFunctionDecl(false);
-      CHECK_ERROR(fn);
-      fn->CastToExpression()->CastToFunction()->set_attribute(Function::kGet);
-      END(ExportableDefinition);
-      return fn;
-    } else if (token->type() == Token::JS_SET) {
-      AstNode* fn = ParseFunctionDecl(false);
-      CHECK_ERROR(fn);
-      fn->CastToExpression()->CastToFunction()->set_attribute(Function::kSet);
-      END(ExportableDefinition);
-      return fn;
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'exportable definition' expect 'identifier','const','get' or 'set'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(ExportableDefinitionError);
-      return new(pool()) Empty;
-    }
-  }
-}
-
-
-AstNode* Parser::ParseExpression(bool is_noin) {
-  ENTER(Expression);
-  Expression* exp = new(pool()) Expression(Seek()->line_number());
-  AstNode* assignment = ParseAssignmentExpression(is_noin);
-  CHECK_ERROR(exp);
-  exp->AddChild(assignment);
-  TokenInfo* token = Seek();
-  if (token->type() == ',') {
-    Advance();
-    while (1) {
-      AstNode* assignment = ParseAssignmentExpression(is_noin);
-      CHECK_ERROR(exp);
-      exp->AddChild(assignment);
-      token = Seek();
-      if (token->type() == ',') {
-        token = Advance();
-      } else {
-        break;
-      }
-    }
-  }
-  END(Expression);
-  return exp;
-}
-
-bool IsAssignmentOp(int type) {
-  return type == '=' || type == Token::JS_MUL_LET ||
-      type == Token::JS_DIV_LET || type == Token::JS_MOD_LET ||
-      type == Token::JS_ADD_LET || type == Token::JS_SUB_LET ||
-      type == Token::JS_SHIFT_LEFT_LET || type == Token::JS_SHIFT_RIGHT_LET ||
-      type == Token::JS_U_SHIFT_RIGHT_LET || type == Token::JS_AND_LET ||
-      type == Token::JS_NOT_LET || type == Token::JS_OR_LET;
-}
-
-AstNode* Parser::ParseAssignmentExpression(bool is_noin) {
-  ENTER(AssignmentExpression);
-  AstNode* exp = ParseYieldExpression(is_noin);
-  CHECK_ERROR(exp);
-  TokenInfo *token = Seek();
-  if (IsAssignmentOp(token->type())) {
-    Advance();
-    if (exp->CastToExpression() && exp->CastToExpression()->IsValidLhs()) {
-      if (exp->CastToExpression()->IsParenthesis() && exp->child_length() > 0) {
-        AstNode* tmp = exp->last_child();
-        while (tmp->node_type() == AstNode::kExpression) {
-          tmp = tmp->first_child();
-          if (tmp->node_type() == AstNode::kExpression && tmp->child_length() > 1) {
-            SYNTAX_ERROR("invalid left hand side\\nin file "
-                          << filename_ << " at line " << token->line_number());
-            END(AssignmentExpressionError);
-            return exp;
-          }
-        }
-        if (tmp->node_type() == AstNode::kArrayLikeLiteral ||
-             tmp->node_type() == AstNode::kObjectLikeLiteral) {
-          exp = tmp;
-        }
-      }
-      exp->CastToExpression()->MarkAsLhs();
-      AstNode* rhs = ParseAssignmentExpression(is_noin);
-      CHECK_ERROR(rhs);
-      AssignmentExp* assign_exp = new(pool()) AssignmentExp(token->type(), exp, rhs, rhs->line_number());
-      return assign_exp;
-    } else {
-      SYNTAX_ERROR("parse error invalid left hand side expression in 'assignment expression'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(AssignmentExpressionError);
-      return new(pool()) Empty;
-    }
-  }
-  END(AssignmentExpression);
-  return exp;
-}
-
-AstNode* Parser::ParseYieldExpression(bool is_noin) {
-  ENTER(YieldExpression);
-  TokenInfo* token = Seek();
-  if (token->type() == Token::JS_YIELD) {
-    if (state_stack_->Has(StateStack::kFinally)) {
-      SYNTAX_ERROR("yield statement not allowed in 'finally block'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(YieldExpressionError);
-      return new(pool()) Empty;
-    }
-    if (!state_stack_->Has(StateStack::kFunction)) {
-      SYNTAX_ERROR("yield statement only allowed in 'function'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(YieldExpressionError);
-      return new(pool()) Empty;
-    }
-    bits_.Set(YIELD_FLG);
-    Advance();
-    token = Seek();
-    if (token->linebreak_after() || token->type() == ';' || token->type() == '}') {
-      if (token->type() == ';') {
-        Advance();
-      }
-      YieldExp* exp = new(pool()) YieldExp(token->line_number());
-      exp->AddChild(new(pool()) Empty);
-      END(YieldExpression);
-      return exp;
-    } else {
-      YieldExp* exp = new(pool()) YieldExp(token->line_number());
-      AstNode* assignment = ParseAssignmentExpression(false);
-      CHECK_ERROR(exp);
-      exp->AddChild(assignment);
-      END(YieldExpression);
-      return exp;
-    }
-  } else {
-    END(YieldExpression);
-    return ParseConditional(is_noin);
-  }
-}
-
-AstNode* Parser::ParseConditional(bool is_noin) {
-  ENTER(Conditional);
-  AstNode* exp = ParseBinaryExpression(is_noin);
-  CHECK_ERROR(exp);
-  TokenInfo* token = Seek();
-  if (token->type() == '?') {
-    Advance();
-    AstNode* left = ParseAssignmentExpression(is_noin);
-    CHECK_ERROR(exp);
-    token = Seek();
-    if (token->type() == ':') {
-      Advance();
-      AstNode* right = ParseAssignmentExpression(is_noin);
-      CHECK_ERROR(exp);
-      ConditionalExp* cond = new(pool()) ConditionalExp(exp, left, right, token->line_number());
-      END(Conditional);
-      cond->MarkAsInValidLhs();
-      return cond;
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'conditional expression' expect ':'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(ConditionalError);
-      return new(pool()) Empty;
-    }
-  } else {
-    END(Conditional);
-    return exp;
-  }
-}
-
-
-AstNode* Parser::ParseBinaryExpression(bool is_noin) {
-  ENTER(BinaryExpression);
-  AstNode* last = 0;
-  AstNode* first = 0;
-  AstNode* lhs = ParseUnaryExpression();
-  AstNode* exp = 0;
-  CHECK_ERROR(lhs);
-  while (1) {
-    TokenInfo* token = Seek();
-    switch (token->type()) {
-      case Token::JS_LOGICAL_AND :
-      case Token::JS_LOGICAL_OR :
-      case Token::JS_EQUAL :
-      case Token::JS_NOT_EQUAL :
-      case Token::JS_EQ :
-      case Token::JS_NOT_EQ :
-      case Token::JS_LESS_EQUAL :
-      case Token::JS_GREATER_EQUAL :
-      case Token::JS_INSTANCEOF :
-      case '<' :
-      case '>' : {
-        Advance();
-        AstNode* rhs = ParseUnaryExpression();
-        CHECK_ERROR(rhs);
-        if (last == 0) {
-          exp = new(pool()) CompareExp(token->type(), lhs, rhs, token->line_number());
-          first = exp;
-        } else {
-          exp = new(pool()) CompareExp(token->type(), last, rhs, token->line_number());
-        }
-        exp->CastToExpression()->MarkAsInValidLhs();
-        last = exp;
-      }
-        break;
-
-      case Token::JS_IN : {
-        if (!is_noin) {
-          Advance();
-          AstNode* rhs = ParseUnaryExpression();
-          CHECK_ERROR(rhs);
-          if (last == 0) {
-            exp = new(pool()) CompareExp(token->type(), lhs, rhs, token->line_number());
-            first = exp;
-          } else {
-            exp = new(pool()) CompareExp(token->type(), last, rhs, token->line_number());
-          }
-          exp->CastToExpression()->MarkAsInValidLhs();
-          last = exp;
-        } else {
-          END(BinaryExpressionNoIn);
-          return (first == 0)? lhs : exp;
-        }
-      }
-        break;
-
-      case '|' :
-      case '^' :
-      case '&' :
-      case '+' :
-      case '-' :
-      case '*' :
-      case '/' :
-      case '%' :
-      case Token::JS_SHIFT_LEFT :
-      case Token::JS_SHIFT_RIGHT :
-      case Token::JS_U_SHIFT_RIGHT :{
-        Advance();
-        AstNode* rhs = ParseUnaryExpression();
-        CHECK_ERROR(rhs);
-        if (last == 0) {
-          exp = new(pool()) BinaryExp(token->type(), lhs, rhs, token->line_number());
-          first = exp;
-        } else {
-          exp = new(pool()) BinaryExp(token->type(), last, rhs, token->line_number());
-        }
-        exp->CastToExpression()->MarkAsInValidLhs();
-        last = exp;
-      }
-        break;
-
-      default :
-        END(BinaryExpression);
-        return (exp == 0)? lhs : exp;
-    }
-  }
-}
-
-
-
-bool IsUnaryOp(int type) {
-  return type == Token::JS_DELETE || type == Token::JS_VOID ||
-      type == Token::JS_TYPEOF || type == Token::JS_INCREMENT ||
-      type == Token::JS_DECREMENT || type == '+' ||
-      type == '-' || type == '~' || type == '!';
-}
-
-
-AstNode* Parser::ParseUnaryExpression() {
-  ENTER(UnaryExpression);
-  TokenInfo* token = Seek();
-  if (IsUnaryOp(token->type())) {
-    Advance();
-    AstNode* post_exp = ParseUnaryExpression();
-    CHECK_ERROR(post_exp);
-    post_exp->CastToExpression()->MarkAsInValidLhs();
-    UnaryExp* unary = new(pool()) UnaryExp(token->type(), post_exp, token->line_number());
-    post_exp->CastToExpression()->MarkAsUnary();
-    END(UnaryExpression);
-    return unary;
-  } else {
-    END(UnaryExpression);
-    return ParsePostfixExpression();
-  }
-}
-
-
-AstNode* Parser::ParsePostfixExpression() {
-  ENTER(PostfixExpression);
-  AstNode* lhs = ParseLeftHandSideExpression();
-  CHECK_ERROR(lhs);
-  TokenInfo *token = Seek();
-  if (!token->linebreak_before() && (token->type() == Token::JS_INCREMENT || token->type() == Token::JS_DECREMENT)) {
-    lhs->CastToExpression()->MarkAsInValidLhs();
-    PostfixExp* post = new(pool()) PostfixExp(token->type(), lhs, token->line_number());
-    Advance();
-    END(PostfixExpression);
-    return post;
-  }
-  END(PostfixExpression);
-  return lhs;
-}
-
-
-AstNode* Parser::ParseLeftHandSideExpression() {
-  ENTER(LeftHandSideExpression);
-  TokenInfo *token = Seek();
-  AstNode* node;
-  if (token->type() == Token::JS_NEW) {
-    node = ParseNewExpression();
-    node->CastToExpression()->MarkAsInValidLhs();
-  } else {
-    node = ParseCallExpression();
-  }
-  END(LeftHandSide);
-  return node;
-}
-
-NewExp* Parser::ParseNewExpression() {
-  ENTER(NewExpression);
-  Advance();
-  TokenInfo* token = Seek();
-  NewExp* exp = new(pool()) NewExp(token->line_number());
-  NewExp* first = exp;
-  while (token->type() == Token::JS_NEW) {
-    Advance();
-    NewExp *next = new(pool()) NewExp(token->line_number());
-    exp->AddChild(next);
-    exp = next;
-    token = Seek();
-  }
-  AstNode* member = ParseCallExpression();
-  CHECK_ERROR(exp);
-  exp->AddChild(member);
-  END(NewExpression);
-  return first;
-}
-
-AstNode* Parser::ParseCallExpression() {
-  ENTER(CallExpression);
-  AstNode* member = ParseMemberExpression();
-  CHECK_ERROR(member);
-  TokenInfo* token = Seek();
-  if (token->type() == '(') {
-    Advance();
-    AstNode* arguments = ParseArguments();
-    CHECK_ERROR(arguments);
-    token = Advance();
-    if (token->type() != ')') {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'call expression' expect ')'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-    }
-    token = Seek();
-    bool is_function_decl = (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT);
-    Literal* symbol = member->CastToLiteral();
-    if (symbol && symbol->value_type() == Literal::kIdentifier && is_function_decl) {
-      Advance();
-      AstNode* fn = ParseArrowFunctionExpression(member, arguments, token->type());
-      CHECK_ERROR(fn);
-      END(ParseCallExpression_);
-      return fn;
-    } else if (is_function_decl) {
-      SYNTAX_ERROR("parse error arrow function expression name must be 'identifier'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-    }
-    CallExp* exp = new(pool()) CallExp(CallExp::kNormal, token->line_number());
-    exp->set_callable(member);
-    exp->set_args(arguments);
-    token = Seek();
-    if (token->type() == '.' || token->type() == '[' || token->type() == '(') {
-      if (token->type() != '(') {
-        exp = ParseEachMember(token->type(), true, exp);
-      }
-      token = Seek();
-      while (1) {
-        CallExp* ret = 0;
-        if (token->type() != '(') {
-          ret = ParseEachMember(token->type(), false, exp);
-        } else if (token->type() == '(') {
-          Advance();
-          AstNode* arguments = ParseArguments();
-          CHECK_ERROR(arguments);
-          token = Advance();
-          if (token->type() != ')') {
-            SYNTAX_ERROR("parse error got unexpected token "
-                          << TokenConverter(token).cstr()
-                          << " in 'call expression' expect ')'\\nin file "
-                          << filename_ << " at line " << token->line_number());
-            END(CallExpressionError);
-            return exp;
-          }
-          ret = new(pool()) CallExp(CallExp::kNormal, token->line_number());
-          ret->set_callable(exp);
-          ret->MarkAsInValidLhs();
-          if (arguments->child_length() == 0) {
-            ret->set_args(new(pool()) Empty);
-          } else {
-            ret->set_args(arguments);
-          }
-        }
-        if (ret == 0) {
-          END(CallExpression);
-          return exp;
-        } else {
-          exp = ret;
-        }
-        token = Seek();
-      }
-      END(CallExpression);
-      return exp;
-    } else if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-      Advance();
-      END(CallExpression);
-      return ParseArrowFunctionExpression(member, arguments, token->type());
-    } else {
-      END(CallExpression);
-      exp->CastToExpression()->MarkAsInValidLhs();
-      return exp;
-    }
-  } else {
-    END(CallExpression);
-    return member;
-  }
-}
-
-
-AstNode* Parser::ParseArguments() {
-  ENTER(Arguments);
-  TokenInfo* token = Seek();
-  NodeList* list = new(pool()) NodeList;
-  if (token->type() != ')') {
-    while (token->type() != ')') {
-      if (token->type() == Token::JS_PARAMETER_REST) {
-        Advance();
-        token = Seek();
-        if (token->type() == Token::JS_IDENTIFIER) {
-          AstNode* value = ParseLiteral();
-          CHECK_ERROR(list);
-          value->CastToLiteral()->set_value_type(Literal::kSpread);
-          list->AddChild(value);
-        } else {
-          SYNTAX_ERROR("parse error got unexpected token "
-                        << TokenConverter(token).cstr()
-                        << " in 'formal parameter rest or arguments spread' expect 'identifier'\\nin file "
-                        << filename_ << " at line " << token->line_number());
-          END(FormalParameterErrror);
-          return list;
-        }
-      } else {
-        AstNode* exp = ParseAssignmentExpression(false);
-        CHECK_ERROR(list);
-        list->AddChild(exp);
-      }
-      token = Seek();
-      if (token->type() == ',') {
-        Advance();
-        token = Seek();
-      }
-    }
-    END(Arguments);
-    return list;
-  } else {
-    END(Arguments);
-    return new(pool()) Empty;
-  }
-}
-
-
-AstNode* Parser::ParseMemberExpression() {
-  ENTER(MemberExpression);
-  TokenInfo* token = Seek();
-  CallExp* exp;
-  if (token->type() == Token::JS_PRIVATE) {
-    TokenInfo* pr_sym = token;
-    Literal* private_literal = new(pool()) Literal(Literal::kProperty, token->line_number());
-    private_literal->set_value(pr_sym);
-    private_literal->MarkAsInValidLhs();
-    Advance();
-    token = Seek();
-    if (token->type() != '.' && token->type() != '[') {
-      END(MemberExpression);
-      private_literal->set_value_type(Literal::kPrivate);
-      return private_literal;
-    }
-    exp = new(pool()) CallExp(CallExp::kPrivate, token->line_number());
-    exp->set_callable(private_literal);
-    ParseEachMember(token->type(), true, exp);
-    token = Seek();
-  } else {
-    AstNode *primary = ParsePrimaryExpression();
-    CHECK_ERROR(primary);
-    token = Seek();
-    if (token->type() != '.' && token->type() != '[') {
-      END(MemberExpression);
-      return primary;
-    }
-    int call_type = (token->type() == '.')? CallExp::kDot : CallExp::kBracket;
-    exp = new(pool()) CallExp(call_type, token->line_number());
-    exp->set_callable(primary);
-    ParseEachMember(token->type(), true, exp);
-    token = Seek();
-  }
-  while (1) {
-    CallExp* ret = ParseEachMember(token->type(), false, exp);
-    if (ret == 0) {
-      END(MemberExpression);
-      return exp;
-    } else {
-      exp = ret;
-    }
-    token = Seek();
-  }
-  END(MemberExpression);
-  return exp;
-}
-
-
-AstNode* Parser::ParseBracketMember() {
-  ENTER(BracketMember);
-  Advance();
-  AstNode* node = ParseExpression(false);
-  CHECK_ERROR(node);
-  TokenInfo* token = Advance();
-  if (token->type() != ']') {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'member expression' expect ']'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(BracketMemberError);
-    return node;
-  }
-  END(BracketMember);
-  return node;
-}
-
-
-AstNode* Parser::ParseDotMember(bool *is_extend) {
-  ENTER(DotMember);
-  TokenInfo* token = Seek();
-  int extend_type = Seek(2)->type();
-  if (extend_type == '{') {
-    *is_extend = true;
-    Advance(2);
-    AstNode* node = ParseObjectLiteral();
-    CHECK_ERROR(node);
-    return node;
-  } else {
-    Advance();
-    AstNode* node = ParseLiteral();
-    CHECK_ERROR(node);
-    Literal* maybe_ident = node->CastToLiteral();
-    if (!maybe_ident || maybe_ident->value_type() != Literal::kIdentifier) {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'member expression' expect 'identifier'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(DotMemberError);
-      return node;
-    } else if (maybe_ident->value_type() == Literal::kIdentifier) {
-      maybe_ident->set_value_type(Literal::kProperty);
-    }
-    END(DotMember);
-    return node;
-  }
-}
-
-
-CallExp* Parser::ParseEachMember(int type, bool is_first, CallExp* exp) {
-  ENTER(EachMember);
-  int64_t line = Seek(-1)->line_number();
-  if (type == '[') {
-    AstNode* node = ParseBracketMember();
-    CHECK_ERROR(exp);
-    if (is_first) {
-      if (exp->call_type() == CallExp::kNormal) {
-        CallExp* accessor = new(pool()) CallExp(CallExp::kBracket, line);
-        accessor->set_callable(exp);
-        accessor->set_args(node);
-        return accessor;
-      } else {
-        exp->set_args(node);
-        END(EachMember);
-        return exp;
-      }
-    } else {
-      CallExp* accessor = new(pool()) CallExp(CallExp::kBracket, line);
-      accessor->set_callable(exp);
-      accessor->set_args(node);
-      END(EachMember);
-      return accessor;
-    }
-  } else if (type == '.') {
-    bool is_extend = false;
-    AstNode* node = ParseDotMember(&is_extend);
-    CHECK_ERROR(exp);
-    if (is_first) {
-      if (exp->call_type() == CallExp::kNormal) {
-        int type = (is_extend)? CallExp::kExtend : CallExp::kDot;
-        CallExp* accessor = new(pool()) CallExp(type, line);
-        accessor->set_callable(exp);
-        accessor->set_args(node);
-        return accessor;
-      } else {
-        exp->set_args(node);
-        END(EachMember);
-        return exp;
-      }
-    } else {
-      int type = (is_extend)? CallExp::kExtend : CallExp::kDot;
-      CallExp* accessor = new(pool()) CallExp(type, line);
-      accessor->set_callable(exp);
-      accessor->set_args(node);
-      END(EachMember);
-      return accessor;
-    }
-  } else {
-    END(EachMember);
-    return 0;
-  }
-}
-
-
-AstNode* Parser::ParsePrimaryExpression() {
-  ENTER(PrimaryExpression);
-  TokenInfo* token = Advance();
-  TokenInfo* function_signature = Seek();
-  if (token->type() == Token::JS_FUNCTION) {
-    AstNode* fn = ParseFunctionDecl(false);
-    CHECK_ERROR(fn);
-    fn->CastToExpression()->MarkAsInValidLhs();
-    END(MemberExpression);
-    return fn;
-  } else if (token->type() == Token::JS_CLASS) {
-    AstNode* class_exp = ParseClassDecl(false);
-    CHECK_ERROR(class_exp);
-    class_exp->CastToExpression()->MarkAsInValidLhs();
-    return class_exp;
-  } else if (token->type() == Token::JS_IDENTIFIER && strcmp(token->token(), "trait") == 0 &&
-              (Seek()->type()  == '{' || Seek(2)->type() == '{')) {
-    AstNode* trait = ParseTrait();
-    CHECK_ERROR(trait);
-    return trait;
-  } else if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    AstNode* fn = ParseArrowFunctionExpression(token->type());
-    CHECK_ERROR(fn);
-    fn->CastToExpression()->MarkAsInValidLhs();
-    END(MemberExpression);
-    return fn;
-  } else if (token->type() == Token::JS_IDENTIFIER && (function_signature->type() == Token::JS_FUNCTION_GLYPH ||
-                                                         function_signature->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT)) {
-    Undo();
-    END(MemberExpression);
-    return ParseFunctionDecl(false);
-  } else if (token->type() == '{') {
-    END(PrimaryExpression);
-    return ParseObjectLiteral();
-  } else if (token->type() == '[') {
-    END(PrimaryExpression);
-    return ParseArrayLiteral();
-  } else if (token->type() == '(') {
-    AstNode* exp = ParseExpression(false);
-    CHECK_ERROR(exp);
-    if (exp->child_length() > 1) {
-      exp->CastToExpression()->MarkAsInValidLhs();
-    }
-    token = Seek();
-    if (token->type() == ')') {
-      Advance();
-      token = Seek();
-      Expression *expression = exp->CastToExpression();
-      expression->MarkParenthesis();
-    } else if (token->type() == Token::JS_FOR) {
-      AstNode* generator = ParseGeneratorExpression(exp);
-      CHECK_ERROR(generator);
-      token = Advance();
-      if (token->type() != ')') {
-        SYNTAX_ERROR("unmatched parensis\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        return generator;
-      }
-      return generator;
-    } else {
-      SYNTAX_ERROR("parse error unmatched parensis\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      return exp;
-    }
-    if (token->type() == Token::JS_FUNCTION_GLYPH || token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-      Advance();
-      END(PrimaryExpression);
-      AstNode* ret = ParseArrowFunctionExpression(exp, token->type());
-      CHECK_ERROR(ret);
-      ret->CastToExpression()->MarkAsInValidLhs();
-      return ret;
-    } else {
-      END(PrimaryExpression);
-      return exp;
-    }
-  } else if (token->type() == '#') {
-    token = Advance();
-    if (token->type() == '[') {
-      AstNode* elem = ParseArrayLiteral();
-      CHECK_ERROR(elem);
-      elem->CastToExpression()->MarkAsInValidLhs();
-      elem->CastToExpression()->CastToArrayLikeLiteral()->MarkAsTuple();
-      return elem;
-    } else if (token->type() == '{') {
-      AstNode* elem = ParseObjectLiteral();
-      CHECK_ERROR(elem);
-      elem->CastToExpression()->MarkAsInValidLhs();
-      elem->CastToExpression()->CastToObjectLikeLiteral()->MarkAsRecord();
-      return elem;
-    } else {
-      SYNTAX_ERROR("got unexpected token "
-                    << TokenConverter(token).cstr() <<
-                    " expect '[' \\nin file "
-                    << filename_ << " at line " << token->line_number());
-      return new(pool()) Empty;
-    }
-  } else if (token->type() == Token::JS_FUNCTION_GLYPH ||
-              token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    AstNode* fn = ParseArrowFunctionExpression(token->type());
-    END(PrimaryExpression);
-    fn->CastToExpression()->MarkAsInValidLhs();
-    return fn;
-  } else if (token->type() == Token::JS_DO) {
-    AstNode* ret = ParseDoWhileStatement(true);
-    CHECK_ERROR(ret);
-    return ret;
-  } else {
-    Undo();
-    END(PrimaryExpression);
-    return ParseLiteral();
-  }
-}
-
-
-AstNode* Parser::ParseGeneratorExpression(AstNode* exp) {
-  AstNode* node = ParseArrayComprehensions();
-  CHECK_ERROR(node);
-  GeneratorExpression* generator = new(pool()) GeneratorExpression(exp, Seek(-1)->line_number());
-  generator->AddChild(node);
-  return generator;
-}
-
-
-AstNode* Parser::ParseObjectLiteral() {
-  ENTER(ObjectLiteral);
-  TokenInfo* token = Seek();
-  int maybe_colon = Seek(2)->type();
-  ObjectLikeLiteral* object = new(pool()) ObjectLikeLiteral(token->line_number());
-  if (token->type() != '}') {
-    while (1) {
-      if (maybe_colon == '}') {
-        AstNode* node = ParseObjectElement(token->type(), token, object);
-        CHECK_ERROR(node);
-        node->AddChild(node->Clone(pool()));
-        break;
-      } else if (maybe_colon == ',') {
-        AstNode* node = ParseObjectElement(token->type(), token, object);
-        CHECK_ERROR(object);
-        node->AddChild(node->Clone(pool()));
-        token = Seek();
-      } else if (maybe_colon == ':') {
-        AstNode* node = ParseLiteral();
-        CHECK_ERROR(node);
-        Literal* prop = node->CastToLiteral();
-        if (prop->value_type() == Literal::kIdentifier) {
-          prop->set_value_type(Literal::kProperty);
-        }
-        Advance();
-        token = Seek();
-        AstNode* assign;
-        if (token->type() == '{' || token->type() == '[') {
-          assign = ParseAssignmentExpression(false);
-        } else {
-          assign = ParseAssignmentExpression(false);
-          if (assign->CastToLiteral()) {
-            Literal* literal = assign->CastToLiteral();
-            if (literal->value_type() != Literal::kIdentifier) {
-              object->MarkAsInValidLhs();
-            }
-          } else {
-            object->MarkAsInValidLhs();
-          }
-        }
-        CHECK_ERROR(assign);
-        node->AddChild(assign);
-        object->set_element(node);
-        token = Seek();
-      } else if (token->type() == '[') {
-        AstNode* node = ParseObjectElement(token->type(), token, object);
-        CHECK_ERROR(node);
-        token = Advance();
-        if (token->type() == ':') {
-          AstNode* assign;
-          token = Seek();
-          if (token->type() == '{') {
-            Advance();
-            assign = ParseObjectLiteral();
-          } else {
-            assign = ParseAssignmentExpression(false);
-          }
-          CHECK_ERROR(assign);
-          node->AddChild(assign);
-          token = Seek();
-        }
-      } else if (maybe_colon == '(' || maybe_colon == Token::JS_FUNCTION_GLYPH ||
-                  maybe_colon == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-        AstNode* fn = ParseFunctionDecl(false);
-        CHECK_ERROR(fn);
-        Literal* val = fn->CastToExpression()->CastToFunction()->name()->Clone(pool())->CastToLiteral();
-        val->set_value_type(Literal::kProperty);
-        fn->CastToExpression()->CastToFunction()->set_name(new(pool()) Empty);
-        val->AddChild(fn);
-        object->set_element(val);
-        val->set_value_type(Literal::kProperty);
-        token = Seek();
-        object->MarkAsInValidLhs();
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << ". In 'object literal'\\n"
-                      << filename_ << " at line " << token->line_number());
-        END(ObjectLiteralError);
-        return object;
-      }
-      if (token->type() == ',') {
-        Advance();
-      } else if (token->type() == '}') {
-        Advance();
-        break;
-      }
-      token = Seek();
-      maybe_colon = Seek(2)->type();
-    }
-  } else {
-    Advance();
-  }
-  END(ObjectLiteral);
-  return object;
-}
-
-
-
-AstNode* Parser::ParseObjectElement(int type, TokenInfo* token, ObjectLikeLiteral* list) {
-  ENTER(ObjectElement);
-  if (IsValidPropertyName(type)) {
-    AstNode* node = ParseLiteral();
-    CHECK_ERROR(node);
-    Advance();
-    list->set_element(node);
-    END(ObjectElement);
-    Literal* name = node->CastToLiteral();
-    if (name->value_type() == Literal::kIdentifier) {
-      name->set_value_type(Literal::kProperty);
-    }
-    return node;
-  } else if (type == '[') {
-    Advance();
-    AstNode* node = ParseAssignmentExpression(true);
-    TokenInfo* token = Seek();
-    if (token->type() != ']') {
-      SYNTAX_ERROR("in 'object literal private property' expect ']' but got " << TokenConverter(token).cstr()
-                    << "\\nin file " << filename_ << " at line " << token->line_number());
-      END(ObjectElementError);
-      return node;
-    } else {
-      Advance();
-      Literal* value = new(pool()) Literal(Literal::kPrivateProperty, token->line_number());
-      value->set_node(node);
-      list->set_element(value);
-      list->MarkAsInValidLhs();
-      return value;
-    }
-  } else {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << ". In 'object literal'"
-                  " member only allowed 'string literal','number' or 'identifier'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(ObjectElementError);
-    return new(pool()) Empty;
-  }
-}
-
-
-AstNode* Parser::ParseArrayLiteral() {
-  ENTER(ArrayLiteral);
-  ArrayLikeLiteral* array = new(pool()) ArrayLikeLiteral(Seek(-1)->line_number());
-  TokenInfo* token = Seek();
-  int count = 0;
-  if (token->type() == ']') {
-    Advance();
-    END(ArrayLiteral);
-    return array;
-  } else {
-    while (1) {
-      if (token->type() == ',') {
-        array->set_element(new(pool()) Empty);
-        int last_type = Seek(-1)->type();
-        token = Advance();
-        if (token->type() == ']') {
-          Advance();
-          if (last_type == '[') {
-            array->set_element(new(pool()) Empty);
-          }
-          break;
-        }
-      } else if (token->type() == Token::JS_PARAMETER_REST) {
-        token = Advance(2);
-        if (token->type() == Token::JS_IDENTIFIER) {
-          Literal* rest = new(pool()) Literal(Literal::kRest, token->line_number());
-          rest->set_value(token);
-          array->set_element(rest);
-          token = Seek();
-          if (token->type() == ']') {
-            Advance();
-            break;
-          }
-        } else {
-          SYNTAX_ERROR("unexpected token "
-                        << TokenConverter(token).cstr()
-                        << " expect 'identifier' in 'rest expression'\\nin file "
-                        << filename_ << " at line " << token->line_number());
-          END(ArrayLiteralError);
-          return array;
-        }
-      } else {
-        AstNode* node = ParseAssignmentExpression(false);
-        CHECK_ERROR(node);
-        array->set_element(node);
-        token = Seek();
-        if (token->type() == Token::JS_FOR) {
-          if (count > 0) {
-            SYNTAX_ERROR("parse error got unexpected token "
-                          << TokenConverter(token).cstr()
-                          << " in 'array comprehensions expect' 'assignment expression'\\nin file "
-                          << filename_ << " at line " << token->line_number());
-            END(ArrayLiteralError);
-            return array;
-          }
-          AstNode* cmp_node = ParseArrayComprehensions();
-          CHECK_ERROR(cmp_node);
-          array->elements()->RemoveChild(node);
-          NodeList* children = new(pool()) NodeList;
-          children->AddChild(node);
-          children->AddChild(cmp_node);
-          array->set_element(children);
-          array->MarkAsComprehensions();
-          token = Seek();
-          if (token->type() != ']') {
-            SYNTAX_ERROR("parse error got unexpected token "
-                          << TokenConverter(token).cstr()
-                          << " in 'array comprehensions expect' ']'\\nin file "
-                          << filename_ << " at line " << token->line_number());
-            END(ArrayLiteralError);
-            return array;
-          } else {
-            Advance();
-          }
-          END(ArrayLiteral);
-          return array;
-        } else if (token->type() == ',') {
-          Advance();
-          token = Seek();
-        } else if (token->type() == ']') {
-          Advance();
-          break;
-        }
-      }
-      count++;
-    }
-  }
-  END(ArrayLiteral);
-  return array;
-}
-
-
-AstNode* Parser::ParseLiteral() {
-  ENTER(Literal);
-  TokenInfo* token = Advance();
-  int value_type = 0;
-  bool is_invalid_lhs = false;
-  switch (token->type()) {
-    case Token::JS_NAN :
-      value_type = Literal::kNaN;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_SUPER :
-      value_type = Literal::kSuper;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_THIS :
-      value_type = Literal::kThis;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_IDENTIFIER : {
-      value_type = Literal::kIdentifier;
-      const char* ident = token->token();
-      int len = strlen(ident);
-      if (ident[ 0 ] == '@') {
-        Literal* this_sym = builder()->CreateNameNode(SymbolList::symbol(SymbolList::kThis),
-                                                      Token::JS_THIS, token->line_number(), Literal::kThis);
-        if (len > 1) {
-          Literal* value = builder()->CreateNameNode(&ident[ 1 ], Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
-          CallExp* this_accessor = builder()->CreateDotAccessor(this_sym, value, this_sym->line_number());
-          return this_accessor;
-        } else {
-          return this_sym;
-        }
-      } else if (len > 1 && ident[ 0 ] == '_' && ident[ 1 ] == '@') {
-        Literal* private_sym = builder()->CreateNameNode(JsToken::GetTokenFromNumber(Token::JS_PRIVATE),
-                                                         Token::JS_PRIVATE, token->line_number(), Literal::kPrivate);
-        if (len > 2) {
-          Literal* value = builder()->CreateNameNode(&ident[ 2 ], Token::JS_IDENTIFIER, token->line_number(), Literal::kProperty);
-          CallExp* private_accessor = new(pool()) CallExp(CallExp::kPrivate, token->line_number());
-          private_accessor->set_callable(private_sym);
-          private_accessor->set_args(value);
-          return private_accessor;
-        } else {
-          return private_sym;
-        }
-      }
-    }
-      break;
-
-    case Token::JS_PARAMETER_REST : {
-      token = Seek();
-      if (token->type() == Token::JS_IDENTIFIER) {
-        AstNode* value = ParseLiteral();
-        CHECK_ERROR(value);
-        value->CastToLiteral()->set_value_type(Literal::kRest);
-        return value;
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                     << TokenConverter(token).cstr()
-                     << " in 'formal parameter rest' expect 'identifier'\\nin file "
-                     << filename_ << " at line " << token->line_number());
-        END(FormalParameterErrror);
-      }
-    }
-      break;
-
-    case Token::JS_TRUE :
-      value_type = Literal::kTrue;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_FALSE :
-      value_type = Literal::kFalse;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_NUMERIC_LITERAL :
-      value_type = Literal::kNumeric;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_STRING_LITERAL :
-      value_type = Literal::kString;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_REGEXP_LITERAL :
-      value_type = Literal::kRegExp;
-      is_invalid_lhs = true;
-      break;
-
-    case Token::JS_K_NULL :
-      value_type = Literal::kNull;
-      is_invalid_lhs = true;
-      break;
-
-    default : {
-      SYNTAX_ERROR("parse error got unexpected token '"
-                    << TokenConverter(token).cstr()
-                    << "' expect " << literals << "\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(LiteralError);
-      return new(pool()) Empty;
-    }
-  }
-  Literal* value = new(pool()) Literal(value_type, token->line_number());
-  value->set_value(token);
-  if (is_invalid_lhs) {
-    value->MarkAsInValidLhs();
-  }
-  END(Literal);
-  return value;
-}
-
-
-bool IsValidFormalParameter(int type) {
-  return type == Token::JS_IDENTIFIER || type == '{' || type == '[' || type == Token::JS_THIS || type == Token::JS_PRIVATE;
-}
-
-
-AstNode* Parser::ParseFunctionDecl(bool is_const) {
-  ENTER(FunctionDecl);
-  TokenInfo* token = Seek();
-  Function* fn = new(pool()) Function(token->line_number());
-  if (token->type() == Token::JS_IDENTIFIER) {
-    AstNode* name = ParseLiteral();
-    CHECK_ERROR(name);
-    fn->set_name(name);
-    token = Seek();
-  } else {
-    fn->set_name(new(pool()) Empty);
-  }
-
-  if (token->type() == '(') {
-    Advance();
-    token = Seek();
-    if (token->type() != ')') {
-      AstNode* list = ParseFormalParameter();
-      fn->set_argv(list);
-      token = Advance(2);
-    } else {
-      fn->set_argv(new(pool()) Empty);
-      token = Advance(2);
-    }
-  } else {
-    fn->set_argv(new(pool()) Empty);
-    token = Seek();
-    if (token->type() == Token::JS_FUNCTION_GLYPH ||
-         token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-      Advance();
-    }
-  }
-
-  if (token->type() == Token::JS_FUNCTION_GLYPH ||
-       token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    if (token->type() == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-      fn->set_context_type(Function::kThis);
-    }
-    token = Seek();
-    if (token->type() == '{') {
-      Advance();
-      state_stack_->Push(StateStack::kFunction);
-      bool has_return = bits_.At(RETURN_FLG);
-      bool has_yield = bits_.At(YIELD_FLG);
-      bits_.UnSet(RETURN_FLG);
-      bits_.UnSet(YIELD_FLG);
-      AstNode* body = ParseStatementList(BlockBodyMatcher, "}");
-      CHECK_ERROR(body);
-      builder()->FindDirectivePrologue(body, fn);
-      if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
-        SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(FunctionDeclError);
-        return fn;
-      }
-      if (!has_return) {
-        bits_.UnSet(RETURN_FLG);
-      }
-      if (!has_yield) {
-        bits_.UnSet(YIELD_FLG);
-      }
-      state_stack_->Pop();
-      CHECK_ERROR(body);
-      fn->Append(body);
-      Advance();
-      return fn;
-    } else {
-      AstNode* node = ParseAssignmentExpression(false);
-      CHECK_ERROR(node);
-      fn->AddChild(node);
-      fn->set_function_type(Function::kShorten);
-      END(FunctionDecl);
-      return fn;
-    }
-  } else {
-    if (token->type() == '{') {
-      state_stack_->Push(StateStack::kFunction);
-      bool has_return = bits_.At(RETURN_FLG);
-      bool has_yield = bits_.At(YIELD_FLG);
-      bits_.UnSet(RETURN_FLG);
-      bits_.UnSet(YIELD_FLG);
-      AstNode* body = ParseStatementList(BlockBodyMatcher, "}");
-      CHECK_ERROR(body);
-      builder()->FindDirectivePrologue(body, fn);
-      if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
-        SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(FunctionDeclError);
-        return fn;
-      }
-      if (!has_return) {
-        bits_.UnSet(RETURN_FLG);
-      }
-      if (!has_yield) {
-        bits_.UnSet(YIELD_FLG);
-      }
-      state_stack_->Pop();
-      CHECK_ERROR(body);
-      Advance();
-      fn->Append(body);
-      END(FunctionDecl);
-      return fn;
-    } else {
-      SYNTAX_ERROR("parse error got unexpected token "
-                    << TokenConverter(token).cstr()
-                    << " in 'function declaration' expect '{'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(FunctionDeclError);
-      return fn;
-    }
-  }
-}
-
-
-AstNode* Parser::ParseFormalParameter() {
-  ENTER(FormalParameter);
-  TokenInfo* token = Seek();
-  NodeList* list = new(pool()) NodeList;
-  while (token->type() != ')' && !IsEnd(token->type())) {
-    if (IsValidFormalParameter(token->type())) {
-      AstNode* node;
-      if(token->type() == '{' || token->type() == '['){
-        node = ParseDestructuringLeftHandSide();
-        CHECK_ERROR(node);
-        token = Seek();
-        if (token->type() == '=') {
-          AstNode* exp = ParseAssignmentExpression(false);
-          CHECK_ERROR(exp);
-          AssignmentExp* assign = new(pool()) AssignmentExp('=', node, exp, token->line_number());
-          node = assign;
-        }
-      } else {
-        node = ParseAssignmentExpression(false);
-        CHECK_ERROR(node);
-      }
-      CHECK_ERROR(node);
-      list->AddChild(node);
-      token = Seek();
-      if (token->type() != ')' && token->type() != ',') {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'formal parameter' expect ')' or ','\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(FormalParameterError);
-        return list;
-      } else if (token->type() == ',') {
-        Advance();
-      } else if (token->type() == ')') {
-        break;
-      }
-      token = Seek();
-    } else if (token->type() == Token::JS_PARAMETER_REST) {
-      Advance();
-      token = Seek();
-      if (token->type() == Token::JS_IDENTIFIER) {
-        AstNode* value = ParseLiteral();
-        CHECK_ERROR(value);
-        value->CastToLiteral()->set_value_type(Literal::kRest);
-        token = Seek();
-        list->AddChild(value);
-        if (token->type() != ')' && token->type() != ',') {
-          SYNTAX_ERROR("parse error got unexpected token "
-                        << TokenConverter(token).cstr()
-                        << " in 'formal parameter rest' can not continue after any 'formal parameter'\\nin file "
-                        << filename_ << " at line " << token->line_number());
-          END(FormalParameterError);
-          return list;
-        } else if (token->type() == ')') {
-          break;
-        }
-        token = Advance();
-      } else {
-        SYNTAX_ERROR("parse error got unexpected token "
-                      << TokenConverter(token).cstr()
-                      << " in 'formal parameter rest' expect 'identifier'\\nin file "
-                      << filename_ << " at line " << token->line_number());
-        END(FormalParameterErrror);
-        return list;
-      }
-    }
-  }
-  if (IsEnd(token->type())) {
-    SYNTAX_ERROR("parse error got unexpected token "
-                  << TokenConverter(token).cstr()
-                  << " in 'formal parameter' expect ')'\\nin file "
-                  << filename_ << " at line " << token->line_number());
-    END(FormalParameter);
-    return list;
-  }
-  return list;
-}
-
-
-AstNode* Parser::ParseArrowFunctionExpression(AstNode* exp, int type) {
-  ENTER(ArrowFunctionExpression);
-  Function* fn = new(pool()) Function(Seek(-1)->line_number());
-  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    fn->set_context_type(Function::kThis);
-  }
-  NodeList* list = FormalParameterConvertor(exp);
-  CHECK_ERROR(list);
-  fn->set_argv(list);
-  fn->set_name(new(pool()) Empty);
-  END(ArrowFunctionExpression);
-  return ParseArrowFunctionBody(fn);
-}
-
-AstNode* Parser::ParseArrowFunctionExpression(AstNode* member, AstNode* args, int type) {
-  ENTER(ArrowFunctionExpression);
-  Function* fn = new(pool()) Function(Seek(-1)->line_number());
-  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    fn->set_context_type(Function::kThis);
-  }
-  Literal* maybe_ident = member->CastToLiteral();
-  if (!maybe_ident || maybe_ident->value_type() != Literal::kIdentifier) {
-    SYNTAX_ERROR("parse error illegal function name "
-                  "in 'arrow function expression' expect 'identifier'\\nin file"
-                  << filename_ << " at line " << member->line_number());
-    END(ArrowFunctionExpression);
-    return fn;
-  }
-  fn->set_name(maybe_ident);
-  NodeList* list = FormalParameterConvertor(args);
-  CHECK_ERROR(list);
-  fn->set_argv(list);
-  END(ArrowFunctionExpression);
-  return ParseArrowFunctionBody(fn);
-}
-
-AstNode* Parser::ParseArrowFunctionExpression(int type) {
-  ENTER(ArrowFunctionExpression);
-  Function* fn = new(pool()) Function(Seek(-1)->line_number());
-  if (type == Token::JS_FUNCTION_GLYPH_WITH_CONTEXT) {
-    fn->set_context_type(Function::kThis);
-  }
-  fn->set_argv(new(pool()) Empty);
-  fn->set_name(new(pool()) Empty);
-  END(ArrowFunctionExpression);
-  return ParseArrowFunctionBody(fn);
-}
-
-AstNode* Parser::ParseArrowFunctionBody(Function* fn) {
-  ENTER(ArrowFunctionBody);
-  TokenInfo* token = Seek();
-  if (token->type() == '{') {
-    Advance();
-    state_stack_->Push(StateStack::kFunction);
-    bool has_return = bits_.At(RETURN_FLG);
-    bool has_yield = bits_.At(YIELD_FLG);
-    bits_.UnSet(RETURN_FLG);
-    bits_.UnSet(YIELD_FLG);
-    AstNode* list = ParseStatementList(BlockBodyMatcher, "}");
-    CHECK_ERROR(list);
-    builder()->FindDirectivePrologue(list, fn);
-    if (bits_.At(RETURN_FLG) && bits_.At(YIELD_FLG)) {
-      SYNTAX_ERROR("return statement not allowed in 'generator function'\\nin file "
-                    << filename_ << " at line " << token->line_number());
-      END(FunctionDeclError);
-      return fn;
-    }
-    if (!has_return) {
-      bits_.UnSet(RETURN_FLG);
-    }
-    if (!has_yield) {
-      bits_.UnSet(YIELD_FLG);
-    }
-    state_stack_->Pop();
-    CHECK_ERROR(list);
-    fn->Append(list);
-    Advance();
-  } else {
-    AstNode* node = ParseAssignmentExpression(false);
-    CHECK_ERROR(node);
-    fn->AddChild(node);
-    fn->set_function_type(Function::kShorten);
-  }
-  END(ArrowFunctionBody);
-  return fn;
-}
-
-
-AstNode* Parser::ParseArrayComprehensions() {
-  ENTER(ArrayComprehensions);
-  TokenInfo* token = Advance();
-  NodeList *list = new(pool()) NodeList;
-  while (token->type() == Token::JS_FOR) {
-    AstNode* node = ParseForStatement(true);
-    CHECK_ERROR(node);
-    list->AddChild(node);
-    token = Advance();
-  }
-  if (token->type() == Token::JS_IF) {
-    AstNode* if_stmt = ParseIFStatement(true);
-    CHECK_ERROR(if_stmt);
-    list->AddChild(if_stmt);
-  } else {
-    Undo();
-  }
-  END(ArrayComprehensions);
-  return list;
-}
-}
diff --git a/src/mocha/roaster/parser/parser.h b/src/mocha/roaster/parser/parser.h
deleted file mode 100755
index 9094de9..0000000
--- a/src/mocha/roaster/parser/parser.h
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef mocha_parser_h_
-#define mocha_parser_h_
-#include <string.h>
-#include <string>
-#include <mocha/roaster/ast/ast_foward_decl.h>
-#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
-#include <mocha/roaster/binding/parser_connector.h>
-#include <mocha/roaster/tokens/token_info.h>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class ErrorReporter;
-class ParserConnector;
-class AstBuilder;
-class Parser{
- public :
-  Parser(ParserConnector* connector_, ErrorReporter* reporter, const char* filename);
-  ~Parser();
-  FileRoot* Parse();
-  class ParseEventListener {
-   public :
-    void operator()(CompilationEvent* event);
-  };
- private :
-  typedef bool (*StatementListMatcher)(int type);
-  memory::Pool* pool() { return pool_; }
-  AstBuilder* builder() { return builder_; }
-  TokenInfo* Advance(int len = 1) {
-    TokenInfo* info = connector_->Advance(len);
-    //printf("advance %s\n", static_cast<const char*>(TokenConverter(info)));
-    return info;
-  }
-  TokenInfo* Undo(int len = 1) { return connector_->Undo(len); }
-  TokenInfo* Seek(int len = 1) {
-    TokenInfo* info = connector_->Seek(len);
-    //printf("seek %s\n", static_cast<const char*>(TokenConverter(info)));
-    return info;
-  }
-  void IllegalEnd(const char* expect, int64_t line);
-  void ParseTerminator();
-  NodeList* FormalParameterConvertor(AstNode *args);
-  AstNode* ParseProgram();
-  AstNode* ParseSourceElements();
-  AstNode* ParseSourceElement();
-  AstNode* ParseStatementList(StatementListMatcher matcher, const char* expect);
-  AstNode* ParseStatement();
-  AstNode* ParseBlockStatement();
-  AstNode* ParseModuleStatement();
-  AstNode* ParseExportStatement();
-  AstNode* ParseImportStatement();
-  AstNode* ParseImportExpression();
-  AstNode* ParseDebuggerStatement(TokenInfo* token);
-  AstNode* ParseVersionStatement();
-  AstNode* ParseAssertStatement();
-  AstNode* ParseVariableStatement();
-  AstNode* ParseVariableDecl(bool is_noin);
-  AstNode* ParseLetExpressionOrLetStatement();
-  AstNode* ParseLetExpressionExp();
-  AstNode* ParseDestructuringLeftHandSide();
-  AstNode* ParseArrayPattern();
-  AstNode* ParseObjectPattern();
-  AstNode* ParseObjectPatternElement(int type, TokenInfo* token, ObjectLikeLiteral* list);
-  AstNode* CheckLabellOrExpressionStatement();
-  AstNode* ParseIFStatement(bool is_comprehensions);
-  AstNode* ParseWhileStatement();
-  AstNode* ParseDoWhileStatement(bool is_exp);
-  AstNode* ParseForStatement(bool is_comprehensions);
-  void ParseForStatementCondition(NodeList* list);
-  void ParseForInStatementCondition(NodeList* list);
-  AstNode* ParseContinueStatement();
-  AstNode* ParseBreakStatement();
-  AstNode* ParseReturnStatement();
-  AstNode* ParseWithStatement();
-  AstNode* ParseSwitchStatement();
-  AstNode* ParseCaseClauses();
-  AstNode* ParseLabelledStatement();
-  AstNode* ParseThrowStatement();
-  AstNode* ParseTryStatement();
-  AstNode* ParseCatchBlock();
-  AstNode* ParseFinallyBlock();
-  AstNode* ParseTrait();
-  void ParseTraitBody(Trait* trait);
-  AstNode* ParseMixin();
-  AstNode* ParseClassDecl(bool is_const);
-  AstNode* ParseInheritDecl();
-  AstNode* ParseClassBody();
-  AstNode* ParseClassMemberStatement();
-  ClassMember* ParseClassMember();
-  AstNode* ParseExportableDefinition();
-  AstNode* ParseExpression(bool is_noin);
-  AstNode* ParseAssignmentExpression(bool is_noin);
-  AstNode* ParseYieldExpression(bool is_noin);
-  AstNode* ParseConditional(bool is_noin);
-  AstNode* ParseBinaryExpression(bool is_noin);
-  AstNode* ParseUnaryExpression();
-  AstNode* ParsePostfixExpression();
-  AstNode* ParseLeftHandSideExpression();
-  NewExp* ParseNewExpression();
-  AstNode* ParseCallExpression();
-  AstNode* ParseArguments();
-  AstNode* ParseMemberExpression();
-  AstNode* ParseBracketMember();
-  AstNode* ParseDotMember(bool *is_bool);
-  CallExp* ParseEachMember(int type, bool is_first, CallExp* exp);
-  AstNode* ParsePrimaryExpression();
-  AstNode* ParseGeneratorExpression(AstNode* exp);
-  AstNode* ParseObjectLiteral();
-  AstNode* ParseObjectElement(int type, TokenInfo* token, ObjectLikeLiteral* object);
-  AstNode* ParseArrayLiteral();
-  AstNode* ParseLiteral();
-  AstNode* ParseFunctionDecl(bool is_const);
-  AstNode* ParseFormalParameter();
-  AstNode* ParseArrowFunctionExpression(AstNode* exp, int type);
-  AstNode* ParseArrowFunctionExpression(AstNode* member, AstNode* args, int type);
-  AstNode* ParseArrowFunctionExpression(int type);
-  AstNode* ParseArrowFunctionBody(Function* fn);
-  AstNode* ParseArrayComprehensions();
-
-  const char* filename_;
-  std::string indent_;
-  class StateStack;
-  int depth_;
-  memory::Pool* pool_;
-  AstBuilder* builder_;
-  BitVector8 bits_;
-  ParserConnector* connector_;
-  ErrorReporter* reporter_;
-  ScopedPtr<StateStack> state_stack_;
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/scanner/scanner.cc b/src/mocha/roaster/scanner/scanner.cc
deleted file mode 100755
index 221cdbf..0000000
--- a/src/mocha/roaster/scanner/scanner.cc
+++ /dev/null
@@ -1,949 +0,0 @@
-#include <mocha/misc/int_types.h>
-#include <string.h>
-#include <string>
-#include <sstream>
-#include <mocha/roaster/scanner/scanner.h>
-#include <mocha/roaster/scanner/token_stream.h>
-#include <mocha/roaster/scanner/source_stream.h>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/tokens/token_info.h>
-#include <mocha/roaster/utils/error_reporter.h>
-#include <mocha/roaster/smart_pointer/scope/scoped_list.h>
-#include <mocha/roaster/memory/pool.h>
-#include <mocha/roaster/misc/bits.h>
-
-namespace mocha {
-
-#define FLAG_LB 0
-#define FLAG_REST 1
-#define FLAG_NUMERIC 2
-#define FLAG_REGEXP 3
-
-class Scanner::ScannerEventListener {
- public :
-  void operator()(CompilationEvent* e) {
-    CompilationInfo* info = e->compilation_info();
-    const char* source = e->source();
-    const char* path = e->path();
-    memory::Pool* pool = e->pool();
-    SourceStream* stream = SourceStream::New(source, path, info);
-    ErrorReporter* repoter = e->error_reporter();
-    const char* filename = e->filename();
-    Scanner* scanner = Scanner::New(source_stream, reporter, filename);
-    ParserConnector* connector = new(pool) ParserConnector(scanner, reporter);
-    e->set_parser_connector(connector);
-    e->notificator()->NotifyForKey(CompilationEvent::EventKey::kParse, e);
-  }
-};
-
-class Scanner::InternalScanner {
- public :
-  InternalScanner(SourceStream* source, ErrorReporter* reporter, const char* filename) :
-      line_(1),
-      filename_(filename),
-      token_stream_(TokenStream::New()),
-      source_stream_(source),
-      reporter_(reporter) {
-    flags_.Set(FLAG_REGEXP);
-    flags_.Set(FLAG_NUMERIC);
-  }
-
-  /**
-   * @public
-   * Collect token and push into the token queue.
-   */
-  inline void CollectToken() {
-    while (!IsEof()) {
-      Skip();
-      if (flags_.At(FLAG_LB)) {
-        TokenInfo* info = token_stream_->last();
-        if (info) {
-          info->set_linebreak_after();
-        }
-        flags_.UnSet(FLAG_LB);
-      }
-      uint8_t ch = Advance();
-      if (IsIdentStart(ch, true)) {
-        //identifier
-        CaseIdent(ch);
-      } else if (isdigit(ch)) {
-        //numeric begin with 0...9
-        CaseDigit(ch);
-      } else if (flags_.At(FLAG_NUMERIC) && ch == '.') {
-        //numeric begin with '.'
-        //treat as float.
-        CaseDigitBeginWithDot(ch);
-      } else if (IsSingleOperator(ch)) {
-        //operator that is not continue after operator. Like { } [ ]
-        token_stream_->Append("", ch, line_);
-      } else if (IsNotSingleOperator(ch)) {
-        //operator like + - =
-        CaseNotSingleOperator(ch);
-      } else if (ch != 0 && ch != Token::END_OF_INPUT){
-        std::stringstream st;
-        st << "Illegal token '"
-           << ch << "' in " << filename_ << " at : " << line_;
-        reporter_->ReportSyntaxError(st.str().c_str());
-      }
-      SetRegExpAfter();
-      SetNumericAfter();
-    }
-    TokenInfo* last = token_stream_->last();
-    if (last) {
-      last->set_linebreak_after();
-    }
-    //Sentinel.
-    token_stream_->Append("", Token::END_TOKEN, 0);
-  }
-
-  inline TokenStream* GetStream() {
-    return token_stream_;
-  }
-
- private :
-
-  /**
-   * @private
-   * Check char is unicode's byte order mark or not.
-   */
-  bool IsByteOrderMark(char data) {
-    return (data == 0xFEFF || data == 0xFFFE);
-  }
-
-  /**
-   * @private
-   * Check source end or not.
-   */
-  inline bool IsEof() {
-    return source_stream_->Seek(1) == Token::END_OF_INPUT;
-  }
-
-
-  inline uint8_t Seek(int len) {
-    return source_stream_->Seek(len);
-  }
-
-  /**
-   * @private
-   * Get next char form source.
-   */
-  inline uint8_t Advance(int len = 1) {
-    if (IsEof()) {
-      return 0;
-    } else {
-      return source_stream_->Advance(len);
-    }
-  }
-
-  /**
-   * @private
-   * Decrement source index.
-   */
-  inline void Undo(int len = 1) {
-    source_stream_->Undo(len);
-  }
-
-  /**
-   * @private
-   * Skip all comment, unicode's byte order mark, whitespace and linebreak.
-   */
-  void Skip() {
-    char ch = Seek(1);
-    char next = Seek(2);
-    bool isbreak = IsBreak(ch);
-    //Check that token is whitespace or line break.
-    if (IsWhiteSpace(ch) || IsByteOrderMark(ch) || isbreak) {
-      Advance();
-      //Add line number.
-      if (isbreak) {
-        flags_.Set(FLAG_LB);
-        line_++;
-      }
-      isbreak = false;
-      Skip ();
-    } else if (ch == '/' && next == '*') {
-      Advance(2);
-      //Process multiline comment.
-      SkipMultiLineComment ();
-      //Check is whitespace or singleline comment continue.
-      Skip();
-    } else if (ch == '/' && next == '/') {
-      Advance(2);
-      //Process single line comment.
-      SkipComment();
-      //Check is whitespace or multiline comment continue.
-      Skip();
-    }
-  }
-
-  /**
-   * @private
-   * @param {char}
-   * @returns {bool}
-   * Check is whitespace or not.
-   */
-  inline bool IsWhiteSpace(char ch) {
-    if (ch == ' ' ||
-        ch == '\t'||
-        ch == '\r') {
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  /**
-   * @private
-   * @param {char}
-   * @return {bool}
-   * Check is line break or not.
-   */
-  inline bool IsBreak(char ch) {
-    if (ch == '\n') {
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * @private
-   * cosume token while multiline comment block is continue.
-   */
-  inline void SkipMultiLineComment() {
-    int ch;
-    while (!IsEof()) {
-      ch = Advance();
-      char next = Advance();
-      //End of multiline comment.
-      if (ch == '*' && next == '/') {
-        return;
-      } else {
-        if (ch == '\n') {
-          line_++;
-          flags_.Set(FLAG_LB);
-        }
-        Undo();
-      }
-    }
-  }
-
-  /**
-   * @private
-   * Consume token while single line comment is continue.
-   */
-  inline void SkipComment() {
-    int ch;
-    while (!IsEof()) {
-      ch = Advance();
-      if (ch == '\n') {
-        line_++;
-        flags_.Set(FLAG_LB);
-        return;
-      }
-    }
-  }
-
-  /**
-   * @private
-   * @param {char}
-   * @returns {bool}
-   * Check is identifier token start or not.
-   */
-  inline bool IsIdentStart(char ch, bool is_begin) {
-    char next = Seek(1);
-    if (isalpha(ch) ||
-        ch == '_' ||
-        ch == '$' ||
-        //treat special token.
-        ch == '@') {
-      return true;
-    } else if (is_begin && ch == '\\' && next == 'u') {
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-
-  /**
-   * @private
-   * @param {char}
-   * Collect identifier.
-   */
-  inline void CaseIdent(char ch) {
-    token_str_ = ch;
-    char next = Advance();
-    while (IsIdentStart(next, false) || isdigit(next)) {
-      token_str_ += next;
-      next = Advance();
-    }
-    Undo();
-    PushBack(token_str_.c_str());
-  }
-
-
-  /**
-   * @private
-   * @param {char}
-   * In case of numeric literal.
-   */
-  inline void CaseDigit(char ch) {
-    token_str_ = ch;
-    char next = tolower(Advance());
-
-    if (next == '.') {
-      CaseDigitFloat(next);
-    } else if (next == 'x' && ch == '0') {
-      CaseDigitHex(next);
-    } else if (isdigit (next) || next == 'e') {
-      CaseDigitNumber(next);
-    } else {
-      Undo();
-    }
-    PushBack(token_str_.c_str(), Token::JS_NUMERIC_LITERAL);
-  }
-
-
-  /**
-   * @private
-   * @param {char}
-   * Case float.
-   */
-  inline void CaseDigitFloat(char ch) {
-    token_str_ += ch;
-    bool hasIndex = false;
-    char next;
-    char last;
-
-    while ((next = Advance())) {
-      next = tolower (next);
-
-      if (isdigit (next)) {
-        token_str_ += next;
-        last = next;
-        hasIndex = false;
-      } else if ((next == 'e' && !hasIndex) &&
-                 last != 'e') {
-        token_str_ += next;
-        last = next;
-        hasIndex = true;
-      } else if ((next == '+' || next == '-') && last == 'e') {
-        token_str_ += next;
-        last = next;
-        hasIndex = false;
-      } else {
-        Undo();
-        break;
-      }
-    }
-  }
-
-
-  inline bool IsHex(char ch) {
-    if (isdigit(ch) ||
-        ch == 'a' ||
-        ch == 'b' ||
-        ch == 'c' ||
-        ch == 'd' ||
-        ch == 'e' ||
-        ch == 'f')            {
-      return true;
-    }
-    return false;
-  }
-
-
-  inline void CaseDigitHex(char ch) {
-
-    char next;
-    token_str_ += ch;
-    Advance();
-    while ((next = Advance())) {
-      next = tolower (next);
-
-      if (IsHex(next)) {
-        token_str_ += next;
-      } else if (isdigit(next)) {
-        token_str_ += next;
-      } else {
-        Undo();
-        break;
-      }
-    }
-  }
-
-
-  inline void CaseDigitNumber(char ch) {
-    token_str_ += ch;
-    bool hasIndex = (ch == 'e')? true : false;
-    char last = ch;
-    char next;
-
-    while ((next = Advance())) {
-      next = tolower (next);
-
-      if (isdigit (next)) {
-        token_str_ += next;
-        last = next;
-      } else if (next == '.') {
-        token_str_ += next;
-        return CaseDigitFloat(Advance());
-      } else if (next == 'e' &&
-                 !hasIndex &&
-                 last != 'e') {
-        token_str_ += next;
-        last = next;
-      } else if ((next == '+' || next == '-') &&
-                 last == 'e') {
-        token_str_ += next;
-        last = next;
-      } else {
-        Undo();
-        break;
-      }
-    }
-  }
-
-
-  inline void CaseDigitBeginWithDot(char ch) {
-    token_str_ = ch;
-    bool hasIndex = false;
-    char last;
-    char next;
-    int index = 0;
-
-    while ((next = Advance())) {
-      if (isdigit (next)) {
-        token_str_ += next;
-        last = next;
-      } else if (next == '.' && index == 0) {
-        if (Advance() == '.') {
-          token_str_ += "..";
-          PushBack(token_str_.c_str(), Token::JS_PARAMETER_REST);
-          return;
-        } else {
-          Undo(1);
-        }
-      } else if (next == 'e' &&
-                 !hasIndex &&
-                 last != 'e') {
-        token_str_ += next;
-        last = next;
-      } else if ((next == '+' || next == '-') &&
-                 last == 'e') {
-        token_str_ += next;
-        last = next;
-      } else {
-        Undo();
-        break;
-      }
-      index++;
-    }
-    PushBack(token_str_.c_str(), Token::JS_NUMERIC_LITERAL);
-  }
-
-
-  /**
-   * @private
-   * @param {char}
-   * @returns {bool}
-   * Distinct parameter char is operators that is continue after operator.
-   */
-  inline bool IsSingleOperator(char ch) {
-    if (ch == '(' || ch == ')' ||
-        ch == '{' || ch == '}' ||
-        ch == '[' || ch == ']' ||
-        ch == '~' || ch == ',' ||
-        ch == '.' || ch == ':' ||
-        ch == ';' || ch == '?' ||
-        ch == '#') {
-      char next = Seek(1);
-      char next_after_ = Seek(2);
-      if (ch == '.' && next == ch && next_after_ == ch) {
-        flags_.Set(FLAG_REST);
-        return false;
-      }
-      return true;
-    }
-    return false;
-  }
-
-
-  /**
-   * @private
-   * @param {char}
-   * @returns {bool}
-   * Check operator like + = -
-   */
-  inline bool IsNotSingleOperator(char ch) {
-    if (!IsSingleOperator(ch) &&
-        ((ch > 32 && ch < 48) ||
-         (ch > 57 && ch < 65) ||
-         (ch > 90 && ch < 97) ||
-         (ch > 122 && ch < 127) ||
-         flags_.At(FLAG_REST)) &&
-        ch != 35 && ch != 127 && ch != 96 &&
-        !isalpha (ch)) {
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-
-  inline void CaseNotSingleOperator(char ch) {
-    token_str_ = ch;
-
-    switch (ch) {
-      case '.' :
-        {
-          if (flags_.At(FLAG_REST)) {
-            token_str_ += Advance();
-            token_str_ += Advance();
-            PushBack(token_str_.c_str(), Token::JS_PARAMETER_REST);
-            flags_.UnSet(FLAG_REST);
-          }
-        }
-        break;
-
-      case '"' :
-      case '\'' :
-        {
-          CaseStringLiteral(ch);
-        }
-        break;
-
-      case '=' :
-      case '!' :
-        {
-          CaseEqualitiesORFunGlyph();
-        }
-        break;
-
-      case '-' :
-      case '+' :
-        {
-          CaseAddAndSubORFunGlyph(ch);
-        }
-        break;
-
-      case '/' :
-      case '*' :
-      case '%' :
-        {
-          if (ch == '/' &&
-              flags_.At(FLAG_REGEXP)) {
-            CaseRegExpLiteral();
-          } else {
-            CaseUnary();
-          }
-        }
-        break;
-
-      case '|' :
-      case '&' :
-      case '^' :
-      case '<' :
-        {
-          CaseLogical(ch);
-        }
-        break;
-
-      case '>' :
-        {
-          CaseShiftRight();
-        }
-        break;
-    }
-  }
-
-
-  inline void CaseStringLiteral(char ch) {
-    char next = Seek(1);
-    char next_after_ = Seek(2);
-    bool escaped = false;
-
-    if (next == ch && next_after_ == ch) {
-      Advance(2);
-      while ((next = Advance())) {
-        if (next == '\n') {
-          line_++;
-        } else if (next != '\r') {
-          token_str_ += next;
-        }
-        char next_after = Advance();
-        char next_after_after = Advance();
-        if (next == ch && next_after == ch && next_after_after == ch) {
-          break;
-        } else {
-          Undo(2);
-        }
-      }
-    } else {
-      if (next == ch) {
-        token_str_ += ch;
-        Advance();
-      } else {
-        while ((next = Advance())) {
-          if (!escaped && next == '\\') {
-            escaped = true;
-          } else {
-            escaped = false;
-          }
-
-          token_str_ += next;
-          next = Seek(1);
-
-          if (!escaped && next == '\n') {
-            break;
-          }
-
-          if (!escaped && next == ch) {
-            token_str_ += next;
-            Advance();
-            break;
-          }
-        }
-      }
-    }
-    PushBack(token_str_.c_str(), Token::JS_STRING_LITERAL);
-  }
-
-
-  inline void CaseEqualitiesORFunGlyph() {
-    char next = Advance();
-    if (next == '=') {
-      token_str_ += next;
-      next = Advance();
-      if (next == '=') {
-        token_str_ += next;
-      } else {
-        Undo();
-      }
-    } else if (next == '>') {
-      token_str_ += next;
-    } else {
-      Undo();
-    }
-
-    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str (), true));
-  }
-
-
-
-  inline void CaseAddAndSubORFunGlyph(char ch) {
-    char next = Advance();
-    if (next == ch || next == '=') {
-      token_str_ += next;
-    } else if (ch == '-' && next == '>') {
-      token_str_ += next;
-    } else {
-      Undo();
-    }
-    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str (), true));
-  }
-
-
-  inline void CaseRegExpLiteral() {
-    bool isescaped = false;
-    bool ischar_class = false;
-    char next;
-
-    while ((next = Advance())) {
-      if (!isescaped &&
-          next == '\\') {
-        isescaped = true;
-        token_str_ += next;
-      } else if (!isescaped &&
-                 next == '[') {
-        ischar_class = true;
-        isescaped = false;
-        token_str_ += next;
-
-      } else if (!isescaped &&
-                 ischar_class &&
-                 next == ']') {
-
-        ischar_class = false;
-        token_str_ += next;
-
-      } else if (!isescaped &&
-                 !ischar_class &&
-                 next == '/') {
-        CaseRegExpFlag(next);
-        break;
-      } else {
-        isescaped = false;
-        token_str_ += next;
-      }
-    }
-  }
-
-
-  inline void CaseRegExpFlag(char ch) {
-    token_str_ += ch;
-    char flag = Seek(1);
-    bool has_error = false;
-    std::string flag_list;
-    BitVector8 flags;
-    while (isalpha(flag)) {
-      if (flag == 'i' ||
-          flag == 'g' ||
-          flag == 'm') {
-        if (!CheckRegExpFlags(&flags, flag, &flag_list)) {
-          has_error = true;
-        } else {
-        }
-      } else {
-        has_error = true;
-        flag_list += flag;
-      }
-      Advance();
-      flag = Seek(1);
-    }
-    if (has_error) {
-      std::stringstream st;
-      st << "Illegal regular expression flags '"
-         << flag_list << "' in " << filename_ << " at : " << line_;
-      reporter_->ReportSyntaxError(st.str().c_str());
-    } else {
-      PushBack(token_str_.c_str(), Token::JS_REGEXP_LITERAL);
-    }
-  }
-
-
-  inline bool CheckRegExpFlags(BitVector8 *flags, char flag, std::string *flag_list) {
-    if (flag == 'i') {
-      return SetRegExpFlags(flags, flag, flag_list, 0);
-    } else if (flag == 'g') {
-      return SetRegExpFlags(flags, flag, flag_list, 1);
-    } else if (flag == 'm') {
-      return SetRegExpFlags(flags, flag, flag_list, 2);
-    }
-    return false;
-  }
-
-
-  inline bool SetRegExpFlags(BitVector8 *flags, char flag, std::string *flag_list, int pos) {
-    if (!flags->At(pos)) {
-      flags->Set(pos);
-      token_str_ += flag;
-      (*flag_list) += flag;
-      return true;
-    } else {
-      (*flag_list) += flag;
-      return false;
-    }
-  }
-
-
-  inline void CaseUnary() {
-    char next = Advance();
-    if (next == '=') {
-      token_str_ += next;
-    } else {
-      Undo();
-    }
-    PushBack(token_str_.c_str(),                      JsToken::GetType (token_str_.c_str (), true));
-  }
-
-
-  inline void CaseLogical(char ch) {
-    char next = Advance();
-
-    if (next == ch) {
-      token_str_ += next;
-      if (ch == '<' && next == '<') {
-        next = Seek(1);
-        if (next == '=') {
-          token_str_ += next;
-          Advance();
-        }
-      }
-    } else if ((ch == '|' ||
-                ch == '^' ||
-                ch == '<' ||
-                ch == '&') &&
-               next == '=') {
-      token_str_ += next;
-    } else {
-      Undo();
-    }
-    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str(), true));
-  }
-
-
-  inline void CaseShiftRight() {
-    char next = Advance();
-    if (next == '>') {
-      token_str_ += next;
-      next = Advance();
-      if (next == '>') {
-        token_str_ += next;
-        next = Seek(1);
-        if (next == '=') {
-          token_str_ += next;
-          Advance();
-        }
-      } else if (next == '=') {
-        token_str_ += next;
-      } else {
-        Undo();
-      }
-    } else if (next == '=') {
-      token_str_ += next;
-    } else {
-      Undo();
-    }
-    PushBack(token_str_.c_str(), JsToken::GetType (token_str_.c_str(), true));
-  }
-
-
-  inline void SetNumericAfter() {
-    int type = (token_stream_->size() > 0)? token_stream_->last()->type() : 0;
-    if (JsToken::IsBinaryOperatorNoIn(type) ||
-        type == '[' ||
-        type == '{' ||
-        type == '(' ||
-        type == '*' ||
-        type == '/' ||
-        type == '+' ||
-        type == '-' ||
-        type == '=' ||
-        type == '^' ||
-        type == '&' ||
-        type == '|' ||
-        type == ':' ||
-        type == ',' ||
-        type == ';' ||
-        type == '~' ||
-        type == '>' ||
-        type == '<' ||
-        type == '!' ||
-        type == Token::JS_RETURN) {
-      flags_.Set(FLAG_NUMERIC);
-    } else {
-      flags_.UnSet(FLAG_NUMERIC);
-    }
-  }
-
-
-  inline void SetRegExpAfter() {
-    int type = (token_stream_->size() > 0)? token_stream_->last()->type() : 0;
-    if (JsToken::IsBinaryOperator(type) ||
-        type == '}' ||
-        type == '|' ||
-        type == '{' ||
-        type == '^' ||
-        type == '[' ||
-        type == '?' ||
-        type == '=' ||
-        type == ';' ||
-        type == ':' ||
-        type == ',' ||
-        type == '(' ||
-        type == '&' ||
-        type == '!' ||
-        type == '+' ||
-        type == '-' ||
-        type == '/' ||
-        type == '%' ||
-        type == '*' ||
-        type == '~' ||
-        type == '>' ||
-        type == '<' ||
-        type == Token::JS_RETURN) {
-      flags_.Set(FLAG_REGEXP);
-    } else {
-      flags_.UnSet(FLAG_REGEXP);
-    }
-  }
-
-
-  /**
-   * @private
-   * @param {const char*}
-   * Get type of token and call DoPushBack_.
-   */
-  inline void PushBack(const char* ctoken, int opt_type = 0) {
-    int type = (opt_type == 0)? JsToken::GetType(ctoken) : opt_type;
-    if (type == Token::JS_EACH) {
-      if (token_stream_->size() > 0 && token_stream_->last()->type() != Token::JS_FOR) {
-        type = Token::JS_IDENTIFIER;
-      }
-    }
-    DoPushBack(ctoken, type);
-  }
-
-  /**
-   * @private
-   * @param {char}
-   * Call DoPushBack_ with set type to arguments.
-   */
-  inline void PushBack(int ch) {
-    if (ch == '(' && token_stream_->size() >= 2) {
-      TokenInfo* info = token_stream_->Seek(2);
-      if (info != Scanner::kEmpty && info->type() == Token::JS_IDENTIFIER) {
-        if (info && strcmp(info->token(), "get") == 0) {
-          info->set_type(Token::JS_GET);
-        } else if (info && strcmp(info->token(), "set") == 0) {
-          info->set_type(Token::JS_SET);
-        }
-      }
-    }
-    DoPushBack("", ch);
-  }
-
-  /**
-   * @private
-   * @param {const char*}
-   * @param {int}
-   * Push back a pointer of TokenInfo to token_stream_.
-   */
-  inline void DoPushBack(const char* ctoken, int type) {
-    TokenInfo* info = token_stream_->last();
-    token_stream_->Append(ctoken, type, line_);
-    if (info && info->linebreak_after()) {
-      token_stream_->last()->set_linebreak_befor();
-    }
-  }
-
-  int64_t line_;
-  const char* filename_;
-  BitVector8 flags_;
-  TokenStream* token_stream_;
-  SourceStream* source_stream_;
-  std::string token_str_;
-  ErrorReporter *reporter_;
-};
-
-Scanner* Scanner::New(SourceStream* stream, ErrorReporter* reporter, const char* filename) {
-  Scanner* scanner = new(memory::Pool::Local()) Scanner(stream, reporter, filename);
-  scanner->CreateTokenStream();
-  scanner->token_stream_ = scanner->scanner_->GetStream();
-  return scanner;
-}
-
-Scanner::Scanner(SourceStream* source, ErrorReporter* reporter, const char* filename)
-    : scanner_(new InternalScanner(source, reporter, filename)), reporter_(reporter){}
-Scanner::~Scanner(){}
-
-TokenInfo* Scanner::Advance(int index) {
-  return token_stream_->Advance(index);
-}
-
-TokenInfo* Scanner::Undo(int index) {
-  return token_stream_->Undo(index);
-}
-
-TokenInfo* Scanner::Seek(int index) {
-  return token_stream_->Seek(index);
-}
-
-void Scanner::CreateTokenStream() {
-  scanner_->CollectToken();
-}
-
-TokenInfo* Scanner::kEmpty = 0;
-
-}
diff --git a/src/mocha/roaster/scanner/scanner.h b/src/mocha/roaster/scanner/scanner.h
deleted file mode 100755
index 85b9790..0000000
--- a/src/mocha/roaster/scanner/scanner.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef mocha_scanner_h_
-#define mocha_scanner_h_
-#include <mocha/roaster/smart_pointer/scope/scoped_ptr.h>
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class ErrorReporter;
-class SourceStream;
-class TokenInfo;
-class TokenStream;
-class JsToken;
-class Scanner : public memory::Allocated {
- public :
-  static Scanner* New(SourceStream* source, ErrorReporter *reporter, const char* filename);
-  class ScannerEventListener {
-   public :
-    voie operator()(CompilationEvent* event);
-  };
-  ~Scanner();
-  TokenInfo* Advance(int index = 1);
-  TokenInfo* Undo(int index = 1);
-  TokenInfo* Seek(int index);
-  static TokenInfo* kEmpty;
- private :
-  Scanner(SourceStream* source, ErrorReporter *reporter, const char* filename);
-  void CreateTokenStream();
-
-  class InternalScanner;
-  ScopedPtr<InternalScanner> scanner_;
-  TokenStream* token_stream_;
-  ErrorReporter* reporter_;
-};
-}
-
-#endif
diff --git a/src/mocha/roaster/scanner/scanner_state.h b/src/mocha/roaster/scanner/scanner_state.h
deleted file mode 100755
index f022ba7..0000000
--- a/src/mocha/roaster/scanner/scanner_state.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef mocha_scanner_state_h_
-#define mocha_scanner_state_h_
-#include <mocha/roaster/misc/class_traits/uncopyable.h>
-namespace mocha {
-
-class ScannerState : private Uncopyable {
- public :
-  ScannerState();
-  ~ScannerState();
-  void Check(int token);
-  bool IsAllowExpression();
-  bool IsRightHandSide();
-  class State;
-  State* state_;
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/scanner/source_stream.cc b/src/mocha/roaster/scanner/source_stream.cc
deleted file mode 100755
index 9c78275..0000000
--- a/src/mocha/roaster/scanner/source_stream.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <mocha/roaster/scanner/source_stream.h>
-#include <mocha/roaster/encoding/encoding.h>
-#include <mocha/roaster/smart_pointer/common/ptr_deleter.h>
-#include <mocha/options/setting.h>
-#include <mocha/xml/xml_setting_info.h>
-namespace mocha {
-
-SharedStr Encode(const char* source, const char* path, const CompilationInfo* info) {
-  if (!info->HasCharset()) {
-    SharedPtr<DetectResult> detected = ICUWrapper::GetEncode(source);
-    SharedStr data = ICUWrapper::EncodeToUtf8(source, detected->charset);
-    return data;
-  } else {
-    const char* charset = info->charset();
-    SharedStr data = ICUWrapper::EncodeToUtf8(source, charset);
-    return data;
-  }
-}
-
-SourceStream* SourceStream::New(const char* source, const char* path, const CompilationInfo* info) {
-  SharedStr str_handle = Encode(source, path, info);
-  SourceStream* stream = new(memory::Pool::Local()) SourceStream();
-  stream->CreateStream(str_handle.Get());
-  return stream;
-}
-
-
-SourceStream::SourceStream() : cursor_(-1), line_(1), size_(0){};
-
-
-SourceStream::~SourceStream() {
-  free(stream_);
-}
-
-
-void SourceStream::CreateStream(const char* utf8_str) {
-  int size = strlen(utf8_str);
-  int count = 0;
-  stream_ = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * size + sizeof(uint8_t)));
-  for (int i = 0; i < size; i++) {
-    if (utf8_str[ i ] == '\n') line_++;
-    if (utf8_str[ i ] != '\r') {
-      stream_[ count ] = utf8_str[ i ];
-      count++;
-    }
-  }
-  size_ = count;
-  stream_[ count ] = '\0';
-}
-
-
-uint8_t SourceStream::At(int index) const {
-  return (index > 0 && index < size_)? stream_[ index ] : (index < 0)? Token::ILLEGAL : Token::END_OF_INPUT;
-}
-
-
-uint8_t SourceStream::Advance(int index) {
-  if (index < 0) return Token::ILLEGAL;
-  if (cursor_ == size_) {
-    cursor_++;
-    return Token::END_OF_INPUT;
-  } else {
-    cursor_ += index;
-    char ret = stream_[ cursor_ ];
-    return ret;
-  }
-}
-
-
-uint8_t SourceStream::Undo(int index) {
-  if (index < 0) return Token::ILLEGAL;
-  int i = 0;
-  for (; i < index; i++) {}
-  cursor_ -= i;
-  return (cursor_ > 0 && size_ > 0)? stream_[ cursor_ ] : Token::ILLEGAL;
-}
-
-
-uint8_t SourceStream::Seek(int index) const {
-  int i = 0,pos = 0;
-  if (index > 0) {
-    for (; i < index; i++) {}
-  } else {
-    for (; i > index; i--) {}
-  }
-  pos = cursor_ + i;
-  if (pos < size_) {
-    return stream_[ pos ];
-  }
-  return Token::END_OF_INPUT;
-}
-
-
-uint8_t SourceStream::Last() const {
-  return stream_[ size_ - 1 ];
-}
-
-
-uint8_t SourceStream::First() const {
-  return stream_[ 0 ];
-}
-
-
-int SourceStream::Size() const { return size_; }
-
-}
diff --git a/src/mocha/roaster/scanner/source_stream.h b/src/mocha/roaster/scanner/source_stream.h
deleted file mode 100755
index b2ad764..0000000
--- a/src/mocha/roaster/scanner/source_stream.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef mocha_source_stream_h_
-#define mocha_source_stream_h_
-#include <mocha/roaster/smart_pointer/ref_count/shared_ptr.h>
-#include <mocha/misc/int_types.h>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class CompilationInfo;
-class SourceStream : public memory::Allocated {
- public :
-  static SourceStream* New(const char* source, const char* path, const CompilationInfo* info);
-  ~SourceStream();
-  int Size() const;
-  uint8_t At(int index) const;
-  uint8_t Advance(int index = 1);
-  uint8_t Undo(int index = 0);
-  uint8_t Seek(int index) const;
-  uint8_t Last() const;
-  uint8_t First() const;
- private :
-  SourceStream();
-  void CreateStream(const char* utf8_str);
-  int cursor_;
-  int line_;
-  int size_;
-  uint8_t *stream_;
-};
-}
-
-#endif
diff --git a/src/mocha/roaster/scanner/token_stream.cc b/src/mocha/roaster/scanner/token_stream.cc
deleted file mode 100755
index 649ff59..0000000
--- a/src/mocha/roaster/scanner/token_stream.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-#include <mocha/roaster/scanner/token_stream.h>
-#include <mocha/roaster/tokens/token_info.h>
-#include <mocha/misc/int_types.h>
-
-namespace mocha {
-
-static const int max_element = 6;
-
-class TokenContainer : public memory::Allocated {
- public :
-  TokenContainer(const char* token, int type, int64_t line, memory::Pool* pool)
-      :  size(0), next(0), prev(0) {
-    Push(token, type, line, pool);
-  }
-
-  void Push(const char* token, int type, int64_t line, memory::Pool* pool) {
-    TokenInfo* info = new(pool) TokenInfo(token, type, line);
-    array[ size ] = reinterpret_cast<uintptr_t>(info);
-    size++;
-  }
-
-  TokenInfo* Get(int index) {
-    return reinterpret_cast<TokenInfo*>(array[index]);
-  }
-
-  int size;
-  TokenContainer* next;
-  TokenContainer* prev;
-
- private :
-  uintptr_t array[max_element];
-};
-
-
-TokenStream* TokenStream::New() {
-  return new(memory::Pool::Local()) TokenStream();
-}
-
-TokenStream::TokenStream()
-    : cursor_(0), size_(0), current_(0), first_(0), last_(0), pool_(memory::Pool::Local()){};
-TokenStream::~TokenStream() {};
-
-TokenInfo* TokenStream::Advance(int index) {
-  if (index < 1) return 0;
-  int count = cursor_;
-  TokenContainer* tmp = current_;
-  TokenInfo* ret;
-  for (int i = 0; i < index; i++) {
-    if (count == current_->size) {
-      current_ = current_->next;
-      if (current_ == 0) {
-        current_ = tmp;
-        return kEmpty;
-      } else {
-        count = 0;
-      }
-    }
-    ret = current_->Get(count);
-    count++;
-  }
-  cursor_ = count;
-  return ret;
-}
-
-
-
-void TokenStream::Append(const char* token, int type, int64_t line) {
-  if (first_ == 0) {
-    first_ = new(pool()) TokenContainer(token, type, line, pool());
-    current_ = last_ = first_;
-  } else {
-    if (first_->size < max_element) {
-      last_->Push(token, type, line, pool());
-    } else {
-      TokenContainer* tmp = new(pool()) TokenContainer(token, type, line, pool());
-      last_->next = tmp;
-      tmp->prev = last_;
-      last_ = tmp;
-    }
-  }
-  size_++;
-}
-
-
-TokenInfo* TokenStream::Undo(int index) {
-  if (index < 0) return kEmpty;
-  int count = cursor_;
-  TokenContainer* tmp = current_;
-  TokenInfo* ret;
-  for (int i = 0; i < index; i++) {
-    if (count < 0) {
-      current_ = current_->prev;
-      if (current_ == 0) {
-        current_ = tmp;
-        return kEmpty;
-      } else {
-        count = current_->size;
-      }
-    }
-    count--;
-    ret = current_->Get(count);
-  }
-  cursor_ = count;
-  return ret;
-}
-
-
-TokenInfo* TokenStream::Seek(int index) {
-  int cursor = cursor_;
-  TokenContainer* tmp = current_;
-  TokenInfo* info = (index > 0)? Advance(index) : Undo((-1 * index));
-  current_ = tmp;
-  cursor_ = cursor;
-  return info;
-}
-
-TokenInfo* TokenStream::first() const {
-  if (first_) {
-    return first_->Get(0);
-  }
-  return 0;
-}
-
-TokenInfo* TokenStream::last() const {
-  if (last_) {
-    return last_->Get(last_->size - 1);
-  }
-  return 0;
-}
-
-TokenInfo* TokenStream::kEmpty = 0;
-
-}
diff --git a/src/mocha/roaster/scanner/token_stream.h b/src/mocha/roaster/scanner/token_stream.h
deleted file mode 100755
index ae057c9..0000000
--- a/src/mocha/roaster/scanner/token_stream.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef mocha_scanner_token_stream_h_
-#define mocha_scanner_token_stream_h_
-#include <mocha/misc/int_types.h>
-#include <mocha/roaster/memory/pool.h>
-namespace mocha {
-class TokenContainer;
-class TokenInfo;
-class TokenStream : public memory::Allocated {
- public :
-  ~TokenStream();
-  static TokenStream* New();
-  TokenInfo* Advance(int index = 1);
-  TokenInfo* Seek(int index);
-  TokenInfo* Undo(int index = 0);
-  void Append(const char* token, int type, int64_t line);
-  int size() const { return size_; }
-  TokenInfo* last() const;
-  TokenInfo* first() const;
-  static TokenInfo* kEmpty;
- private :
-  TokenStream();
-  memory::Pool* pool() { return pool_; }
-  int cursor_;
-  int size_;
-  TokenContainer* current_;
-  TokenContainer* first_;
-  TokenContainer* last_;
-  memory::Pool* pool_;
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/tokens/js_token.cc b/src/mocha/roaster/tokens/js_token.cc
deleted file mode 100755
index 5f4bda3..0000000
--- a/src/mocha/roaster/tokens/js_token.cc
+++ /dev/null
@@ -1,566 +0,0 @@
-#include <assert.h>
-#include <string.h>
-#include <stdio.h>
-#include <string>
-#include <mocha/roaster/tokens/js_token.h>
-#include <mocha/roaster/tokens/token_info.h>
-
-namespace mocha {
-
-
-#define NOT_USE -1
-#define ASCII_MAX_RANGE 127
-
-char reserved_words[][ 20 ] = {
-  "abstract",
-  "boolean" ,
-  "break" ,
-  "byte" ,
-  "case" ,
-  "catch" ,
-  "char" ,
-  "class" ,
-  "const" ,
-  "continue" ,
-  "debugger" ,
-  "default" ,
-  "delete" ,
-  "do" ,
-  "double" ,
-  "else" ,
-  "enum" ,
-  "export" ,
-  "extends" ,
-  "false" ,
-  "final" ,
-  "finally" ,
-  "float" ,
-  "for" ,
-  "function" ,
-  "goto" ,
-  "if" ,
-  "implements" ,
-  "import" ,
-  "in" ,
-  "instanceof" ,
-  "int" ,
-  "interface" ,
-  "let",
-  "long" ,
-  "module",
-  "NaN",
-  "native",
-  "new" ,
-  "null" ,
-  "package" ,
-  "private" ,
-  "protected",
-  "public" ,
-  "return" ,
-  "short" ,
-  "static" ,
-  "super"  ,
-  "switch" ,
-  "synchronized" ,
-  "this" ,
-  "throw" ,
-  "throws" ,
-  "transient" ,
-  "true" ,
-  "try" ,
-  "typeof" ,
-  "var" ,
-  "void" ,
-  "volatile" ,
-  "while" ,
-  "with",
-  "each",
-  "yield",
-  "@assert",
-  "@version",
-  "@pragma",
-  "++", "--", "==", "<<", ">>", "<=", ">=", "===", "!=" ,
-  "!==", ">>>", "+=", "-=", "/=", "%=", "*=", "&&", "||", "<<=",
-  ">>=", ">>>=", "^=", "&=", "|=", "->", "=>"
-};
-
-
-
-char builtins[][ 30 ] = {
-  "Array",
-  "JSON",
-  "Boolean"
-  "Date",
-  "Error",
-  "EvalError",
-  "Function",
-  "Infinity",
-  "Math",
-  "NaN",
-  "Number",
-  "Object",
-  "RangeError",
-  "ReferenceError",
-  "RegExp",
-  "String",
-  "SyntaxError",
-  "TypeError",
-  "URIError",
-  "arguments",
-  "decodeURI",
-  "decodeURIComponent",
-  "encodeURI",
-  "encodeURIComponent",
-  "escape",
-  "eval",
-  "isFinite",
-  "isNaN",
-  "parseFloat",
-  "parseInt",
-  "undefined",
-  "unescape",
-  "Attr",
-  "CDATASection",
-  "CharacterData",
-  "Comment",
-  "DOMException",
-  "DOMImplementation",
-  "Document",
-  "DocumentFragment"
-  "DocumentType",
-  "Element",
-  "Entity",
-  "EntityReference",
-  "ExceptionCode",
-  "NamedNodeMap",
-  "Node",
-  "NodeList",
-  "Notation"
-  "ProcessingInstruction",
-  "Text",
-  "HTMLAnchorElement",
-  "HTMLAppletElement",
-  "HTMLAreaElement",
-  "HTMLBRElement",
-  "HTMLBaseElement",
-  "HTMLBaseFontElement",
-  "HTMLBodyElement",
-  "HTMLButtonElement",
-  "HTMLCollection",
-  "HTMLDListElement",
-  "HTMLDirectoryElement",
-  "HTMLDivElement",
-  "HTMLDocument",
-  "HTMLElement",
-  "HTMLFieldSetElement",
-  "HTMLFontElement",
-  "HTMLFormElement",
-  "HTMLFrameElement",
-  "HTMLFrameSetElement",
-  "HTMLHRElement",
-  "HTMLHeadElement",
-  "HTMLHeadingElement",
-  "HTMLHtmlElement",
-  "HTMLIFrameElement",
-  "HTMLImageElement",
-  "HTMLInputElement",
-  "HTMLIsIndexElement",
-  "HTMLLIElement",
-  "HTMLLabelElement",
-  "HTMLLegendElement",
-  "HTMLLinkElement",
-  "HTMLMapElement",
-  "HTMLMenuElement",
-  "HTMLMetaElement",
-  "HTMLModElement",
-  "HTMLOListElement",
-  "HTMLObjectElement",
-  "HTMLOptGroupElement",
-  "HTMLOptionElement",
-  "HTMLOptionsCollection",
-  "HTMLParagraphElement",
-  "HTMLParamElement",
-  "HTMLPreElement",
-  "HTMLQuoteElement",
-  "HTMLScriptElement",
-  "HTMLSelectElement",
-  "HTMLStyleElement",
-  "HTMLTableCaptionElement",
-  "HTMLTableCellElement",
-  "HTMLTableColElement",
-  "HTMLTableElement",
-  "HTMLTableRowElement",
-  "HTMLTableSectionElement",
-  "HTMLTextAreaElement",
-  "HTMLTitleElement",
-  "HTMLUListElement",
-  "DOMConfiguration",
-  "DOMError",
-  "DOMException",
-  "DOMImplementationList",
-  "DOMImplementationSource",
-  "DOMLocator",
-  "DOMStringList",
-  "NameList",
-  "TypeInfo",
-  "UserDataHandler"
-  "window",
-  "alert",
-  "confirm",
-  "document",
-  "java",
-  "navigator",
-  "prompt",
-  "screen",
-  "self",
-  "top",
-  "CSSCharsetRule",
-  "CSSFontFace",
-  "CSSFontFaceRule",
-  "CSSImportRule",
-  "CSSMediaRule",
-  "CSSPageRule",
-  "CSSPrimitiveValue",
-  "CSSProperties",
-  "CSSRule",
-  "CSSRuleList",
-  "CSSStyleDeclaration",
-  "CSSStyleRule",
-  "CSSStyleSheet",
-  "CSSValue",
-  "CSSValueList",
-  "Counter",
-  "DOMImplementationCSS",
-  "DocumentCSS",
-  "DocumentStyle",
-  "ElementCSSInlineStyle",
-  "LinkStyle",
-  "MediaList",
-  "RGBColor",
-  "Rect",
-  "StyleSheet",
-  "StyleSheetList",
-  "ViewCSS",
-  "EventListener",
-  "EventTarget",
-  "Event",
-  "DocumentEvent",
-  "UIEvent",
-  "MouseEvent",
-  "MutationEvent",
-  "KeyboardEvent",
-  "DocumentRange",
-  "Range",
-  "RangeException",
-  "XPathResult",
-  "XMLHttpRequest",
-  "importScript",
-  "WeakMap"
-};
-
-static bool binary_operator[] = {
-  false,//NOT_USE:0
-  false,//NOT_USE:1
-  false,//NOT_USE:2
-  false,//NOT_USE:3
-  false,//NOT_USE:4
-  false,//NOT_USE:5
-  false,//NOT_USE:6
-  false,//NOT_USE:7
-  false,//NOT_USE:8
-  false,//NOT_USE:9
-  false,//NOT_USE:10
-  false,//NOT_USE:11
-  false,//NOT_USE:12
-  false,//NOT_USE:13
-  false,//NOT_USE:14
-  false,//NOT_USE:15
-  false,//NOT_USE:16
-  false,//NOT_USE:17
-  false,//NOT_USE:18
-  false,//NOT_USE:19
-  false,//NOT_USE:20
-  false,//NOT_USE:21
-  false,//NOT_USE:22
-  false,//NOT_USE:23
-  false,//NOT_USE:24
-  false,//NOT_USE:25
-  false,//NOT_USE:26
-  false,//NOT_USE:27
-  false,//NOT_USE:28
-  false,//NOT_USE:29
-  false,//NOT_USE:30
-  false,//NOT_USE:31
-  false,//NOT_USE:32
-  false,//'!':33
-  false,//'"':34
-  false,//'#':35
-  false,//'$':36
-  false,//'%':37
-  false,//'&':38
-  false,//'\':/39
-  false,//'(':40
-  false,//')':41
-  false,//'*':42
-  false,//'+':43
-  false,//',':44
-  false,//'-':45
-  false,//'.':46
-  false,//'/':47
-  false,//NOT_USE:48
-  false,//NOT_USE:49
-  false,//NOT_USE:50
-  false,//NOT_USE:51
-  false,//NOT_USE:52
-  false,//NOT_USE:53
-  false,//NOT_USE:54
-  false,//NOT_USE:55
-  false,//NOT_USE:56
-  false,//NOT_USE:57
-  false,//':':58
-  false,//':':59
-  false,//'<':60
-  false,//'=':61
-  false,//'>':62
-  false,//'?':63
-  false,//'@':64
-  false,//NOT_USE:65
-  false,//NOT_USE:66
-  false,//NOT_USE:67
-  false,//NOT_USE:68
-  false,//NOT_USE:69
-  false,//NOT_USE:70
-  false,//NOT_USE:71
-  false,//NOT_USE:72
-  false,//NOT_USE:73
-  false,//NOT_USE:74
-  false,//NOT_USE:75
-  false,//NOT_USE:76
-  false,//NOT_USE:77
-  false,//NOT_USE:78
-  false,//NOT_USE:79
-  false,//NOT_USE:80
-  false,//NOT_USE:81
-  false,//NOT_USE:82
-  false,//NOT_USE:83
-  false,//NOT_USE:84
-  false,//NOT_USE:85
-  false,//NOT_USE:86
-  false,//NOT_USE:87
-  false,//NOT_USE:88
-  false,//NOT_USE:89
-  false,//NOT_USE:90
-  false,//'[':91
-  false,//'\\:92
-  false,//']':93
-  false,//'^':94
-  false,//'_':95
-  false,//'`':96
-  false,//NOT_USE:97
-  false,//NOT_USE:98
-  false,//NOT_USE:99
-  false,//NOT_USE:100
-  false,//NOT_USE:101
-  false,//NOT_USE:102
-  false,//NOT_USE:103
-  false,//NOT_USE:104
-  false,//NOT_USE:105
-  false,//NOT_USE:106
-  false,//NOT_USE:107
-  false,//NOT_USE:108
-  false,//NOT_USE:109
-  false,//NOT_USE:110
-  false,//NOT_USE:111
-  false,//NOT_USE:112
-  false,//NOT_USE:113
-  false,//NOT_USE:114
-  false,//NOT_USE:115
-  false,//NOT_USE:116
-  false,//NOT_USE:117
-  false,//NOT_USE:118
-  false,//NOT_USE:119
-  false,//NOT_USE:120
-  false,//NOT_USE:121
-  false,//NOT_USE:122
-  false,//'{':123
-  false,//'|':124
-  false,//'}':125
-  false,//'~':126
-  false,//NOT_USE:127
-  false,//JS_ABSTRACT
-  false,//JS_BOOLEAN
-  false,//JS_BREAK
-  false,//JS_BYTE
-  false,//JS_CASE
-  false,//JS_CATCH
-  false,//JS_CHAR
-  false,//JS_CLASS
-  false,//JS_CONST
-  false,//JS_CONTINUE
-  false,//JS_DEBUGGER
-  false,//JS_DEFAULT
-  false,//JS_DELETE
-  false,//JS_DO
-  false,//JS_DOUBLE
-  false,//JS_ELSE
-  false,//JS_ENUM
-  false,//JS_EXPORT
-  false,//JS_EXTENDS
-  false,//JS_FALSE
-  false,//JS_FINAL
-  false,//JS_FINALLY
-  false,//JS_FLOAT
-  false,//JS_FOR
-  false,//JS_FUNCTION
-  false,//JS_GOTO
-  false,//JS_IF
-  false,//JS_IMPLEMENTS
-  false,//JS_IMPORT
-  false,//JS_IN
-  false,//JS_INSTANCEOF
-  false,//JS_INT
-  false,//JS_INTERFACE
-  false,//JS_LET
-  false,//JS_LONG
-  false,//JS_MODULE
-  false,//JS_NATIVE
-  false,//JS_NEW
-  false,//JS_K_NULL
-  false,//JS_PACKAGE_RESERVED
-  false,//JS_PRIVATE
-  false,//JS_PROTECTED
-  false,//JS_PUBLIC
-  false,//JS_RETURN
-  false,//JS_SHORT
-  false,//JS_STATIC
-  false,//JS_SUPER
-  false,//JS_SWITCH
-  false,//JS_SYNCHRONIZED
-  false,//JS_THIS
-  false,//JS_THROW
-  false,//JS_THROWS
-  false,//JS_TRANSIENT
-  false,//JS_TRUE
-  false,//JS_TRY
-  false,//JS_TYPEOF
-  false,//JS_VAR
-  false,//JS_VOID
-  false,//JS_VOLATILE
-  false,//JS_WHILE
-  false,//JS_WITH
-  false,//JS_EACH
-  false,//JS_FROM
-  false,//MOCHA_VERSIONOF
-  false,//JS_INCREMENT,
-  false,//JS_DECREMENT,
-  true,//JS_EQUAL,
-  true,//JS_SHIFT_LEFT,
-  true,//JS_SHIFT_RIGHT,
-  true,//JS_LESS_EQUAL,
-  true,//JS_GRATER_EQUAL,
-  true,//JS_EQ,
-  true,//JS_NOT_EQUAL,
-  true,//JS_NOT_EQ,
-  true,//JS_U_SHIFT_RIGHT,
-  true,//JS_ADD_LET,
-  true,//JS_SUB_LET,
-  true,//JS_DIV_LET,
-  true,//JS_MOD_LET,
-  true,//JS_MUL_LET,
-  true,//JS_LOGICAL_AND,
-  true,//JS_LOGICAL_OR,
-  true,//JS_SHIFT_LEFT_LET,
-  true,//JS_SHIFT_RIGHT_LET,
-  true,//JS_U_SHIFT_RIGHT_LET,
-  true,//JS_NOT_LET,
-  true,//JS_AND_LET,
-  true,//JS_OR_LET,
-  false,//JS_FUNCTION_GLYPH,
-  false,//JS_FUNCTION_GLYPH_WITH_CONTEXT
-  false,//TOKEN::JS_IDENTIFIER,
-  false,//TOKEN::JS_NUMERIC_LITERAL,
-  false,//TOKEN::JS_STRING_LITERAL,
-  false,//TOKEN::JS_REGEXP_LITERAL,
-  false,//TOKEN::JS_LINE_BREAK,
-  false,//TOKEN::JS_SET,
-  false,//TOKEN::JS_GET,
-  false,//ILLEGAL
-  false,//END_OF_INPUT
-  false//END_TOKEN
-};
-
-int keywords_length = sizeof (reserved_words) / sizeof (reserved_words[ 0 ]);
-int builtin_length = sizeof(builtins) / sizeof(builtins[ 0 ]);
-
-void JsToken::Initialize() {
-  for (int i = 0; i < keywords_length; i++) {
-    int id = i + (ASCII_MAX_RANGE + 1);
-    reserved_map_.insert(TokenEntry(reserved_words[ i ], id));
-  }
-  for (int i = 0; i < builtin_length; i++) {
-    builtin_map_.insert(TokenEntry(builtins[ i ], 1));
-  }
-}
-
-bool JsToken::IsBinaryOperatorNoIn(int token) {
-  return binary_operator[ token ];
-}
-
-bool JsToken::IsBinaryOperator(int token) {
-  return (token == Token::JS_IN || token == Token::JS_INSTANCEOF)? true : binary_operator[ token ];
-}
-
-int JsToken::GetType (const char* token, bool is_operator) {
-  if (is_operator && strlen(token) == 1) {
-    return token[ 0 ];
-  } else {
-    ReservedTokenTable::iterator finded = reserved_map_.find(token);
-    if (finded != reserved_map_.end()) {
-      return finded->second;
-    }
-    return (is_operator)? 0 : Token::JS_IDENTIFIER;
-  }
-}
-
-bool JsToken::IsBuiltin(const char* token) {
-  BuiltinTokenTable::iterator find = builtin_map_.find(token);
-  if (find != builtin_map_.end()) {
-    return true;
-  }
-  return false;
-}
-
-bool JsToken::IsReserved(const char* token) {
-  ReservedTokenTable::iterator find = reserved_map_.find(token);
-  if (find != reserved_map_.end()) {
-    return true;
-  }
-  return false;
-}
-
-const char* JsToken::GetTokenFromNumber(int id) {
-  int token_id = id - (ASCII_MAX_RANGE + 1);
-  if (token_id < keywords_length) {
-    return reserved_words[ token_id ];
-  }
-  return 0;
-}
-
-JsToken::ReservedTokenTable JsToken::reserved_map_;
-JsToken::BuiltinTokenTable JsToken::builtin_map_;
-os::Mutex JsToken::mutex_;
-
-TokenConverter::TokenConverter(TokenInfo* info) : info_(info){}
-
-const char* TokenConverter::cstr() {
-  buffer_.clear();
-  if (info_->type() > 127) {
-    return info_->token();
-  } else {
-    buffer_ += info_->type();
-    return buffer_.c_str();
-  }
-}
-
-
-}
diff --git a/src/mocha/roaster/tokens/js_token.h b/src/mocha/roaster/tokens/js_token.h
deleted file mode 100755
index 7fb5d65..0000000
--- a/src/mocha/roaster/tokens/js_token.h
+++ /dev/null
@@ -1,152 +0,0 @@
-#ifndef mocha_js_token_h_
-#define mocha_js_token_h_
-#include <mocha/roaster/misc/class_traits/static.h>
-#include <mocha/roaster/platform/thread/thread.h>
-#include <mocha/roaster/lib/unordered_map.h>
-namespace mocha{
-class TokenInfo;
-//Bison compatible token list.
-class Token : private Static {
- public :
-  enum {
-    JS_ABSTRACT = 128,//Token index begin from the out of ascii code range.
-    JS_BOOLEAN,
-    JS_BREAK,
-    JS_BYTE,
-    JS_CASE,
-    JS_CATCH,
-    JS_CHAR,
-    JS_CLASS,
-    JS_CONST,
-    JS_CONTINUE,
-    JS_DEBUGGER,
-    JS_DEFAULT,
-    JS_DELETE,
-    JS_DO,
-    JS_DOUBLE,
-    JS_ELSE,
-    JS_ENUM,
-    JS_EXPORT,
-    JS_EXTENDS,
-    JS_FALSE,
-    JS_FINAL,
-    JS_FINALLY,
-    JS_FLOAT,
-    JS_FOR,
-    JS_FUNCTION,
-    JS_GOTO,
-    JS_IF,
-    JS_IMPLEMENTS,
-    JS_IMPORT,
-    JS_IN,
-    JS_INSTANCEOF,
-    JS_INT,
-    JS_INTERFACE,
-    JS_LET,
-    JS_LONG,
-    JS_MODULE,
-    JS_NAN,
-    JS_NATIVE,
-    JS_NEW,
-    JS_K_NULL,
-    JS_PACKAGE_RESERVED,
-    JS_PRIVATE,
-    JS_PROTECTED,
-    JS_PUBLIC,
-    JS_RETURN,
-    JS_SHORT,
-    JS_STATIC,
-    JS_SUPER,
-    JS_SWITCH,
-    JS_SYNCHRONIZED,
-    JS_THIS,
-    JS_THROW,
-    JS_THROWS,
-    JS_TRANSIENT,
-    JS_TRUE,
-    JS_TRY,
-    JS_TYPEOF,
-    JS_VAR,
-    JS_VOID,
-    JS_VOLATILE,
-    JS_WHILE,
-    JS_WITH,
-    JS_EACH,
-    JS_YIELD,
-    JS_ASSERT,
-    MOCHA_VERSIONOF,
-    MOCHA_PRAGMA,
-    JS_INCREMENT,
-    JS_DECREMENT,
-    JS_EQUAL,
-    JS_SHIFT_LEFT,
-    JS_SHIFT_RIGHT,
-    JS_LESS_EQUAL,
-    JS_GREATER_EQUAL,
-    JS_EQ,
-    JS_NOT_EQUAL,
-    JS_NOT_EQ,
-    JS_U_SHIFT_RIGHT,
-    JS_ADD_LET,
-    JS_SUB_LET,
-    JS_DIV_LET,
-    JS_MOD_LET,
-    JS_MUL_LET,
-    JS_LOGICAL_AND,
-    JS_LOGICAL_OR,
-    JS_SHIFT_LEFT_LET,
-    JS_SHIFT_RIGHT_LET,
-    JS_U_SHIFT_RIGHT_LET,
-    JS_NOT_LET,
-    JS_AND_LET,
-    JS_OR_LET,
-    JS_FUNCTION_GLYPH,
-    JS_FUNCTION_GLYPH_WITH_CONTEXT,
-    JS_IDENTIFIER,
-    JS_NUMERIC_LITERAL,
-    JS_STRING_LITERAL,
-    JS_REGEXP_LITERAL,
-    JS_LINE_BREAK,
-    JS_SET,
-    JS_GET,
-    JS_PARAMETER_REST,
-    ILLEGAL,
-    END_OF_INPUT,
-    END_TOKEN = -1,
-  };
-};
-
-class JsToken : private Static {
-  typedef std::pair<std::string,int> TokenEntry;
-  typedef roastlib::unordered_map<std::string,int> ReservedTokenTable;
-  typedef roastlib::unordered_map<std::string,int> BuiltinTokenTable;
- public:
-  static bool IsBinaryOperatorNoIn(int token);
-  static bool IsBinaryOperator(int token);
-  static int GetType(const char* token, bool isOperator = false);
-  static bool IsBuiltin(const char* token);
-  static bool IsReserved(const char* token);
-  static const char* GetTokenFromNumber(int id);
-  static void Initialize();
- private :
-  static os::Mutex mutex_;
-  static ReservedTokenTable reserved_map_;
-  static BuiltinTokenTable builtin_map_;
-};
-
-
-class TokenConverter {
- public :
-  TokenConverter(TokenInfo* info);
-  ~TokenConverter(){}
-  const char* cstr();
- private :
-  std::string buffer_;
-  TokenInfo* info_;
-};
-
-}
-
-#endif
-
-
diff --git a/src/mocha/roaster/tokens/symbol_list.cc b/src/mocha/roaster/tokens/symbol_list.cc
deleted file mode 100755
index 56eedff..0000000
--- a/src/mocha/roaster/tokens/symbol_list.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-#include <mocha/roaster/tokens/symbol_list.h>
-
-namespace mocha {
-
-static const char runtime[][50] = {
-  "_mochaGlobalExport",
-  "_mochaGlobalAlias",
-  "_mochaLocalExport",
-  "_mochaLocalTmp",
-  "_mochaPrivateHolder",
-  "toArray",
-  "Runtime",
-  "createUnenumProp",
-  "__typeid__",
-  "constant",
-  "__private__",
-  "extendClass",
-  "extendPrototype",
-  "__MODULE__",
-  "__FILE__",
-  "__LINE__",
-  "_yieldState",
-  "next",
-  "send",
-  "exceptionHandler",
-  "_yieldResult",
-  "_isYieldSend",
-  "_isYieldSafe",
-  "_mochaGenerator",
-  "_mochaIsNewBorn",
-  "StopIteration",
-  "throwException",
-  "close",
-  "_mochaFinallyCache",
-  "_mochaCatchCache",
-  "_mochaException",
-  "createGenerator",
-  "__nothrowNext__",
-  "extend",
-  "assert",
-  "__ref_iterator__",
-  "throwStopIteration",
-  "hasIterator",
-  "getIterator",
-  "__typeid__",
-  "getUid",
-  "createPrivateRecord",
-  "getPrivateRecord",
-  "_mochaSuper",
-  "getSuper",
-  "__harmony_class__",
-  "_mochaTraitPrivate",
-  "_mochaTraitPublic",
-  "_mochaTraitMark",
-  "traitMixin",
-  "_mochaRequires",
-  "classMixin",
-  "checkRequirements",
-  "createTuple",
-  "createRecord",
-  "initializeClass"
-};
-
-static const char builtin[][50] = {
-  "arguments",
-  "undefined",
-  "constructor",
-  "this",
-  "apply",
-  "call",
-  "prototype",
-  "length",
-  "true",
-  "false",
-  "bind",
-  "push",
-  "trait",
-  "from",
-  "of",
-  "NaN",
-  "Function",
-  "Array",
-  "Object",
-  "String",
-  "Number"
-};
-
-
-const char* SymbolList::symbol(RuntimeSymbol runtime_symbol) {
-  return runtime[ runtime_symbol ];
-}
-const char* SymbolList::symbol(BuiltinSymbol builtin_symbol) {
-  return builtin[ builtin_symbol ];
-}
-
-}
diff --git a/src/mocha/roaster/tokens/symbol_list.h b/src/mocha/roaster/tokens/symbol_list.h
deleted file mode 100755
index 79a89f5..0000000
--- a/src/mocha/roaster/tokens/symbol_list.h
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef mocha_symbol_list_h_
-#define mocha_symbol_list_h_
-#include <mocha/roaster/misc/class_traits/static.h>
-namespace mocha {
-
-class SymbolList : private Static {
- public :
-  typedef enum {
-    kGlobalExport,
-    kGlobalAlias,
-    kLocalExport,
-    kLocalTmp,
-    kPrivateHolder,
-    kToArray,
-    kRuntime,
-    kCreateUnenumProp,
-    kTypeId,
-    kConstant,
-    kPrivateField,
-    kExtendClass,
-    kExtendPrototype,
-    kScopeModule,
-    kFile,
-    kLine,
-    kYieldState,
-    kYieldNext,
-    kYieldSend,
-    kExceptionHandler,
-    kYieldResult,
-    kYieldSendFlag,
-    kYieldSafeFlag,
-    kGenerator,
-    kIsNewBorn,
-    kStopIteration,
-    kThrowException,
-    kClose,
-    kFinallyCache,
-    kCatchCache,
-    kException,
-    kCreateGenerator,
-    kNoThrow,
-    kExtend,
-    kAssert,
-    kIteratorKey,
-    kThrowStopIteration,
-    kHasIterator,
-    kGetIterator,
-    kTypeid,
-    kGetUid,
-    kCreatePrivateRecord,
-    kGetPrivateRecord,
-    kSuper,
-    kGetSuper,
-    kClassMark,
-    kTraitPrivate,
-    kTraitPublic,
-    kTraitMark,
-    kMixin,
-    kRequires,
-    kClassMixin,
-    kCheckRequirements,
-    kCreateTuple,
-    kCreateRecord,
-    kInitializeClass
-  } RuntimeSymbol;
-
-  typedef enum {
-    kArguments,
-    kUndefined,
-    kConstructor,
-    kThis,
-    kApply,
-    kCall,
-    kPrototype,
-    kLength,
-    kTrue,
-    kFalse,
-    kBind,
-    kPush,
-    kTrait,
-    kFrom,
-    kOf,
-    kNaN,
-    kFunctionConstructor,
-    kArrayConstructor,
-    kObjectConstructor,
-    kStringConstructor,
-    kNumberConstructor
-  } BuiltinSymbol;
-
-  static const char* symbol(RuntimeSymbol runtime_symbol);
-  static const char* symbol(BuiltinSymbol builtin_symbol);
-};
-
-}
-
-#endif
diff --git a/src/mocha/roaster/tokens/token_info.cc b/src/mocha/roaster/tokens/token_info.cc
deleted file mode 100755
index 8eed572..0000000
--- a/src/mocha/roaster/tokens/token_info.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <mocha/roaster/tokens/token_info.h>
-#include <mocha/roaster/ast/ast.h>
-
-using namespace mocha;
-
-TokenInfo::TokenInfo(){};
-TokenInfo::TokenInfo(const char* token, int type, int64_t line)
-    : type_(type),
-      line_(line),
-      value_(token){};
-
-TokenInfo::TokenInfo(const std::string& token, int type, int64_t line)
-    : type_(type),
-      line_(line),
-      value_(token){};
-
-TokenInfo::TokenInfo(const std::stringstream& token, int type, int64_t line)
-    : type_(type),
-      line_(line),
-      value_(token.str()){};
-
-TokenInfo& TokenInfo::operator = (const TokenInfo& info) {
-  type_ = info.type_;
-  line_ = info.line_;
-  value_ = info.value_;
-  compressed_value_ = info.compressed_value_;
-  flags_ = info.flags_;
-  return (*this);
-}
-
-TokenInfo::~TokenInfo(){}
-
diff --git a/src/mocha/roaster/tokens/token_info.h b/src/mocha/roaster/tokens/token_info.h
deleted file mode 100755
index 396bfe3..0000000
--- a/src/mocha/roaster/tokens/token_info.h
+++ /dev/null
@@ -1,55 +0,0 @@
-
-#ifndef mocha_token_info_h_
-#define mocha_token_info_h_
-#include <string>
-#include <sstream>
-#include <mocha/roaster/misc/bits.h>
-#include <mocha/misc/int_types.h>
-#include <mocha/roaster/memory/pool.h>
-#define SET(num) flags_.Set(num);
-#define HAS(num) flags_.At(num);
-namespace mocha {
-class CompilerInfo;
-class TokenInfo : public memory::Allocated {
- public:
-  TokenInfo();
-  TokenInfo(const char* val, int type, int64_t line);
-  TokenInfo(const std::string& val, int type, int64_t line);
-  TokenInfo(const std::stringstream& val, int type, int64_t line);
-  TokenInfo& operator = (const TokenInfo& info);
-  ~TokenInfo();
-  const char* token() const { return value_.c_str(); }
-  inline const char* compressed_name() const { return (compressed_value_.size() > 0)? compressed_value_.c_str() : value_.c_str(); };
-  inline void set_compressed_name(const char* token) { compressed_value_ = token; }
-  inline void set_token(const char* token) { value_ = token; }
-  inline void set_token(const std::string& value) { value_ = value; }
-  inline void set_token(const std::stringstream& value) { value_ = value.str(); }
-  inline bool IsCompressed() const { return !compressed_value_.empty(); }
-  inline void Rollback() { compressed_value_.clear(); }
-  inline int type() const { return type_; };
-  inline void set_type(int type) { type_ = type; };
-  inline int64_t line_number() const { return line_; }
-  inline void set_const_declaration() { SET(0); }
-  inline bool const_declaration() const { return HAS(0); }
-  inline void set_let_declaration() { SET(1); }
-  inline bool let_declaration() const { return HAS(1); }
-  inline void set_compile_info(CompilerInfo* info) { info_ = info; }
-  inline CompilerInfo* compile_info() const { return info_; }
-  inline bool linebreak_before() const { return HAS(2); }
-  inline bool linebreak_after() const { return HAS(3); }
-  inline void set_linebreak_befor() { SET(2); }
-  inline void set_linebreak_after() { SET(3); }
- private:
-  int type_;
-  int64_t line_;
-  std::string value_;
-  std::string compressed_value_;
-  BitVector8 flags_;
-  CompilerInfo* info_;
-};
-
-}
-#undef SET
-#undef HAS
-#endif
-
diff --git a/src/mocha/roaster/utils/error_reporter.cc b/src/mocha/roaster/utils/error_reporter.cc
index a06c43f..848736e 100755
--- a/src/mocha/roaster/utils/error_reporter.cc
+++ b/src/mocha/roaster/utils/error_reporter.cc
@@ -17,6 +17,13 @@ void ErrorReporter::ReportSyntaxError(const char* error) {
   error_num_++;
 }

+void ErrorReporter::ReportSysError(const char* error) {
+  raw_list_.push_back(error);
+  std::string ret = error;
+  buffer_.push_back(ret);
+  error_num_++;
+}
+
 void ErrorReporter::SetError(std::string *buf) const {
   if (error_num_ > 0) {
     ErrorList::const_iterator begin = buffer_.begin(),end = buffer_.end();
diff --git a/src/mocha/roaster/utils/error_reporter.h b/src/mocha/roaster/utils/error_reporter.h
index 6b5a0f1..2b2e3af 100755
--- a/src/mocha/roaster/utils/error_reporter.h
+++ b/src/mocha/roaster/utils/error_reporter.h
@@ -1,5 +1,27 @@
-#ifndef mocha_js_error_reporter_h_
-#define mocha_js_error_reporter_h_
+/**
+ *@author Taketoshi Aono
+ *@fileOverview
+ *@license
+ *Copyright (c) 2011 Taketoshi Aono
+ *Licensed under the BSD.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ *associated doc umentation files (the "Software"), to deal in the Software without restriction,
+ *including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ *subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in all copies or
+ *substantial portions ofthe Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ *TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *DEALINGS IN THE SOFTWARE.
+ */
+#ifndef mocha_roaster_utils_error_reporter_h_
+#define mocha_roaster_utils_error_reporter_h_
 #include <string>
 #include <list>
 #include <mocha/roaster/misc/class_traits/uncopyable.h>
@@ -12,6 +34,7 @@ class ErrorReporter : private Uncopyable {
   ErrorReporter();
   ~ErrorReporter();
   void ReportSyntaxError(const char* error);
+  void ReportSysError(const char* error);
   bool Error() const { return error_num_ > 0; };
   void SetError(std::string *buf) const;
   void SetRawError(std::string *buf) const;
diff --git a/src/test/js/compress/#name_test-cmp.js# b/src/test/js/compress/#name_test-cmp.js#
deleted file mode 100755
index a70244f..0000000
--- a/src/test/js/compress/#name_test-cmp.js#
+++ /dev/null
@@ -1,886 +0,0 @@
-!function() {
-
-  var b = {};
-
-  !function ( f,g,h,i ) {
-    var c = f.prototype,
-        d = g.prototype,
-        j = h.prototype,
-        k = i.prototype;
-
-    "use strict";
-
-    function b( a ) {
-      try {
-        throw new TypeError( a );
-      } catch( e ){
-        throw new Error( e );
-      };
-    };
-
-    function e( c,d ) {
-
-      if ( typeof c !== "function" ){
-        b( d+" : first argument is not callable" );
-      };
-    };
-
-    if ( !Object.keys ){
-      Object.keys = function ( a ) {
-        if ( !a ){
-          b( "Object.keys : first arguments is null or not defined." );
-        };
-
-        var c = [],
-            d = -1;
-
-        for ( var e in a )
-        if ( a.hasOwnProperty( e ) ){
-          c[ ++ d] = a[e];
-        };
-        return c;
-      };
-    };
-
-    if ( !Object.preventExtensions ){
-      Object.preventExtensions = function ( a ) {
-        return a;
-      };
-    };
-
-    if ( !Object.seal ){
-      Object.seal = function ( a ) {
-        return a;
-      };
-    };
-
-    if ( !Object.freeze ){
-      Object.freeze = function ( a ) {
-        return a;
-      };
-    };
-
-    var l = function () {
-          var a;
-
-          try {
-            var b = {};
-
-            Object.defineProperty( b,"test", {
-              configurable : false,
-              writable : false,
-              enumerable : false,
-              value : 0
-            });
-
-            b.test = 200;
-
-            a = ( b.test === 200 )?false : true;
-          } catch( e ){
-            a = false;
-          };
-          return a;
-        }();
-
-    if ( !l ){
-      Object.defineProperty = function ( a,b,c ) {
-        if ( c.value ){
-          a[b] = c.value;
-        };
-      };
-    };
-
-    if ( !c.trim ){
-      c.trim = function () {
-        return this.replace( c.trim.rtrim,"" );
-      };
-
-      c.trim.rtrim = /^\s*|\s*$/g;
-    };
-
-    if ( !c.repeat ){
-      Object.defineProperty( c,"repeat", {
-        value : function m( a ) {
-          return Array( a+1 ).join( this.toString() );
-        },
-        configurable : true,
-        enumerable : false,
-        writable : true
-      });
-    };
-
-    if ( !c.startsWith ){
-      Object.defineProperty( c,"startsWith", {
-        value : function m( a ) {
-          return !this.indexOf( a );
-        },
-        configurable : true,
-        enumerable : false,
-        writable : true
-      });
-    };
-
-    if ( !c.endsWith ){
-      Object.defineProperty( c,"endsWith", {
-        value : function m( a ) {
-          var b = String( a );
-
-          var c = this.lastIndexOf( b );
-          return c >= 0 && c === this.length-b.length;
-        },
-        configurable : true,
-        enumerable : false,
-        writable : true
-      });
-    };
-
-    if ( !c.contains ){
-      Object.defineProperty( c,"contains", {
-        value : function m( a ) {
-          return this.indexOf( a ) !== -1;
-        },
-        configurable : true,
-        enumerable : false,
-        writable : true
-      });
-    };
-
-    if ( !c.toArray ){
-      Object.defineProperty( c,"toArray", {
-        value : function m( a ) {
-          return this.split( "" );
-        },
-        configurable : true,
-        enumerable : false,
-        writable : true
-      });
-    };
-
-    if ( !j.bind ){
-      j.bind = function () {
-        var a = d.slice.call( arguments ),
-            c = a.shift(),
-            b = function () {
-              var e = a.concat( d.slice.call( arguments ) );
-
-              if ( this !== null && this !== window && this instanceof b ){
-                return b.context.apply( this,e );
-              } else {
-                return b.context.apply( c,e );
-              };
-            };
-
-        b.prototype = this.prototype;
-
-        b.context = this;
-        return b;
-      };
-    };
-
-    if ( !d.forEach ){
-      d.forEach = function ( f,g ) {
-        e( f,"Array.forEach" );
-
-        var h = -1,
-            i;
-
-        if ( this === null ){
-          b( "Array.forEach : this is null or not defined" );
-        };
-
-        if ( g ){
-          while ( ( i = this[ ++ h] ) !== null && i !== undefined )f.call( g,i,h,this );
-        } else {
-          while ( ( i = this[ ++ h] ) !== null && i !== undefined )f( i,h,this );
-        };
-      };
-    };
-
-    if ( !d.every ){
-      d.every = function ( a,c ) {
-        e( a,"Array.every" );
-
-        var d = -1,
-            f;
-
-        if ( this === null ){
-          b( "Array.every : this is null or not defined" );
-        };
-
-        if ( c ){
-          while ( ( f = this[ ++ d] ) !== null && f !== undefined )if ( !( a.call( c,f,d,this ) ) ){
-            return false;
-          };
-        } else {
-          while ( ( f = this[ ++ d] ) !== null && f !== undefined )if ( !( a( f,d,this ) ) ){
-            return false;
-          };
-        };
-        return true;
-      };
-    };
-
-    if ( !d.some ){
-      d.some = function ( a,c ) {
-        e( a,"Array.some" );
-
-        var d = -1,
-            f;
-
-        if ( this === null ){
-          b( "Array.some : this is null or not defined" );
-        };
-
-        if ( c ){
-          while ( ( f = this[ ++ d] ) !== null && f !== undefined )if ( a.call( c,f,d,this ) ){
-            return true;
-          };
-        } else {
-          while ( ( f = this[ ++ d] ) !== null && f !== undefined )if ( a( f,d,this ) ){
-            return true;
-          };
-        };
-        return false;
-      };
-    };
-
-    if ( !d.filter ){
-      d.filter = function ( a,c ) {
-        e( a,"Array.filter" );
-
-        var d = this.length,
-            f = -1,
-            g = [],
-            h;
-
-        if ( this === null ){
-          b( "Array.filter : this is null or not defined" );
-        };
-
-        if ( c ){
-          for ( var i = 0,d = this.length;i<d; ++ i )
-          if ( ( h = this[i] ) !== null && h !== undefined ){
-            if ( a.call( c,h,i,this ) ){
-              g[ ++ f] = h;
-            };
-          };
-        } else {
-          for ( var i = 0,d = this.length;i<d; ++ i )if ( ( h = this[i] ) !== null && h !== undefined ){
-            if ( a( h,i,this ) ){
-              g[ ++ f] = h;
-            };
-          };
-        };
-        return g;
-      };
-    };
-
-    if ( !d.indexOf ){
-      d.indexOf = function ( a,c ) {
-        var d = c?c-1 : -1,
-            e = -1,
-            f;
-
-        if ( this === null ){
-          b( "Array.indexOf : this is null or not defined." );
-        };
-
-        while ( ( f = this[ ++ d] ) !== null && f !== undefined )if ( f === a ){
-          e = d;
-          break;
-        };
-        return e;
-      };
-    };
-
-    if ( !d.lastIndexOf ){
-      d.lastIndexOf = function ( a,c ) {
-        var d = this.length,
-            e = c?c+1 : d,
-            f = -1,
-            g;
-
-        if ( this === null ){
-          b( "Array.lastIndexOf : this is null or not defined." );
-        };
-
-        while ( ( g = this[ -- e] ) !== null && g !== undefined )if ( g === a ){
-          f = e;
-          break;
-        };
-        return f;
-      };
-    };
-
-    if ( !d.map ){
-      d.map = function ( a,c ) {
-        e( a,"Array.map" );
-
-        var d = [],
-            f = -1,
-            g = this.length,
-            h = 0,
-            i;
-
-        if ( this === null ){
-          b( "Array.map : this is null or not defined." );
-        };
-
-        if ( c ){
-          for ( h;h<g; ++ h )if ( ( i = this[h] ) !== null && i !== undefined ){
-            d[ ++ f] = a.call( c,i,h,this );
-          };
-        } else {
-          for ( h;h<g; ++ h )if ( ( i = this[h] ) !== null && i !== undefined ){
-            d[ ++ f] = a( i,h,this );
-          };
-        };
-        return d;
-      };
-    };
-
-    if ( !d.reduce ){
-      d.reduce = function ( a,c ) {
-        e( a,"Array.reduce" );
-
-        var d = c || this[0],
-            f = c?0 : 1,
-            g = this.length,
-            h;
-
-        if ( ( g === 0 || g === null ) && arguments.length<2 ){
-          b( "Array length is 0 and no second argument" );
-        };
-
-        for ( f;f<g; ++ f )if ( ( h = this[f] ) !== null && h !== undefined ){
-          d = a( d,h,f,this );
-        };
-        return d;
-      };
-    };
-
-    if ( !d.reduceRight ){
-      d.reduceRight = function ( a,c ) {
-        e( a,"Array.reduceRight" );
-
-        var d = this.length,
-            f = c || this[d-1],
-            g = c?d-1 : d-2,
-            h;
-
-        if ( ( d === 0 || d === null ) && arguments.length<2 ){
-          b( "Array length is 0 and no second argument" );
-        };
-
-        for ( g;g>-1; -- g )if ( ( h = this[g] ) !== null && h !== undefined ){
-          f = a( f,h,g,this );
-        };
-        return f;
-      };
-    };
-
-    if ( !k.toJSON ){
-      k.toJSON = function () {
-        var a = [this.getUTCMonth(),this.getUTCDate(),this.getUTCHours(),this.getMinutes(),this.getSeconds()],
-            b = a[0],
-            c = a[1],
-            d = a[2],
-            e = a[3],
-            f = a[4];
-        return '"'+this.getUTCFullYear()+'-'+( b>8?b+1 : "0"+( b+1 ) )+'-'+( c>9?c : "0"+c )+'T'+( d>9?d : "0"+d )+':'+( e>9?e : "0"+e )+':'+( f>9?f : "0"+f )+'.'+this.getUTCMilliseconds()+'Z"';
-      };
-    };
-
-    if ( !Date.now ){
-      Date.now = function () {
-        return +new Date();
-      };
-    };
-
-    if ( !Array.isArray ){
-      Array.isArray = function ( a ) {
-        if ( arguments.length === 0 ){
-          return false;
-        };
-        return a?Object.prototype.toString.call( a ) === "[object Array]" : false;
-      };
-    };
-  }.call( this,String,Array,Function,Date );
-
-  var a = function () {
-        "use strict";
-        var p = {};
-
-        function c( d,c,b ) {
-          this.toString = function () {
-            return a.getErrorMessage( b )+" in file "+c+" at : "+d;
-          };
-        }
-        var g = Math.max;
-
-        var a =  {
-              getErrorMessage : function q( a ) {
-                return ( a.message )?a.message : ( a.description )?a.description : a.toString();
-              },
-              exceptionHandler : function r( d,e,f ) {
-                if ( b( f ) ){
-                  this.throwException( f );
-                } else {
-                  this.throwException( new c( d,e,f ) );
-                };
-              },
-              throwException : function s( a ) {
-                try {
-                  throw a;
-                } catch( e ){
-                  if ( b( e ) ){
-                    throw new Error( e );
-                  } else {
-                    throw new Error( this.getErrorMessage( e ) );
-                  };
-                };
-              },
-              hasProto : "__proto__" in {}
-            };
-
-        var d = Array.prototype.slice;
-
-        function f( a,b,c ) {
-          return Object.defineProperty( a,b, {
-            configurable : true,
-            enumerable : false,
-            writable : true,
-            value : c
-          });
-        };
-
-        p.createUnenumProp = f;
-
-        function t( a,b,c ) {
-          return Object.defineProperty( a,b, {
-            configurable : false,
-            enumerable : false,
-            writable : false,
-            value : c
-          });
-        };
-
-        p.constant = t;
-
-        function u( e,f ) {
-          return e?d.call( e,f ) : [];
-        };
-
-        p.toArray = u;
-
-        var e = function (){};
-
-        function v( g,h,i ) {
-          var j = new e;
-
-          f( j,"next",g.bind( i,false,false ) );
-
-          f( j,"send",g.bind( i,true,false ) );
-
-          f( j,"close",h.bind( i ) );
-
-          f( j,"__nothrowNext__",g.bind( i,false,true ) );
-
-          f( j,"toString",
-          function () {
-            return "[object Generator]";
-          });
-
-          Object.freeze( j );
-          return j;
-        };
-
-        p.createGenerator = v;
-
-        function q( a ) {
-          return ( a.message )?a.message : ( a.description )?a.description : a.toString();
-        }
-        var s = p.throwException = a.throwException.bind( a );
-
-        var r = p.exceptionHandler = a.exceptionHandler.bind( a );
-
-        function w( a,b ) {
-          for ( var c in b )
-          a[c] = b[c];
-          return a;
-        };
-
-        p.extend = w;
-
-        function h( h ) {
-          var i = g( h.length,this.length ),
-              j = -1;
-
-          while (  ++ j<i && h[j] === this[j] )return i === j;
-        };
-
-        function i() {
-          return Array.prototype.slice.call( this );
-        };
-
-        function x( j,k ) {
-          f( j,"length",k );
-
-          f( j,"equal",h );
-
-          f( j,"toArray",i );
-
-          f( j,"toString",
-          function () {
-            return "[object Tuple]";
-          });
-          return Object.freeze( j );
-        };
-
-        p.createTuple = x;
-
-        function y( a ) {
-          if ( a.toString() === "[object Object]" ){
-            f( a,"toString",
-            function () {
-              return "[object Record]";
-            });
-          };
-          return Object.freeze( a );
-        };
-
-        p.createRecord = y;
-
-        var z = p.extendPrototype = function ( a,b ) {
-              a.prototype = b;
-            };
-
-        var j = ( "getPrototypeOf" in Object )?function ( a ) {
-              return Object.getPrototypeOf( a );
-            } : function ( a ) {
-              var b = {};
-
-              for ( var c in a )
-              if ( !a.hasOwnProperty( c ) ){
-                b[c] = a[c];
-              };
-              return b;
-            };
-
-        var A = p.extendClass = ( a.hasProto )?function ( a,b ) {
-              if ( typeof b === 'function' ){
-                a.prototype.__proto__ = b.prototype;
-
-                for ( var c in b )
-                a[c] = b[c];
-              } else {
-                a.prototype.__proto__ = b.__proto__;
-              };
-            } : function ( k,l ) {
-              var m = typeof l;
-
-              if ( m === "function" ){
-                var n = function (){};
-
-                n.prototype = l.prototype;
-
-                k.prototype = new n;
-
-                for ( var o in l )
-                k[o] = l[o];
-              } else {
-                var n = function (){},
-                    p = j( l );
-
-                n.prototype = p;
-
-                k.prototype = new n;
-              };
-            };
-
-        var k = p.__ref_iterator__ = "__mocha_iterator_special_key__";
-
-        function m() {
-          try {
-            throw StopIteration;
-          } catch( e ){
-            throw new Error( e.toString() );
-          };
-        };
-
-        p.throwStopIteration = m;
-
-        function l( a ) {
-          return a instanceof e;
-        };
-
-        p.isGenerator = l;
-
-        function B( n ) {
-          var a = n[k](),
-              o;
-
-          if ( l( a ) ){
-            return a;
-          };
-
-          o = {};
-
-          if ( a.next ){
-            f( o,"next",
-            function () {
-              var b = a.next();
-
-              if ( b === undefined ){
-                m();
-              };
-              return b;
-            });
-          } else {
-            return {};
-          };
-
-          if ( !( "__nothrowNext__" in a ) ){
-            f( o,"__nothrowNext__",a.next.bind( a ) );
-          };
-
-          for ( var p in a )
-          if ( p !== "next" && p !== "__nothrowNext__" ){
-            o[p] = a[p];
-          };
-
-          if ( !( "toString" in a ) ){
-            f( o,"toString",
-            function () {
-              return "[object Iterator]";
-            });
-          };
-          return o;
-        };
-
-        p.getIterator = B;
-
-        function C( a ) {
-          return k in a;
-        };
-
-        p.hasIterator = C;
-
-        var n = /StopIteration/;
-
-        function b( o ) {
-          return o === StopIteration || n.test( o );
-        };
-
-        p.isStopIteration = b;
-
-        var o,
-            D,
-            E;
-
-        if ( "WeakMap" in window ){
-          o = new WeakMap();
-
-          D = function ( self,p ) {
-            var q = new p;
-
-            f( q.constructor,"__is_private__",1 );
-
-            o.set( self,q );
-          };
-
-          E = function ( self ) {
-            if ( o.has( self ) ){
-              return o.get( self );
-            } else if ( self.constructor === "__is_private__" ){
-              return self;
-            };
-          };
-        } else {
-          D = function ( self,a ) {
-            if ( !self.__typeid__ ){
-              var b = new a;
-
-              f( b.constructor,"__is_private__",1 );
-
-              f( self,"__private__",b );
-            };
-          };
-
-          E = function ( self ) {
-            if ( self.__private__ ){
-              return self.__private__;
-            } else if ( self.constructor === "__is_private__" ){
-              return self;
-            };
-          };
-        };
-
-        p.createPrivateRecord = D;
-
-        p.getPrivateRecord = E;
-
-        function F( a ) {
-          var b = typeof a,
-              c;
-
-          if ( b === "function" ){
-            c = function (){};
-
-            c.prototype = a.prototype;
-
-            c = new c();
-
-            if ( a.__harmony_class__ ){
-              c.constructor = a.constructor;
-            } else {
-              c.constructor = a;
-            };
-            return c;
-          };
-          return c;
-        };
-
-        p.getSuper = F;
-
-        function G( b,c,d,e ) {
-          if ( !b._mochaTraitMark || !c._mochaTraitMark ){
-            a.throwException( "mixin only used for trait." );
-          } else {
-            var f = b._mochaTraitPrivate,
-                g = c._mochaTraitPrivate,
-                h = b._mochaTraitPublic,
-                i = c._mochaTraitPublic,
-                j = c._mochaRequires,
-                k = b._mochaRequires,
-                l;
-
-            for ( var m in g )if ( !e[m] ){
-              l = ( !d[m] )?m : d[m];
-
-              f[l] = g[m];
-            };
-
-            for ( m in i )if ( !e[m] ){
-              l = ( !d[m] )?m : d[m];
-
-              h[l] = i[m];
-            };
-
-            for ( m in j )k[m] = j[m];
-          };
-        };
-
-        p.traitMixin = G;
-
-        function H( b,c,d,e,f ) {
-          var g = b.prototype,
-              h = c.prototype,
-              i = d._mochaTraitMark,
-              j = d._mochaTraitPublic,
-              k = d._mochaTraitPrivate;
-
-          if ( !i ){
-            a.throwException( "mixin only used for trait." );
-          } else {
-            var l;
-
-            for ( var m in j )if ( !f[m] ){
-              l = ( !e[m] )?m : e[m];
-
-              g[l] = j[m];
-            };
-
-            for ( m in k )if ( !f[m] ){
-              l = ( !e[m] )?m : e[m];
-
-              h[l] = k[m];
-            };
-          };
-        };
-
-        p.classMixin = H;
-
-        function I( b,c,d,e,f ) {
-          var g = b.prototype,
-              h = c.prototype;
-
-          for ( var i = 0,j = d.length;i<j;i ++  ){
-            var k = d[i],
-                l = k._mochaRequires;
-
-            for ( var m in l )
-            if ( !( m in g ) && !( m in h ) ){
-              a.throwException( "Class dose not meet the traits requirement. traits require implementation of property "+m+"\nin file "+e+" at line "+f );
-            };
-          };
-        };
-
-        p.checkRequirements = I;
-        return p;
-      }();
-
-  if ( !( "StopIteration" in window ) ){
-    window.StopIteration =  {
-      toString : function c() {
-        return "[object StopIteration]";
-      }
-    };
-  };
-
-  !function () {
-    b['./#name_test.js#'] = {};
-
-    var c = b['./#name_test.js#'];
-
-    function a(){}
-    !function () {
-      var b = 0;
-
-      var c = function () {
-            a();
-          };
-
-      var d = function () {
-            var b,
-                c;
-
-            c = a();
-          };
-    }();
-
-    var d = 700;
-
-    var e = 210.640300;
-
-    var f = 2340.879050;
-
-    e = 249000.132134;
-
-    var g = 100+200*e;
-
-    var h = 200;
-
-    var i = NaN;
-
-    var j = {};
-
-    j = {};
-
-    j = '';
-
-    j = '';
-
-    j = [];
-
-    j = [];
-
-    j = Array( 3 );
-
-    j = Function( "" );
-
-    j = 0;
-
-    j = 0;
-  }();
-}();
diff --git a/src/test/js/path_array-cmp-cmp-cmp-cmp.js b/src/test/js/path_array-cmp-cmp-cmp-cmp.js
deleted file mode 100755
index 7cb8ea9..0000000
--- a/src/test/js/path_array-cmp-cmp-cmp-cmp.js
+++ /dev/null
@@ -1,7656 +0,0 @@
-(function() {
-  var __FILE__ = "Runtime",
-      __LINE__ = 0;
-
-  var _mochaGlobalExport = {},
-      _mochaClassTable = {};
-
-  var Runtime = ( function Runtime() {
-        var _mochaLocalExport = {};
-
-        function Exception( line,file,e ) {
-          this.toString = function () {
-            return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-          };
-        }
-        var Runtime =  {
-              getErrorMessage : function getErrorMessage( e ) {
-                return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-              },
-              exceptionHandler : function exceptionHandler( line,file,e ) {
-                this.throwException( new Exception( line,file,e ) );
-              },
-              throwException : function throwException( exception ) {
-                try {
-                  throw exception;
-                } catch( e ){
-                  throw new Error( this.getErrorMessage( e ) );
-                };
-              }
-            };
-
-        if ( !String.prototype.trim ){
-          String.prototype.trim = function () {
-            return this.replace( String.prototype.trim.rtrim,"" );
-          };
-
-          String.prototype.trim.rtrim = /^\s*|\s*$/g;
-        };
-
-        if ( !Function.prototype.bind ){
-          Function.prototype.bind = function () {
-            var argArray = Array.prototype.slice.call( arguments ),
-                context = argArray.shift(),
-                ret = function () {
-                  var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                  if ( this instanceof ret ){
-                    return ret.context.apply( this,args );
-                  } else {
-                    return ret.context.apply( context,args );
-                  };
-                };
-
-            ret.prototype = this.prototype;
-
-            ret.context = this;
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.forEach ){
-          Array.prototype.forEach = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn.call( that,ta,iter,this );
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn( ta,iter,this );
-              };
-            };
-          };
-        };
-
-        if ( !Array.prototype.every ){
-          Array.prototype.every = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn.call( that,ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn( ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            };
-            return true;
-          };
-        };
-
-        if ( !Array.prototype.some ){
-          Array.prototype.some = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn.call( that,ta,iter,this ) ){
-                  return true;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn( ta,iter,this ) ){
-                  return true;
-                };
-              };
-            };
-            return false;
-          };
-        };
-
-        if ( !Array.prototype.filter ){
-          Array.prototype.filter = function ( fn,that ) {
-            var iter = -1,
-                ret = [],
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn.call( that,ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn( ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.indexOf ){
-          Array.prototype.indexOf = function ( subject ) {
-            var iter = -1,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.lastIndexOf ){
-          Array.prototype.lastIndexOf = function ( subject ) {
-            var iter = this.length,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.map ){
-          Array.prototype.map = function ( fn,that ) {
-            var ret = [],
-                iter = -1,
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn.call( that,ta,i,this );
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn( ta,i,this );
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduce ){
-          Array.prototype.reduce = function ( fn,initial ) {
-            var ret = initial || this[0],
-                i = ( ( initial ) )?0 : 1,
-                ta,
-                len;
-
-            for ( i , len = this.length;i<len; ++ i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduceRight ){
-          Array.prototype.reduceRight = function ( fn,initial ) {
-            var ret = initial || this[this.length-1],
-                i = ( ( initial ) )?this.length-1 : this.length-2,
-                ta;
-
-            for ( i;i>-1; -- i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Date.prototype.toJSON ){
-          Date.prototype.toJSON = function () {
-            return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-          };
-        };
-
-        if ( !Date.now ){
-          Date.now = function () {
-            return +new Date();
-          };
-        };
-
-        if ( !Object.keys ){
-          Object.keys = function ( obj ) {
-            var ret = [],
-                iter = -1;
-
-            for ( var i in obj ){
-              if ( obj.hasOwnProperty( i ) ){
-                ret[ ++ iter] = obj[i];
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Object.preventExtensions ){
-          Object.preventExtensions = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.seal ){
-          Object.seal = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.freeze ){
-          Object.freeze = function ( o ) {
-            return o;
-          };
-        };
-
-        var hasRealEcma5 = ( function () {
-              try {
-                var obj = {};
-
-                Object.defineProperty( obj,"test", {
-                  configurable : false,
-                  writable : false,
-                  enumerable : false,
-                  value : 0
-                });
-
-                obj.test = 200;
-                return ( ( obj.test === 200 ) )?false : true;
-              } catch( e ){
-                return false;
-              };
-            })();
-
-        if ( !hasRealEcma5 ){
-          Object.defineProperty = function ( obj,prop,valobj ) {
-            if ( valobj.value ){
-              obj[prop] = valobj.value;
-            };
-          };
-        };
-
-        if ( !Array.isArray ){
-          var arrayString = "[object Array]";
-
-          Array.isArray = function ( arr ) {
-            if ( arguments.length === 0 ){
-              return false;
-            };
-            return ( ( arr ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-          };
-        };
-
-        var slice = Array.prototype.slice;
-
-        var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : true,
-                enumerable : false,
-                writable : true,
-                value : value
-              });
-            };
-
-        var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : false,
-                enumerable : false,
-                writable : false,
-                value : value
-              });
-            };
-
-        var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-              return ( ( likeArray ) )?slice.call( likeArray,index ) : [];
-            };
-
-        var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-              isKeyOnly = isKeyOnly || false;
-
-              var iter = {},
-                  isArray,
-                  ret,
-                  index = 0;
-
-              if ( this instanceof Iterator ){
-                isArray = Array.isArray( obj );
-
-                ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-              } else {
-                return _userdefIterator( obj,isKeyOnly );
-              };
-
-              createUnenumProp( iter,"next",
-              function () {
-                return ret[index ++ ];
-              });
-              return iter;
-            };
-
-        var _objectIterator = function ( obj,isKeyOnly ) {
-              var ret = [],
-                  iter = -1;
-
-              if ( isKeyOnly ){
-                for ( var prop in obj ){
-                  ret[ ++ iter] = prop;
-                };
-              } else {
-                for ( var prop in obj ){
-                  ret[ ++ iter] = [prop,obj[prop]];
-                };
-              };
-              return ret;
-            },
-            _arrayIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj[i]];
-                };
-              };
-              return ret;
-            },
-            _stringIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj.charAt( i )];
-                };
-              };
-              return ret;
-            },
-            _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-              var type = typeof obj;
-
-              if ( type === "object" && !isArray ){
-                return _objectIterator( obj,isKeyOnly );
-              } else if ( isArray ){
-                return _arrayIterator( obj,isKeyOnly );
-              } else if ( type === "string" ){
-                return _stringIterator( obj,isKeyOnly );
-              };
-            },
-            _userdefIterator = function ( obj,isKeyOnly ) {
-              if ( "__iterator__" in obj ){
-                return obj.__iterator__( isKeyOnly );
-              } else {
-                return  {
-                  next : function () {
-                    try {
-                      throw new StopIteration;
-                    } catch( e ){
-                      throw new Error( e );
-                    };
-                  }
-                };
-              };
-            };
-
-        var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-              var ret = {};
-
-              createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-              createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-              createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-              createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-              createUnenumProp( ret,"toString",
-              function () {
-                return "[object Generator]";
-              });
-
-              Object.freeze( ret );
-              return ret;
-            };
-
-        var getErrorMessage = function ( e ) {
-              return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-            };
-
-        var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-        var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-        ( function () {
-          var assert = _mochaLocalExport.assert = ( ( console && console.assert ) )?function ( expect,exp,str,line ) {
-                return console.assert( expect === exp,str+"\nat : "+line );
-              } : function ( expect,exp,str,line ) {
-                if ( expect !== exp ){
-                  Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                };
-              };
-        })();
-        return _mochaLocalExport;
-      })();
-
-  var StopIteration =  {
-        toString : function toString() {
-          return "StopIteration";
-        }
-      };
-
-  __LINE__ = 0;
-  ( function () {
-    try {
-      var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp-cmp-cmp.js",
-          __LINE__ = 0;
-      __LINE__ = 2;
-      _mochaGlobalExport['./path_array-cmp-cmp-cmp.js'] = {};
-
-      __LINE__ = 3;
-      var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp-cmp-cmp.js'];
-
-      __LINE__ = 1;
-      ( function () {
-        try {
-          __LINE__ = 2;
-          var __FILE__ = "Runtime",
-              __LINE__ = 0;
-
-          __LINE__ = 5;
-          var _mochaGlobalExport = {},
-              _mochaClassTable = {};
-
-          __LINE__ = 8;
-          var Runtime = ( function Runtime() {
-                try {
-                  __LINE__ = 9;
-                  var _mochaLocalExport = {};
-
-                  function Exception( line,file,e ) {
-                    try {
-                      __LINE__ = 12;
-                      this.toString = function () {
-                        try {
-                          __LINE__ = 13;
-                          return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  }
-                  __LINE__ = 16;
-                  var Runtime =  {
-                        getErrorMessage : function getErrorMessage( e ) {
-                          try {
-                            __LINE__ = 18;
-                            return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        exceptionHandler : function exceptionHandler( line,file,e ) {
-                          try {
-                            __LINE__ = 21;
-                            this.throwException( new Exception( line,file,e ) );
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        throwException : function throwException( exception ) {
-                          try {
-                            try {
-                              __LINE__ = 25;
-                              throw exception;
-                            } catch( e ){
-                              __LINE__ = 27;
-                              throw new Error( this.getErrorMessage( e ) );
-                            };
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        }
-                      };
-
-                  __LINE__ = 32;
-                  if ( !String.prototype.trim ){
-                    __LINE__ = 33;
-                    String.prototype.trim = function () {
-                      try {
-                        __LINE__ = 34;
-                        return this.replace( String.prototype.trim.rtrim,"" );
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-
-                    __LINE__ = 37;
-                    String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                  };
-
-                  __LINE__ = 40;
-                  if ( !Function.prototype.bind ){
-                    __LINE__ = 41;
-                    Function.prototype.bind = function () {
-                      try {
-                        __LINE__ = 42;
-                        var argArray = Array.prototype.slice.call( arguments ),
-                            context = argArray.shift(),
-                            ret = function () {
-                              try {
-                                __LINE__ = 45;
-                                var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                __LINE__ = 47;
-                                if ( this instanceof ret ){
-                                  __LINE__ = 48;
-                                  return ret.context.apply( this,args );
-                                } else {
-                                  __LINE__ = 50;
-                                  return ret.context.apply( context,args );
-                                };
-                              } catch( e ){
-                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                              }
-                            };
-
-                        __LINE__ = 54;
-                        ret.prototype = this.prototype;
-
-                        __LINE__ = 56;
-                        ret.context = this;
-                        __LINE__ = 57;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 61;
-                  if ( !Array.prototype.forEach ){
-                    __LINE__ = 62;
-                    Array.prototype.forEach = function ( fn,that ) {
-                      try {
-                        __LINE__ = 63;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 66;
-                        if ( that ){
-                          __LINE__ = 67;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 68;
-                            fn.call( that,ta,iter,this );
-                          };
-                        } else {
-                          __LINE__ = 71;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 72;
-                            fn( ta,iter,this );
-                          };
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 78;
-                  if ( !Array.prototype.every ){
-                    __LINE__ = 79;
-                    Array.prototype.every = function ( fn,that ) {
-                      try {
-                        __LINE__ = 80;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 83;
-                        if ( that ){
-                          __LINE__ = 84;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 85;
-                            if ( !( fn.call( that,ta,iter,this ) ) ){
-                              __LINE__ = 86;
-                              return false;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 90;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( !( fn( ta,iter,this ) ) ){
-                              __LINE__ = 92;
-                              return false;
-                            };
-                          };
-                        };
-                        __LINE__ = 96;
-                        return true;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 100;
-                  if ( !Array.prototype.some ){
-                    __LINE__ = 101;
-                    Array.prototype.some = function ( fn,that ) {
-                      try {
-                        __LINE__ = 102;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 105;
-                        if ( that ){
-                          __LINE__ = 106;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 107;
-                            if ( fn.call( that,ta,iter,this ) ){
-                              __LINE__ = 108;
-                              return true;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 112;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( fn( ta,iter,this ) ){
-                              __LINE__ = 114;
-                              return true;
-                            };
-                          };
-                        };
-                        __LINE__ = 118;
-                        return false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 122;
-                  if ( !Array.prototype.filter ){
-                    __LINE__ = 123;
-                    Array.prototype.filter = function ( fn,that ) {
-                      try {
-                        __LINE__ = 124;
-                        var iter = -1,
-                            ret = [],
-                            ta;
-
-                        __LINE__ = 128;
-                        if ( that ){
-                          __LINE__ = 129;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 130;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 131;
-                              if ( fn.call( that,ta,i,this ) ){
-                                __LINE__ = 132;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        } else {
-                          __LINE__ = 137;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              if ( fn( ta,i,this ) ){
-                                __LINE__ = 140;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        };
-                        __LINE__ = 145;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 149;
-                  if ( !Array.prototype.indexOf ){
-                    __LINE__ = 150;
-                    Array.prototype.indexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 151;
-                        var iter = -1,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 155;
-                        while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 156;
-                          if ( ta === subject ){
-                            __LINE__ = 157;
-                            index = iter;
-                            __LINE__ = 158;
-                            break;
-                          };
-                        };
-                        __LINE__ = 161;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 165;
-                  if ( !Array.prototype.lastIndexOf ){
-                    __LINE__ = 166;
-                    Array.prototype.lastIndexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 167;
-                        var iter = this.length,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 171;
-                        while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 172;
-                          if ( ta === subject ){
-                            __LINE__ = 173;
-                            index = iter;
-                            __LINE__ = 174;
-                            break;
-                          };
-                        };
-                        __LINE__ = 177;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 181;
-                  if ( !Array.prototype.map ){
-                    __LINE__ = 182;
-                    Array.prototype.map = function ( fn,that ) {
-                      try {
-                        __LINE__ = 183;
-                        var ret = [],
-                            iter = -1,
-                            ta;
-
-                        __LINE__ = 187;
-                        if ( that ){
-                          __LINE__ = 188;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 189;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 190;
-                              ret[ ++ iter] = fn.call( that,ta,i,this );
-                            };
-                          };
-                        } else {
-                          __LINE__ = 194;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 196;
-                              ret[ ++ iter] = fn( ta,i,this );
-                            };
-                          };
-                        };
-                        __LINE__ = 200;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 204;
-                  if ( !Array.prototype.reduce ){
-                    __LINE__ = 205;
-                    Array.prototype.reduce = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 206;
-                        var ret = initial || this[0],
-                            i = ( ( ( initial ) ) )?0 : 1,
-                            ta,
-                            len;
-
-                        __LINE__ = 211;
-                        for ( i , len = this.length;i<len; ++ i ){
-                          __LINE__ = 212;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 213;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 216;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 220;
-                  if ( !Array.prototype.reduceRight ){
-                    __LINE__ = 221;
-                    Array.prototype.reduceRight = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 222;
-                        var ret = initial || this[this.length-1],
-                            i = ( ( ( initial ) ) )?this.length-1 : this.length-2,
-                            ta;
-
-                        __LINE__ = 226;
-                        for ( i;i>-1; -- i ){
-                          __LINE__ = 227;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 228;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 231;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 235;
-                  if ( !Date.prototype.toJSON ){
-                    __LINE__ = 236;
-                    Date.prototype.toJSON = function () {
-                      try {
-                        __LINE__ = 237;
-                        return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 241;
-                  if ( !Date.now ){
-                    __LINE__ = 242;
-                    Date.now = function () {
-                      try {
-                        __LINE__ = 243;
-                        return +new Date();
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 247;
-                  if ( !Object.keys ){
-                    __LINE__ = 248;
-                    Object.keys = function ( obj ) {
-                      try {
-                        __LINE__ = 249;
-                        var ret = [],
-                            iter = -1;
-
-                        __LINE__ = 252;
-                        for ( var i in obj ){
-                          __LINE__ = 253;
-                          if ( obj.hasOwnProperty( i ) ){
-                            __LINE__ = 254;
-                            ret[ ++ iter] = obj[i];
-                          };
-                        };
-                        __LINE__ = 257;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 261;
-                  if ( !Object.preventExtensions ){
-                    __LINE__ = 262;
-                    Object.preventExtensions = function ( o ) {
-                      try {
-                        __LINE__ = 263;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 267;
-                  if ( !Object.seal ){
-                    __LINE__ = 268;
-                    Object.seal = function ( o ) {
-                      try {
-                        __LINE__ = 269;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 273;
-                  if ( !Object.freeze ){
-                    __LINE__ = 274;
-                    Object.freeze = function ( o ) {
-                      try {
-                        __LINE__ = 275;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 279;
-                  var hasRealEcma5 = ( function () {
-                        try {
-                          try {
-                            __LINE__ = 281;
-                            var obj = {};
-
-                            __LINE__ = 283;
-                            Object.defineProperty( obj,"test", {
-                              configurable : false,
-                              writable : false,
-                              enumerable : false,
-                              value : 0
-                            });
-
-                            __LINE__ = 290;
-                            obj.test = 200;
-                            __LINE__ = 291;
-                            return ( ( ( obj.test === 200 ) ) )?false : true;
-                          } catch( e ){
-                            __LINE__ = 293;
-                            return false;
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      })();
-
-                  __LINE__ = 297;
-                  if ( !hasRealEcma5 ){
-                    __LINE__ = 298;
-                    Object.defineProperty = function ( obj,prop,valobj ) {
-                      try {
-                        __LINE__ = 299;
-                        if ( valobj.value ){
-                          __LINE__ = 300;
-                          obj[prop] = valobj.value;
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 305;
-                  if ( !Array.isArray ){
-                    __LINE__ = 306;
-                    var arrayString = "[object Array]";
-
-                    __LINE__ = 308;
-                    Array.isArray = function ( arr ) {
-                      try {
-                        __LINE__ = 309;
-                        if ( arguments.length === 0 ){
-                          __LINE__ = 310;
-                          return false;
-                        };
-                        __LINE__ = 312;
-                        return ( ( ( arr ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 316;
-                  var slice = Array.prototype.slice;
-
-                  __LINE__ = 318;
-                  var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 319;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : true,
-                            enumerable : false,
-                            writable : true,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 327;
-                  var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 328;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : false,
-                            enumerable : false,
-                            writable : false,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 336;
-                  var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                        try {
-                          __LINE__ = 337;
-                          return ( ( ( likeArray ) ) )?slice.call( likeArray,index ) : [];
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 340;
-                  var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 341;
-                          isKeyOnly = isKeyOnly || false;
-
-                          __LINE__ = 343;
-                          var iter = {},
-                              isArray,
-                              ret,
-                              index = 0;
-
-                          __LINE__ = 348;
-                          if ( this instanceof Iterator ){
-                            __LINE__ = 349;
-                            isArray = Array.isArray( obj );
-
-                            __LINE__ = 351;
-                            ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                          } else {
-                            __LINE__ = 353;
-                            return _userdefIterator( obj,isKeyOnly );
-                          };
-
-                          __LINE__ = 356;
-                          createUnenumProp( iter,"next",
-                          function () {
-                            try {
-                              __LINE__ = 358;
-                              return ret[index ++ ];
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-                          __LINE__ = 360;
-                          return iter;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 363;
-                  var _objectIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 364;
-                          var ret = [],
-                              iter = -1;
-
-                          __LINE__ = 367;
-                          if ( isKeyOnly ){
-                            __LINE__ = 368;
-                            for ( var prop in obj ){
-                              __LINE__ = 369;
-                              ret[ ++ iter] = prop;
-                            };
-                          } else {
-                            __LINE__ = 372;
-                            for ( var prop in obj ){
-                              __LINE__ = 373;
-                              ret[ ++ iter] = [prop,obj[prop]];
-                            };
-                          };
-                          __LINE__ = 376;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _arrayIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 379;
-                          var ret = [];
-
-                          __LINE__ = 381;
-                          if ( isKeyOnly ){
-                            __LINE__ = 382;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 383;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 386;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 387;
-                              ret[i] = [i,obj[i]];
-                            };
-                          };
-                          __LINE__ = 390;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _stringIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 393;
-                          var ret = [];
-
-                          __LINE__ = 395;
-                          if ( isKeyOnly ){
-                            __LINE__ = 396;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 397;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 400;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 401;
-                              ret[i] = [i,obj.charAt( i )];
-                            };
-                          };
-                          __LINE__ = 404;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                        try {
-                          __LINE__ = 407;
-                          var type = typeof obj;
-
-                          __LINE__ = 409;
-                          if ( type === "object" && !isArray ){
-                            __LINE__ = 410;
-                            return _objectIterator( obj,isKeyOnly );
-                          } else if ( isArray ){
-                            __LINE__ = 412;
-                            return _arrayIterator( obj,isKeyOnly );
-                          } else if ( type === "string" ){
-                            __LINE__ = 414;
-                            return _stringIterator( obj,isKeyOnly );
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _userdefIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 418;
-                          if ( "__iterator__" in obj ){
-                            __LINE__ = 419;
-                            return obj.__iterator__( isKeyOnly );
-                          } else {
-                            __LINE__ = 421;
-                            return  {
-                              next : function () {
-                                try {
-                                  try {
-                                    __LINE__ = 424;
-                                    throw new StopIteration;
-                                  } catch( e ){
-                                    __LINE__ = 426;
-                                    throw new Error( e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              }
-                            };
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 433;
-                  var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                        try {
-                          __LINE__ = 434;
-                          var ret = {};
-
-                          __LINE__ = 436;
-                          createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                          __LINE__ = 438;
-                          createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                          __LINE__ = 440;
-                          createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                          __LINE__ = 442;
-                          createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                          __LINE__ = 444;
-                          createUnenumProp( ret,"toString",
-                          function () {
-                            try {
-                              __LINE__ = 446;
-                              return "[object Generator]";
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-
-                          __LINE__ = 449;
-                          Object.freeze( ret );
-                          __LINE__ = 450;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 453;
-                  var getErrorMessage = function ( e ) {
-                        try {
-                          __LINE__ = 454;
-                          return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 457;
-                  var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                  __LINE__ = 459;
-                  var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                  __LINE__ = 461;
-                  ( function () {
-                    try {
-                      __LINE__ = 462;
-                      var assert = _mochaLocalExport.assert = ( ( ( console && console.assert ) ) )?function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 463;
-                              return console.assert( expect === exp,str+"\nat : "+line );
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          } : function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 465;
-                              if ( expect !== exp ){
-                                __LINE__ = 466;
-                                Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                              };
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  })();
-                  __LINE__ = 470;
-                  return _mochaLocalExport;
-                } catch( e ){
-                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                }
-              })();
-
-          __LINE__ = 473;
-          var StopIteration =  {
-                toString : function toString() {
-                  try {
-                    __LINE__ = 475;
-                    return "StopIteration";
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                }
-              };
-
-          __LINE__ = 479;
-          __LINE__ = 0;
-
-          __LINE__ = 480;
-          ( function () {
-            try {
-              try {
-                __LINE__ = 482;
-                var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp-cmp.js",
-                    __LINE__ = 0;
-
-                __LINE__ = 484;
-                __LINE__ = 2;
-
-                __LINE__ = 485;
-                _mochaGlobalExport['./path_array-cmp-cmp.js'] = {};
-
-                __LINE__ = 487;
-                __LINE__ = 3;
-
-                __LINE__ = 488;
-                var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp-cmp.js'];
-
-                __LINE__ = 490;
-                __LINE__ = 1;
-
-                __LINE__ = 491;
-                ( function () {
-                  try {
-                    try {
-                      __LINE__ = 493;
-                      __LINE__ = 2;
-
-                      __LINE__ = 494;
-                      var __FILE__ = "Runtime",
-                          __LINE__ = 0;
-
-                      __LINE__ = 497;
-                      __LINE__ = 5;
-
-                      __LINE__ = 498;
-                      var _mochaGlobalExport = {},
-                          _mochaClassTable = {};
-
-                      __LINE__ = 501;
-                      __LINE__ = 8;
-
-                      __LINE__ = 502;
-                      var Runtime = ( function Runtime() {
-                            try {
-                              try {
-                                __LINE__ = 504;
-                                __LINE__ = 9;
-
-                                __LINE__ = 505;
-                                var _mochaLocalExport = {};
-
-                                function Exception( line,file,e ) {
-                                  try {
-                                    try {
-                                      __LINE__ = 509;
-                                      __LINE__ = 12;
-
-                                      __LINE__ = 510;
-                                      this.toString = function () {
-                                        try {
-                                          try {
-                                            __LINE__ = 512;
-                                            __LINE__ = 13;
-                                            __LINE__ = 513;
-                                            return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                                          } catch( e ){
-                                            __LINE__ = 515;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      };
-                                    } catch( e ){
-                                      __LINE__ = 519;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                  }
-                                }
-                                __LINE__ = 522;
-                                __LINE__ = 16;
-
-                                __LINE__ = 523;
-                                var Runtime =  {
-                                      getErrorMessage : function getErrorMessage( e ) {
-                                        try {
-                                          try {
-                                            __LINE__ = 526;
-                                            __LINE__ = 18;
-                                            __LINE__ = 527;
-                                            return ( ( ( ( e.message ) ) ) )?e.message : ( ( ( ( e.description ) ) ) )?e.description : e.toString();
-                                          } catch( e ){
-                                            __LINE__ = 529;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      },
-                                      exceptionHandler : function exceptionHandler( line,file,e ) {
-                                        try {
-                                          try {
-                                            __LINE__ = 534;
-                                            __LINE__ = 21;
-
-                                            __LINE__ = 535;
-                                            this.throwException( new Exception( line,file,e ) );
-                                          } catch( e ){
-                                            __LINE__ = 537;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      },
-                                      throwException : function throwException( exception ) {
-                                        try {
-                                          try {
-                                            try {
-                                              __LINE__ = 543;
-                                              __LINE__ = 25;
-                                              __LINE__ = 544;
-                                              throw exception;
-                                            } catch( e ){
-                                              __LINE__ = 546;
-                                              __LINE__ = 27;
-                                              __LINE__ = 547;
-                                              throw new Error( this.getErrorMessage( e ) );
-                                            };
-                                          } catch( e ){
-                                            __LINE__ = 550;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      }
-                                    };
-
-                                __LINE__ = 555;
-                                __LINE__ = 32;
-
-                                __LINE__ = 556;
-                                if ( !String.prototype.trim ){
-                                  __LINE__ = 557;
-                                  __LINE__ = 33;
-
-                                  __LINE__ = 558;
-                                  String.prototype.trim = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 560;
-                                        __LINE__ = 34;
-                                        __LINE__ = 561;
-                                        return this.replace( String.prototype.trim.rtrim,"" );
-                                      } catch( e ){
-                                        __LINE__ = 563;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-
-                                  __LINE__ = 567;
-                                  __LINE__ = 37;
-
-                                  __LINE__ = 568;
-                                  String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                                };
-
-                                __LINE__ = 571;
-                                __LINE__ = 40;
-
-                                __LINE__ = 572;
-                                if ( !Function.prototype.bind ){
-                                  __LINE__ = 573;
-                                  __LINE__ = 41;
-
-                                  __LINE__ = 574;
-                                  Function.prototype.bind = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 576;
-                                        __LINE__ = 42;
-
-                                        __LINE__ = 577;
-                                        var argArray = Array.prototype.slice.call( arguments ),
-                                            context = argArray.shift(),
-                                            ret = function () {
-                                              try {
-                                                try {
-                                                  __LINE__ = 581;
-                                                  __LINE__ = 45;
-
-                                                  __LINE__ = 582;
-                                                  var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                                  __LINE__ = 584;
-                                                  __LINE__ = 47;
-
-                                                  __LINE__ = 585;
-                                                  if ( this instanceof ret ){
-                                                    __LINE__ = 586;
-                                                    __LINE__ = 48;
-                                                    __LINE__ = 587;
-                                                    return ret.context.apply( this,args );
-                                                  } else {
-                                                    __LINE__ = 589;
-                                                    __LINE__ = 50;
-                                                    __LINE__ = 590;
-                                                    return ret.context.apply( context,args );
-                                                  };
-                                                } catch( e ){
-                                                  __LINE__ = 593;
-                                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                };
-                                              } catch( e ){
-                                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                              }
-                                            };
-
-                                        __LINE__ = 597;
-                                        __LINE__ = 54;
-
-                                        __LINE__ = 598;
-                                        ret.prototype = this.prototype;
-
-                                        __LINE__ = 600;
-                                        __LINE__ = 56;
-
-                                        __LINE__ = 601;
-                                        ret.context = this;
-
-                                        __LINE__ = 602;
-                                        __LINE__ = 57;
-                                        __LINE__ = 603;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 605;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 610;
-                                __LINE__ = 61;
-
-                                __LINE__ = 611;
-                                if ( !Array.prototype.forEach ){
-                                  __LINE__ = 612;
-                                  __LINE__ = 62;
-
-                                  __LINE__ = 613;
-                                  Array.prototype.forEach = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 615;
-                                        __LINE__ = 63;
-
-                                        __LINE__ = 616;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 619;
-                                        __LINE__ = 66;
-
-                                        __LINE__ = 620;
-                                        if ( that ){
-                                          __LINE__ = 621;
-                                          __LINE__ = 67;
-
-                                          __LINE__ = 622;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 623;
-                                            __LINE__ = 68;
-
-                                            __LINE__ = 624;
-                                            fn.call( that,ta,iter,this );
-                                          };
-                                        } else {
-                                          __LINE__ = 627;
-                                          __LINE__ = 71;
-
-                                          __LINE__ = 628;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 629;
-                                            __LINE__ = 72;
-
-                                            __LINE__ = 630;
-                                            fn( ta,iter,this );
-                                          };
-                                        };
-                                      } catch( e ){
-                                        __LINE__ = 634;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 639;
-                                __LINE__ = 78;
-
-                                __LINE__ = 640;
-                                if ( !Array.prototype.every ){
-                                  __LINE__ = 641;
-                                  __LINE__ = 79;
-
-                                  __LINE__ = 642;
-                                  Array.prototype.every = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 644;
-                                        __LINE__ = 80;
-
-                                        __LINE__ = 645;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 648;
-                                        __LINE__ = 83;
-
-                                        __LINE__ = 649;
-                                        if ( that ){
-                                          __LINE__ = 650;
-                                          __LINE__ = 84;
-
-                                          __LINE__ = 651;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 652;
-                                            __LINE__ = 85;
-
-                                            __LINE__ = 653;
-                                            if ( !( fn.call( that,ta,iter,this ) ) ){
-                                              __LINE__ = 654;
-                                              __LINE__ = 86;
-                                              __LINE__ = 655;
-                                              return false;
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 659;
-                                          __LINE__ = 90;
-
-                                          __LINE__ = 660;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            if ( !( fn( ta,iter,this ) ) ){
-                                              __LINE__ = 662;
-                                              __LINE__ = 92;
-                                              __LINE__ = 663;
-                                              return false;
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 667;
-                                        __LINE__ = 96;
-                                        __LINE__ = 668;
-                                        return true;
-                                      } catch( e ){
-                                        __LINE__ = 670;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 675;
-                                __LINE__ = 100;
-
-                                __LINE__ = 676;
-                                if ( !Array.prototype.some ){
-                                  __LINE__ = 677;
-                                  __LINE__ = 101;
-
-                                  __LINE__ = 678;
-                                  Array.prototype.some = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 680;
-                                        __LINE__ = 102;
-
-                                        __LINE__ = 681;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 684;
-                                        __LINE__ = 105;
-
-                                        __LINE__ = 685;
-                                        if ( that ){
-                                          __LINE__ = 686;
-                                          __LINE__ = 106;
-
-                                          __LINE__ = 687;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 688;
-                                            __LINE__ = 107;
-
-                                            __LINE__ = 689;
-                                            if ( fn.call( that,ta,iter,this ) ){
-                                              __LINE__ = 690;
-                                              __LINE__ = 108;
-                                              __LINE__ = 691;
-                                              return true;
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 695;
-                                          __LINE__ = 112;
-
-                                          __LINE__ = 696;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            if ( fn( ta,iter,this ) ){
-                                              __LINE__ = 698;
-                                              __LINE__ = 114;
-                                              __LINE__ = 699;
-                                              return true;
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 703;
-                                        __LINE__ = 118;
-                                        __LINE__ = 704;
-                                        return false;
-                                      } catch( e ){
-                                        __LINE__ = 706;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 711;
-                                __LINE__ = 122;
-
-                                __LINE__ = 712;
-                                if ( !Array.prototype.filter ){
-                                  __LINE__ = 713;
-                                  __LINE__ = 123;
-
-                                  __LINE__ = 714;
-                                  Array.prototype.filter = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 716;
-                                        __LINE__ = 124;
-
-                                        __LINE__ = 717;
-                                        var iter = -1,
-                                            ret = [],
-                                            ta;
-
-                                        __LINE__ = 721;
-                                        __LINE__ = 128;
-
-                                        __LINE__ = 722;
-                                        if ( that ){
-                                          __LINE__ = 723;
-                                          __LINE__ = 129;
-
-                                          __LINE__ = 724;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            __LINE__ = 725;
-                                            __LINE__ = 130;
-
-                                            __LINE__ = 726;
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 727;
-                                              __LINE__ = 131;
-
-                                              __LINE__ = 728;
-                                              if ( fn.call( that,ta,i,this ) ){
-                                                __LINE__ = 729;
-                                                __LINE__ = 132;
-
-                                                __LINE__ = 730;
-                                                ret[ ++ iter] = ta;
-                                              };
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 735;
-                                          __LINE__ = 137;
-
-                                          __LINE__ = 736;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              if ( fn( ta,i,this ) ){
-                                                __LINE__ = 739;
-                                                __LINE__ = 140;
-
-                                                __LINE__ = 740;
-                                                ret[ ++ iter] = ta;
-                                              };
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 745;
-                                        __LINE__ = 145;
-                                        __LINE__ = 746;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 748;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 753;
-                                __LINE__ = 149;
-
-                                __LINE__ = 754;
-                                if ( !Array.prototype.indexOf ){
-                                  __LINE__ = 755;
-                                  __LINE__ = 150;
-
-                                  __LINE__ = 756;
-                                  Array.prototype.indexOf = function ( subject ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 758;
-                                        __LINE__ = 151;
-
-                                        __LINE__ = 759;
-                                        var iter = -1,
-                                            index = -1,
-                                            ta;
-
-                                        __LINE__ = 763;
-                                        __LINE__ = 155;
-
-                                        __LINE__ = 764;
-                                        while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                          __LINE__ = 765;
-                                          __LINE__ = 156;
-
-                                          __LINE__ = 766;
-                                          if ( ta === subject ){
-                                            __LINE__ = 767;
-                                            __LINE__ = 157;
-
-                                            __LINE__ = 768;
-                                            index = iter;
-
-                                            __LINE__ = 769;
-                                            __LINE__ = 158;
-                                            __LINE__ = 770;
-                                            break;
-                                          };
-                                        };
-
-                                        __LINE__ = 773;
-                                        __LINE__ = 161;
-                                        __LINE__ = 774;
-                                        return index;
-                                      } catch( e ){
-                                        __LINE__ = 776;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 781;
-                                __LINE__ = 165;
-
-                                __LINE__ = 782;
-                                if ( !Array.prototype.lastIndexOf ){
-                                  __LINE__ = 783;
-                                  __LINE__ = 166;
-
-                                  __LINE__ = 784;
-                                  Array.prototype.lastIndexOf = function ( subject ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 786;
-                                        __LINE__ = 167;
-
-                                        __LINE__ = 787;
-                                        var iter = this.length,
-                                            index = -1,
-                                            ta;
-
-                                        __LINE__ = 791;
-                                        __LINE__ = 171;
-
-                                        __LINE__ = 792;
-                                        while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                                          __LINE__ = 793;
-                                          __LINE__ = 172;
-
-                                          __LINE__ = 794;
-                                          if ( ta === subject ){
-                                            __LINE__ = 795;
-                                            __LINE__ = 173;
-
-                                            __LINE__ = 796;
-                                            index = iter;
-
-                                            __LINE__ = 797;
-                                            __LINE__ = 174;
-                                            __LINE__ = 798;
-                                            break;
-                                          };
-                                        };
-
-                                        __LINE__ = 801;
-                                        __LINE__ = 177;
-                                        __LINE__ = 802;
-                                        return index;
-                                      } catch( e ){
-                                        __LINE__ = 804;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 809;
-                                __LINE__ = 181;
-
-                                __LINE__ = 810;
-                                if ( !Array.prototype.map ){
-                                  __LINE__ = 811;
-                                  __LINE__ = 182;
-
-                                  __LINE__ = 812;
-                                  Array.prototype.map = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 814;
-                                        __LINE__ = 183;
-
-                                        __LINE__ = 815;
-                                        var ret = [],
-                                            iter = -1,
-                                            ta;
-
-                                        __LINE__ = 819;
-                                        __LINE__ = 187;
-
-                                        __LINE__ = 820;
-                                        if ( that ){
-                                          __LINE__ = 821;
-                                          __LINE__ = 188;
-
-                                          __LINE__ = 822;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            __LINE__ = 823;
-                                            __LINE__ = 189;
-
-                                            __LINE__ = 824;
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 825;
-                                              __LINE__ = 190;
-
-                                              __LINE__ = 826;
-                                              ret[ ++ iter] = fn.call( that,ta,i,this );
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 830;
-                                          __LINE__ = 194;
-
-                                          __LINE__ = 831;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 833;
-                                              __LINE__ = 196;
-
-                                              __LINE__ = 834;
-                                              ret[ ++ iter] = fn( ta,i,this );
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 838;
-                                        __LINE__ = 200;
-                                        __LINE__ = 839;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 841;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 846;
-                                __LINE__ = 204;
-
-                                __LINE__ = 847;
-                                if ( !Array.prototype.reduce ){
-                                  __LINE__ = 848;
-                                  __LINE__ = 205;
-
-                                  __LINE__ = 849;
-                                  Array.prototype.reduce = function ( fn,initial ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 851;
-                                        __LINE__ = 206;
-
-                                        __LINE__ = 852;
-                                        var ret = initial || this[0],
-                                            i = ( ( ( ( initial ) ) ) )?0 : 1,
-                                            ta,
-                                            len;
-
-                                        __LINE__ = 857;
-                                        __LINE__ = 211;
-
-                                        __LINE__ = 858;
-                                        for ( i , len = this.length;i<len; ++ i ){
-                                          __LINE__ = 859;
-                                          __LINE__ = 212;
-
-                                          __LINE__ = 860;
-                                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                            __LINE__ = 861;
-                                            __LINE__ = 213;
-
-                                            __LINE__ = 862;
-                                            ret = fn( ret,ta,i,this );
-                                          };
-                                        };
-
-                                        __LINE__ = 865;
-                                        __LINE__ = 216;
-                                        __LINE__ = 866;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 868;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 873;
-                                __LINE__ = 220;
-
-                                __LINE__ = 874;
-                                if ( !Array.prototype.reduceRight ){
-                                  __LINE__ = 875;
-                                  __LINE__ = 221;
-
-                                  __LINE__ = 876;
-                                  Array.prototype.reduceRight = function ( fn,initial ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 878;
-                                        __LINE__ = 222;
-
-                                        __LINE__ = 879;
-                                        var ret = initial || this[this.length-1],
-                                            i = ( ( ( ( initial ) ) ) )?this.length-1 : this.length-2,
-                                            ta;
-
-                                        __LINE__ = 883;
-                                        __LINE__ = 226;
-
-                                        __LINE__ = 884;
-                                        for ( i;i>-1; -- i ){
-                                          __LINE__ = 885;
-                                          __LINE__ = 227;
-
-                                          __LINE__ = 886;
-                                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                            __LINE__ = 887;
-                                            __LINE__ = 228;
-
-                                            __LINE__ = 888;
-                                            ret = fn( ret,ta,i,this );
-                                          };
-                                        };
-
-                                        __LINE__ = 891;
-                                        __LINE__ = 231;
-                                        __LINE__ = 892;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 894;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 899;
-                                __LINE__ = 235;
-
-                                __LINE__ = 900;
-                                if ( !Date.prototype.toJSON ){
-                                  __LINE__ = 901;
-                                  __LINE__ = 236;
-
-                                  __LINE__ = 902;
-                                  Date.prototype.toJSON = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 904;
-                                        __LINE__ = 237;
-                                        __LINE__ = 905;
-                                        return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                                      } catch( e ){
-                                        __LINE__ = 907;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 912;
-                                __LINE__ = 241;
-
-                                __LINE__ = 913;
-                                if ( !Date.now ){
-                                  __LINE__ = 914;
-                                  __LINE__ = 242;
-
-                                  __LINE__ = 915;
-                                  Date.now = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 917;
-                                        __LINE__ = 243;
-                                        __LINE__ = 918;
-                                        return +new Date();
-                                      } catch( e ){
-                                        __LINE__ = 920;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 925;
-                                __LINE__ = 247;
-
-                                __LINE__ = 926;
-                                if ( !Object.keys ){
-                                  __LINE__ = 927;
-                                  __LINE__ = 248;
-
-                                  __LINE__ = 928;
-                                  Object.keys = function ( obj ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 930;
-                                        __LINE__ = 249;
-
-                                        __LINE__ = 931;
-                                        var ret = [],
-                                            iter = -1;
-
-                                        __LINE__ = 934;
-                                        __LINE__ = 252;
-
-                                        __LINE__ = 935;
-                                        for ( var i in obj ){
-                                          __LINE__ = 936;
-                                          __LINE__ = 253;
-
-                                          __LINE__ = 937;
-                                          if ( obj.hasOwnProperty( i ) ){
-                                            __LINE__ = 938;
-                                            __LINE__ = 254;
-
-                                            __LINE__ = 939;
-                                            ret[ ++ iter] = obj[i];
-                                          };
-                                        };
-
-                                        __LINE__ = 942;
-                                        __LINE__ = 257;
-                                        __LINE__ = 943;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 945;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 950;
-                                __LINE__ = 261;
-
-                                __LINE__ = 951;
-                                if ( !Object.preventExtensions ){
-                                  __LINE__ = 952;
-                                  __LINE__ = 262;
-
-                                  __LINE__ = 953;
-                                  Object.preventExtensions = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 955;
-                                        __LINE__ = 263;
-                                        __LINE__ = 956;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 958;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 963;
-                                __LINE__ = 267;
-
-                                __LINE__ = 964;
-                                if ( !Object.seal ){
-                                  __LINE__ = 965;
-                                  __LINE__ = 268;
-
-                                  __LINE__ = 966;
-                                  Object.seal = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 968;
-                                        __LINE__ = 269;
-                                        __LINE__ = 969;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 971;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 976;
-                                __LINE__ = 273;
-
-                                __LINE__ = 977;
-                                if ( !Object.freeze ){
-                                  __LINE__ = 978;
-                                  __LINE__ = 274;
-
-                                  __LINE__ = 979;
-                                  Object.freeze = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 981;
-                                        __LINE__ = 275;
-                                        __LINE__ = 982;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 984;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 989;
-                                __LINE__ = 279;
-
-                                __LINE__ = 990;
-                                var hasRealEcma5 = ( function () {
-                                      try {
-                                        try {
-                                          try {
-                                            __LINE__ = 993;
-                                            __LINE__ = 281;
-
-                                            __LINE__ = 994;
-                                            var obj = {};
-
-                                            __LINE__ = 996;
-                                            __LINE__ = 283;
-
-                                            __LINE__ = 997;
-                                            Object.defineProperty( obj,"test", {
-                                              configurable : false,
-                                              writable : false,
-                                              enumerable : false,
-                                              value : 0
-                                            });
-
-                                            __LINE__ = 1004;
-                                            __LINE__ = 290;
-
-                                            __LINE__ = 1005;
-                                            obj.test = 200;
-
-                                            __LINE__ = 1006;
-                                            __LINE__ = 291;
-                                            __LINE__ = 1007;
-                                            return ( ( ( ( obj.test === 200 ) ) ) )?false : true;
-                                          } catch( e ){
-                                            __LINE__ = 1009;
-                                            __LINE__ = 293;
-                                            __LINE__ = 1010;
-                                            return false;
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1013;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    })();
-
-                                __LINE__ = 1017;
-                                __LINE__ = 297;
-
-                                __LINE__ = 1018;
-                                if ( !hasRealEcma5 ){
-                                  __LINE__ = 1019;
-                                  __LINE__ = 298;
-
-                                  __LINE__ = 1020;
-                                  Object.defineProperty = function ( obj,prop,valobj ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 1022;
-                                        __LINE__ = 299;
-
-                                        __LINE__ = 1023;
-                                        if ( valobj.value ){
-                                          __LINE__ = 1024;
-                                          __LINE__ = 300;
-
-                                          __LINE__ = 1025;
-                                          obj[prop] = valobj.value;
-                                        };
-                                      } catch( e ){
-                                        __LINE__ = 1028;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 1033;
-                                __LINE__ = 305;
-
-                                __LINE__ = 1034;
-                                if ( !Array.isArray ){
-                                  __LINE__ = 1035;
-                                  __LINE__ = 306;
-
-                                  __LINE__ = 1036;
-                                  var arrayString = "[object Array]";
-
-                                  __LINE__ = 1038;
-                                  __LINE__ = 308;
-
-                                  __LINE__ = 1039;
-                                  Array.isArray = function ( arr ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 1041;
-                                        __LINE__ = 309;
-
-                                        __LINE__ = 1042;
-                                        if ( arguments.length === 0 ){
-                                          __LINE__ = 1043;
-                                          __LINE__ = 310;
-                                          __LINE__ = 1044;
-                                          return false;
-                                        };
-
-                                        __LINE__ = 1046;
-                                        __LINE__ = 312;
-                                        __LINE__ = 1047;
-                                        return ( ( ( ( arr ) ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                                      } catch( e ){
-                                        __LINE__ = 1049;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 1054;
-                                __LINE__ = 316;
-
-                                __LINE__ = 1055;
-                                var slice = Array.prototype.slice;
-
-                                __LINE__ = 1057;
-                                __LINE__ = 318;
-
-                                __LINE__ = 1058;
-                                var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1060;
-                                          __LINE__ = 319;
-                                          __LINE__ = 1061;
-                                          return Object.defineProperty( obj,prop, {
-                                            configurable : true,
-                                            enumerable : false,
-                                            writable : true,
-                                            value : value
-                                          });
-                                        } catch( e ){
-                                          __LINE__ = 1068;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1072;
-                                __LINE__ = 327;
-
-                                __LINE__ = 1073;
-                                var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1075;
-                                          __LINE__ = 328;
-                                          __LINE__ = 1076;
-                                          return Object.defineProperty( obj,prop, {
-                                            configurable : false,
-                                            enumerable : false,
-                                            writable : false,
-                                            value : value
-                                          });
-                                        } catch( e ){
-                                          __LINE__ = 1083;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1087;
-                                __LINE__ = 336;
-
-                                __LINE__ = 1088;
-                                var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1090;
-                                          __LINE__ = 337;
-                                          __LINE__ = 1091;
-                                          return ( ( ( ( likeArray ) ) ) )?slice.call( likeArray,index ) : [];
-                                        } catch( e ){
-                                          __LINE__ = 1093;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1097;
-                                __LINE__ = 340;
-
-                                __LINE__ = 1098;
-                                var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1100;
-                                          __LINE__ = 341;
-
-                                          __LINE__ = 1101;
-                                          isKeyOnly = isKeyOnly || false;
-
-                                          __LINE__ = 1103;
-                                          __LINE__ = 343;
-
-                                          __LINE__ = 1104;
-                                          var iter = {},
-                                              isArray,
-                                              ret,
-                                              index = 0;
-
-                                          __LINE__ = 1109;
-                                          __LINE__ = 348;
-
-                                          __LINE__ = 1110;
-                                          if ( this instanceof Iterator ){
-                                            __LINE__ = 1111;
-                                            __LINE__ = 349;
-
-                                            __LINE__ = 1112;
-                                            isArray = Array.isArray( obj );
-
-                                            __LINE__ = 1114;
-                                            __LINE__ = 351;
-
-                                            __LINE__ = 1115;
-                                            ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                                          } else {
-                                            __LINE__ = 1117;
-                                            __LINE__ = 353;
-                                            __LINE__ = 1118;
-                                            return _userdefIterator( obj,isKeyOnly );
-                                          };
-
-                                          __LINE__ = 1121;
-                                          __LINE__ = 356;
-
-                                          __LINE__ = 1122;
-                                          createUnenumProp( iter,"next",
-                                          function () {
-                                            try {
-                                              try {
-                                                __LINE__ = 1125;
-                                                __LINE__ = 358;
-                                                __LINE__ = 1126;
-                                                return ret[index ++ ];
-                                              } catch( e ){
-                                                __LINE__ = 1128;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          });
-
-                                          __LINE__ = 1131;
-                                          __LINE__ = 360;
-                                          __LINE__ = 1132;
-                                          return iter;
-                                        } catch( e ){
-                                          __LINE__ = 1134;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1138;
-                                __LINE__ = 363;
-
-                                __LINE__ = 1139;
-                                var _objectIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1141;
-                                          __LINE__ = 364;
-
-                                          __LINE__ = 1142;
-                                          var ret = [],
-                                              iter = -1;
-
-                                          __LINE__ = 1145;
-                                          __LINE__ = 367;
-
-                                          __LINE__ = 1146;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1147;
-                                            __LINE__ = 368;
-
-                                            __LINE__ = 1148;
-                                            for ( var prop in obj ){
-                                              __LINE__ = 1149;
-                                              __LINE__ = 369;
-
-                                              __LINE__ = 1150;
-                                              ret[ ++ iter] = prop;
-                                            };
-                                          } else {
-                                            __LINE__ = 1153;
-                                            __LINE__ = 372;
-
-                                            __LINE__ = 1154;
-                                            for ( var prop in obj ){
-                                              __LINE__ = 1155;
-                                              __LINE__ = 373;
-
-                                              __LINE__ = 1156;
-                                              ret[ ++ iter] = [prop,obj[prop]];
-                                            };
-                                          };
-
-                                          __LINE__ = 1159;
-                                          __LINE__ = 376;
-                                          __LINE__ = 1160;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1162;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _arrayIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1167;
-                                          __LINE__ = 379;
-
-                                          __LINE__ = 1168;
-                                          var ret = [];
-
-                                          __LINE__ = 1170;
-                                          __LINE__ = 381;
-
-                                          __LINE__ = 1171;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1172;
-                                            __LINE__ = 382;
-
-                                            __LINE__ = 1173;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1174;
-                                              __LINE__ = 383;
-
-                                              __LINE__ = 1175;
-                                              ret[i] = i;
-                                            };
-                                          } else {
-                                            __LINE__ = 1178;
-                                            __LINE__ = 386;
-
-                                            __LINE__ = 1179;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1180;
-                                              __LINE__ = 387;
-
-                                              __LINE__ = 1181;
-                                              ret[i] = [i,obj[i]];
-                                            };
-                                          };
-
-                                          __LINE__ = 1184;
-                                          __LINE__ = 390;
-                                          __LINE__ = 1185;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1187;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _stringIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1192;
-                                          __LINE__ = 393;
-
-                                          __LINE__ = 1193;
-                                          var ret = [];
-
-                                          __LINE__ = 1195;
-                                          __LINE__ = 395;
-
-                                          __LINE__ = 1196;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1197;
-                                            __LINE__ = 396;
-
-                                            __LINE__ = 1198;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1199;
-                                              __LINE__ = 397;
-
-                                              __LINE__ = 1200;
-                                              ret[i] = i;
-                                            };
-                                          } else {
-                                            __LINE__ = 1203;
-                                            __LINE__ = 400;
-
-                                            __LINE__ = 1204;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1205;
-                                              __LINE__ = 401;
-
-                                              __LINE__ = 1206;
-                                              ret[i] = [i,obj.charAt( i )];
-                                            };
-                                          };
-
-                                          __LINE__ = 1209;
-                                          __LINE__ = 404;
-                                          __LINE__ = 1210;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1212;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1217;
-                                          __LINE__ = 407;
-
-                                          __LINE__ = 1218;
-                                          var type = typeof obj;
-
-                                          __LINE__ = 1220;
-                                          __LINE__ = 409;
-
-                                          __LINE__ = 1221;
-                                          if ( type === "object" && !isArray ){
-                                            __LINE__ = 1222;
-                                            __LINE__ = 410;
-                                            __LINE__ = 1223;
-                                            return _objectIterator( obj,isKeyOnly );
-                                          } else if ( isArray ){
-                                            __LINE__ = 1225;
-                                            __LINE__ = 412;
-                                            __LINE__ = 1226;
-                                            return _arrayIterator( obj,isKeyOnly );
-                                          } else if ( type === "string" ){
-                                            __LINE__ = 1228;
-                                            __LINE__ = 414;
-                                            __LINE__ = 1229;
-                                            return _stringIterator( obj,isKeyOnly );
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1232;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _userdefIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1237;
-                                          __LINE__ = 418;
-
-                                          __LINE__ = 1238;
-                                          if ( "__iterator__" in obj ){
-                                            __LINE__ = 1239;
-                                            __LINE__ = 419;
-                                            __LINE__ = 1240;
-                                            return obj.__iterator__( isKeyOnly );
-                                          } else {
-                                            __LINE__ = 1242;
-                                            __LINE__ = 421;
-                                            __LINE__ = 1243;
-                                            return  {
-                                              next : function () {
-                                                try {
-                                                  try {
-                                                    try {
-                                                      __LINE__ = 1247;
-                                                      __LINE__ = 424;
-                                                      __LINE__ = 1248;
-                                                      throw new StopIteration;
-                                                    } catch( e ){
-                                                      __LINE__ = 1250;
-                                                      __LINE__ = 426;
-                                                      __LINE__ = 1251;
-                                                      throw new Error( e );
-                                                    };
-                                                  } catch( e ){
-                                                    __LINE__ = 1254;
-                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                  };
-                                                } catch( e ){
-                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                }
-                                              }
-                                            };
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1260;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1264;
-                                __LINE__ = 433;
-
-                                __LINE__ = 1265;
-                                var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1267;
-                                          __LINE__ = 434;
-
-                                          __LINE__ = 1268;
-                                          var ret = {};
-
-                                          __LINE__ = 1270;
-                                          __LINE__ = 436;
-
-                                          __LINE__ = 1271;
-                                          createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                                          __LINE__ = 1273;
-                                          __LINE__ = 438;
-
-                                          __LINE__ = 1274;
-                                          createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                                          __LINE__ = 1276;
-                                          __LINE__ = 440;
-
-                                          __LINE__ = 1277;
-                                          createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                                          __LINE__ = 1279;
-                                          __LINE__ = 442;
-
-                                          __LINE__ = 1280;
-                                          createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                                          __LINE__ = 1282;
-                                          __LINE__ = 444;
-
-                                          __LINE__ = 1283;
-                                          createUnenumProp( ret,"toString",
-                                          function () {
-                                            try {
-                                              try {
-                                                __LINE__ = 1286;
-                                                __LINE__ = 446;
-                                                __LINE__ = 1287;
-                                                return "[object Generator]";
-                                              } catch( e ){
-                                                __LINE__ = 1289;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          });
-
-                                          __LINE__ = 1293;
-                                          __LINE__ = 449;
-
-                                          __LINE__ = 1294;
-                                          Object.freeze( ret );
-
-                                          __LINE__ = 1295;
-                                          __LINE__ = 450;
-                                          __LINE__ = 1296;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1298;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1302;
-                                __LINE__ = 453;
-
-                                __LINE__ = 1303;
-                                var getErrorMessage = function ( e ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1305;
-                                          __LINE__ = 454;
-                                          __LINE__ = 1306;
-                                          return ( ( ( ( e.message ) ) ) )?e.message : ( ( ( ( e.description ) ) ) )?e.description : e.toString();
-                                        } catch( e ){
-                                          __LINE__ = 1308;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1312;
-                                __LINE__ = 457;
-
-                                __LINE__ = 1313;
-                                var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                                __LINE__ = 1315;
-                                __LINE__ = 459;
-
-                                __LINE__ = 1316;
-                                var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                                __LINE__ = 1318;
-                                __LINE__ = 461;
-
-                                __LINE__ = 1319;
-                                ( function () {
-                                  try {
-                                    try {
-                                      __LINE__ = 1321;
-                                      __LINE__ = 462;
-
-                                      __LINE__ = 1322;
-                                      var assert = _mochaLocalExport.assert = ( ( ( ( console && console.assert ) ) ) )?function ( expect,exp,str,line ) {
-                                            try {
-                                              try {
-                                                __LINE__ = 1324;
-                                                __LINE__ = 463;
-                                                __LINE__ = 1325;
-                                                return console.assert( expect === exp,str+"\nat : "+line );
-                                              } catch( e ){
-                                                __LINE__ = 1327;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          } : function ( expect,exp,str,line ) {
-                                            try {
-                                              try {
-                                                __LINE__ = 1331;
-                                                __LINE__ = 465;
-
-                                                __LINE__ = 1332;
-                                                if ( expect !== exp ){
-                                                  __LINE__ = 1333;
-                                                  __LINE__ = 466;
-
-                                                  __LINE__ = 1334;
-                                                  Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                                                };
-                                              } catch( e ){
-                                                __LINE__ = 1337;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          };
-                                    } catch( e ){
-                                      __LINE__ = 1341;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                  }
-                                })();
-
-                                __LINE__ = 1344;
-                                __LINE__ = 470;
-                                __LINE__ = 1345;
-                                return _mochaLocalExport;
-                              } catch( e ){
-                                __LINE__ = 1347;
-                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                              };
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          })();
-
-                      __LINE__ = 1351;
-                      __LINE__ = 473;
-
-                      __LINE__ = 1352;
-                      var StopIteration =  {
-                            toString : function toString() {
-                              try {
-                                try {
-                                  __LINE__ = 1355;
-                                  __LINE__ = 475;
-                                  __LINE__ = 1356;
-                                  return "StopIteration";
-                                } catch( e ){
-                                  __LINE__ = 1358;
-                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                };
-                              } catch( e ){
-                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                              }
-                            }
-                          };
-
-                      __LINE__ = 1363;
-                      __LINE__ = 479;
-
-                      __LINE__ = 1364;
-                      __LINE__ = 0;
-
-                      __LINE__ = 1366;
-                      __LINE__ = 480;
-
-                      __LINE__ = 1367;
-                      ( function () {
-                        try {
-                          try {
-                            try {
-                              __LINE__ = 1370;
-                              __LINE__ = 482;
-
-                              __LINE__ = 1371;
-                              var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp.js",
-                                  __LINE__ = 0;
-
-                              __LINE__ = 1374;
-                              __LINE__ = 484;
-
-                              __LINE__ = 1375;
-                              __LINE__ = 2;
-
-                              __LINE__ = 1377;
-                              __LINE__ = 485;
-
-                              __LINE__ = 1378;
-                              _mochaGlobalExport['./path_array-cmp.js'] = {};
-
-                              __LINE__ = 1380;
-                              __LINE__ = 487;
-
-                              __LINE__ = 1381;
-                              __LINE__ = 3;
-
-                              __LINE__ = 1383;
-                              __LINE__ = 488;
-
-                              __LINE__ = 1384;
-                              var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp.js'];
-
-                              __LINE__ = 1386;
-                              __LINE__ = 490;
-
-                              __LINE__ = 1387;
-                              __LINE__ = 1;
-
-                              __LINE__ = 1389;
-                              __LINE__ = 491;
-
-                              __LINE__ = 1390;
-                              ( function () {
-                                try {
-                                  try {
-                                    try {
-                                      __LINE__ = 1393;
-                                      __LINE__ = 493;
-
-                                      __LINE__ = 1394;
-                                      __LINE__ = 2;
-
-                                      __LINE__ = 1396;
-                                      __LINE__ = 494;
-
-                                      __LINE__ = 1397;
-                                      var __FILE__ = "Runtime",
-                                          __LINE__ = 0;
-
-                                      __LINE__ = 1400;
-                                      __LINE__ = 497;
-
-                                      __LINE__ = 1401;
-                                      __LINE__ = 5;
-
-                                      __LINE__ = 1403;
-                                      __LINE__ = 498;
-
-                                      __LINE__ = 1404;
-                                      var _mochaGlobalExport = {},
-                                          _mochaClassTable = {};
-
-                                      __LINE__ = 1407;
-                                      __LINE__ = 501;
-
-                                      __LINE__ = 1408;
-                                      __LINE__ = 8;
-
-                                      __LINE__ = 1410;
-                                      __LINE__ = 502;
-
-                                      __LINE__ = 1411;
-                                      var Runtime = ( function Runtime() {
-                                            try {
-                                              try {
-                                                try {
-                                                  __LINE__ = 1414;
-                                                  __LINE__ = 504;
-
-                                                  __LINE__ = 1415;
-                                                  __LINE__ = 9;
-
-                                                  __LINE__ = 1417;
-                                                  __LINE__ = 505;
-
-                                                  __LINE__ = 1418;
-                                                  var _mochaLocalExport = {};
-
-                                                  function Exception( line,file,e ) {
-                                                    try {
-                                                      try {
-                                                        try {
-                                                          __LINE__ = 1423;
-                                                          __LINE__ = 509;
-
-                                                          __LINE__ = 1424;
-                                                          __LINE__ = 12;
-
-                                                          __LINE__ = 1426;
-                                                          __LINE__ = 510;
-
-                                                          __LINE__ = 1427;
-                                                          this.toString = function () {
-                                                            try {
-                                                              try {
-                                                                try {
-                                                                  __LINE__ = 1430;
-                                                                  __LINE__ = 512;
-
-                                                                  __LINE__ = 1431;
-                                                                  __LINE__ = 13;
-
-                                                                  __LINE__ = 1432;
-                                                                  __LINE__ = 513;
-                                                                  __LINE__ = 1433;
-                                                                  return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                                                                } catch( e ){
-                                                                  __LINE__ = 1435;
-                                                                  __LINE__ = 515;
-
-                                                                  __LINE__ = 1436;
-                                                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                };
-                                                              } catch( e ){
-                                                                __LINE__ = 1439;
-                                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                              };
-                                                            } catch( e ){
-                                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                            }
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1443;
-                                                          __LINE__ = 519;
-
-                                                          __LINE__ = 1444;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        __LINE__ = 1447;
-                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                      };
-                                                    } catch( e ){
-                                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                    }
-                                                  }
-                                                  __LINE__ = 1450;
-                                                  __LINE__ = 522;
-
-                                                  __LINE__ = 1451;
-                                                  __LINE__ = 16;
-
-                                                  __LINE__ = 1453;
-                                                  __LINE__ = 523;
-
-                                                  __LINE__ = 1454;
-                                                  var Runtime =  {
-                                                        getErrorMessage : function getErrorMessage( e ) {
-                                                          try {
-                                                            try {
-                                                              try {
-                                                                __LINE__ = 1458;
-                                                                __LINE__ = 526;
-
-                                                                __LINE__ = 1459;
-                                                                __LINE__ = 18;
-
-                                                                __LINE__ = 1460;
-                                                                __LINE__ = 527;
-                                                                __LINE__ = 1461;
-                                                                return ( ( ( ( ( e.message ) ) ) ) )?e.message : ( ( ( ( ( e.description ) ) ) ) )?e.description : e.toString();
-                                                              } catch( e ){
-                                                                __LINE__ = 1463;
-                                                                __LINE__ = 529;
-
-                                                                __LINE__ = 1464;
-                                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 1467;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                          }
-                                                        },
-                                                        exceptionHandler : function exceptionHandler( line,file,e ) {
-                                                          try {
-                                                            try {
-                                                              try {
-                                                                __LINE__ = 1473;
-                                                                __LINE__ = 534;
-
-                                                                __LINE__ = 1474;
-                                                                __LINE__ = 21;
-
-                                                                __LINE__ = 1476;
-                                                                __LINE__ = 535;
-
-                                                                __LINE__ = 1477;
-                                                                this.throwException( new Exception( line,file,e ) );
-                                                              } catch( e ){
-                                                                __LINE__ = 1479;
-                                                                __LINE__ = 537;
-
-                                                                __LINE__ = 1480;
-                                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 1483;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                          }
-                                                        },
-                                                        throwException : function throwException( exception ) {
-                                                          try {
-                                                            try {
-                                                              try {
-                                                                try {
-                                                                  __LINE__ = 1490;
-                                                                  __LINE__ = 543;
-
-                                                                  __LINE__ = 1491;
-                                                                  __LINE__ = 25;
-
-                                                                  __LINE__ = 1492;
-                                                                  __LINE__ = 544;
-                                                                  __LINE__ = 1493;
-                                                                  throw exception;
-                                                                } catch( e ){
-                                                                  __LINE__ = 1495;
-                                                                  __LINE__ = 546;
-
-                                                                  __LINE__ = 1496;
-                                                                  __LINE__ = 27;
-
-                                                                  __LINE__ = 1497;
-                                                                  __LINE__ = 547;
-                                                                  __LINE__ = 1498;
-                                                                  throw new Error( this.getErrorMessage( e ) );
-                                                                };
-                                                              } catch( e ){
-                                                                __LINE__ = 1501;
-                                                                __LINE__ = 550;
-
-                                                                __LINE__ = 1502;
-                                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 1505;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                          }
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 1510;
-                                                  __LINE__ = 555;
-
-                                                  __LINE__ = 1511;
-                                                  __LINE__ = 32;
-
-                                                  __LINE__ = 1513;
-                                                  __LINE__ = 556;
-
-                                                  __LINE__ = 1514;
-                                                  if ( !String.prototype.trim ){
-                                                    __LINE__ = 1515;
-                                                    __LINE__ = 557;
-
-                                                    __LINE__ = 1516;
-                                                    __LINE__ = 33;
-
-                                                    __LINE__ = 1518;
-                                                    __LINE__ = 558;
-
-                                                    __LINE__ = 1519;
-                                                    String.prototype.trim = function () {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1522;
-                                                            __LINE__ = 560;
-
-                                                            __LINE__ = 1523;
-                                                            __LINE__ = 34;
-
-                                                            __LINE__ = 1524;
-                                                            __LINE__ = 561;
-                                                            __LINE__ = 1525;
-                                                            return this.replace( String.prototype.trim.rtrim,"" );
-                                                          } catch( e ){
-                                                            __LINE__ = 1527;
-                                                            __LINE__ = 563;
-
-                                                            __LINE__ = 1528;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1531;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-
-                                                    __LINE__ = 1535;
-                                                    __LINE__ = 567;
-
-                                                    __LINE__ = 1536;
-                                                    __LINE__ = 37;
-
-                                                    __LINE__ = 1538;
-                                                    __LINE__ = 568;
-
-                                                    __LINE__ = 1539;
-                                                    String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                                                  };
-
-                                                  __LINE__ = 1542;
-                                                  __LINE__ = 571;
-
-                                                  __LINE__ = 1543;
-                                                  __LINE__ = 40;
-
-                                                  __LINE__ = 1545;
-                                                  __LINE__ = 572;
-
-                                                  __LINE__ = 1546;
-                                                  if ( !Function.prototype.bind ){
-                                                    __LINE__ = 1547;
-                                                    __LINE__ = 573;
-
-                                                    __LINE__ = 1548;
-                                                    __LINE__ = 41;
-
-                                                    __LINE__ = 1550;
-                                                    __LINE__ = 574;
-
-                                                    __LINE__ = 1551;
-                                                    Function.prototype.bind = function () {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1554;
-                                                            __LINE__ = 576;
-
-                                                            __LINE__ = 1555;
-                                                            __LINE__ = 42;
-
-                                                            __LINE__ = 1557;
-                                                            __LINE__ = 577;
-
-                                                            __LINE__ = 1558;
-                                                            var argArray = Array.prototype.slice.call( arguments ),
-                                                                context = argArray.shift(),
-                                                                ret = function () {
-                                                                  try {
-                                                                    try {
-                                                                      try {
-                                                                        __LINE__ = 1563;
-                                                                        __LINE__ = 581;
-
-                                                                        __LINE__ = 1564;
-                                                                        __LINE__ = 45;
-
-                                                                        __LINE__ = 1566;
-                                                                        __LINE__ = 582;
-
-                                                                        __LINE__ = 1567;
-                                                                        var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                                                        __LINE__ = 1569;
-                                                                        __LINE__ = 584;
-
-                                                                        __LINE__ = 1570;
-                                                                        __LINE__ = 47;
-
-                                                                        __LINE__ = 1572;
-                                                                        __LINE__ = 585;
-
-                                                                        __LINE__ = 1573;
-                                                                        if ( this instanceof ret ){
-                                                                          __LINE__ = 1574;
-                                                                          __LINE__ = 586;
-
-                                                                          __LINE__ = 1575;
-                                                                          __LINE__ = 48;
-
-                                                                          __LINE__ = 1576;
-                                                                          __LINE__ = 587;
-                                                                          __LINE__ = 1577;
-                                                                          return ret.context.apply( this,args );
-                                                                        } else {
-                                                                          __LINE__ = 1579;
-                                                                          __LINE__ = 589;
-
-                                                                          __LINE__ = 1580;
-                                                                          __LINE__ = 50;
-
-                                                                          __LINE__ = 1581;
-                                                                          __LINE__ = 590;
-                                                                          __LINE__ = 1582;
-                                                                          return ret.context.apply( context,args );
-                                                                        };
-                                                                      } catch( e ){
-                                                                        __LINE__ = 1585;
-                                                                        __LINE__ = 593;
-
-                                                                        __LINE__ = 1586;
-                                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                      };
-                                                                    } catch( e ){
-                                                                      __LINE__ = 1589;
-                                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                    };
-                                                                  } catch( e ){
-                                                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                  }
-                                                                };
-
-                                                            __LINE__ = 1593;
-                                                            __LINE__ = 597;
-
-                                                            __LINE__ = 1594;
-                                                            __LINE__ = 54;
-
-                                                            __LINE__ = 1596;
-                                                            __LINE__ = 598;
-
-                                                            __LINE__ = 1597;
-                                                            ret.prototype = this.prototype;
-
-                                                            __LINE__ = 1599;
-                                                            __LINE__ = 600;
-
-                                                            __LINE__ = 1600;
-                                                            __LINE__ = 56;
-
-                                                            __LINE__ = 1602;
-                                                            __LINE__ = 601;
-
-                                                            __LINE__ = 1603;
-                                                            ret.context = this;
-
-                                                            __LINE__ = 1605;
-                                                            __LINE__ = 602;
-
-                                                            __LINE__ = 1606;
-                                                            __LINE__ = 57;
-
-                                                            __LINE__ = 1607;
-                                                            __LINE__ = 603;
-                                                            __LINE__ = 1608;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 1610;
-                                                            __LINE__ = 605;
-
-                                                            __LINE__ = 1611;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1614;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1619;
-                                                  __LINE__ = 610;
-
-                                                  __LINE__ = 1620;
-                                                  __LINE__ = 61;
-
-                                                  __LINE__ = 1622;
-                                                  __LINE__ = 611;
-
-                                                  __LINE__ = 1623;
-                                                  if ( !Array.prototype.forEach ){
-                                                    __LINE__ = 1624;
-                                                    __LINE__ = 612;
-
-                                                    __LINE__ = 1625;
-                                                    __LINE__ = 62;
-
-                                                    __LINE__ = 1627;
-                                                    __LINE__ = 613;
-
-                                                    __LINE__ = 1628;
-                                                    Array.prototype.forEach = function ( fn,that ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1631;
-                                                            __LINE__ = 615;
-
-                                                            __LINE__ = 1632;
-                                                            __LINE__ = 63;
-
-                                                            __LINE__ = 1634;
-                                                            __LINE__ = 616;
-
-                                                            __LINE__ = 1635;
-                                                            var iter = -1,
-                                                                ta;
-
-                                                            __LINE__ = 1638;
-                                                            __LINE__ = 619;
-
-                                                            __LINE__ = 1639;
-                                                            __LINE__ = 66;
-
-                                                            __LINE__ = 1641;
-                                                            __LINE__ = 620;
-
-                                                            __LINE__ = 1642;
-                                                            if ( that ){
-                                                              __LINE__ = 1643;
-                                                              __LINE__ = 621;
-
-                                                              __LINE__ = 1644;
-                                                              __LINE__ = 67;
-
-                                                              __LINE__ = 1646;
-                                                              __LINE__ = 622;
-
-                                                              __LINE__ = 1647;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 1648;
-                                                                __LINE__ = 623;
-
-                                                                __LINE__ = 1649;
-                                                                __LINE__ = 68;
-
-                                                                __LINE__ = 1651;
-                                                                __LINE__ = 624;
-
-                                                                __LINE__ = 1652;
-                                                                fn.call( that,ta,iter,this );
-                                                              };
-                                                            } else {
-                                                              __LINE__ = 1655;
-                                                              __LINE__ = 627;
-
-                                                              __LINE__ = 1656;
-                                                              __LINE__ = 71;
-
-                                                              __LINE__ = 1658;
-                                                              __LINE__ = 628;
-
-                                                              __LINE__ = 1659;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 1660;
-                                                                __LINE__ = 629;
-
-                                                                __LINE__ = 1661;
-                                                                __LINE__ = 72;
-
-                                                                __LINE__ = 1663;
-                                                                __LINE__ = 630;
-
-                                                                __LINE__ = 1664;
-                                                                fn( ta,iter,this );
-                                                              };
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 1668;
-                                                            __LINE__ = 634;
-
-                                                            __LINE__ = 1669;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1672;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1677;
-                                                  __LINE__ = 639;
-
-                                                  __LINE__ = 1678;
-                                                  __LINE__ = 78;
-
-                                                  __LINE__ = 1680;
-                                                  __LINE__ = 640;
-
-                                                  __LINE__ = 1681;
-                                                  if ( !Array.prototype.every ){
-                                                    __LINE__ = 1682;
-                                                    __LINE__ = 641;
-
-                                                    __LINE__ = 1683;
-                                                    __LINE__ = 79;
-
-                                                    __LINE__ = 1685;
-                                                    __LINE__ = 642;
-
-                                                    __LINE__ = 1686;
-                                                    Array.prototype.every = function ( fn,that ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1689;
-                                                            __LINE__ = 644;
-
-                                                            __LINE__ = 1690;
-                                                            __LINE__ = 80;
-
-                                                            __LINE__ = 1692;
-                                                            __LINE__ = 645;
-
-                                                            __LINE__ = 1693;
-                                                            var iter = -1,
-                                                                ta;
-
-                                                            __LINE__ = 1696;
-                                                            __LINE__ = 648;
-
-                                                            __LINE__ = 1697;
-                                                            __LINE__ = 83;
-
-                                                            __LINE__ = 1699;
-                                                            __LINE__ = 649;
-
-                                                            __LINE__ = 1700;
-                                                            if ( that ){
-                                                              __LINE__ = 1701;
-                                                              __LINE__ = 650;
-
-                                                              __LINE__ = 1702;
-                                                              __LINE__ = 84;
-
-                                                              __LINE__ = 1704;
-                                                              __LINE__ = 651;
-
-                                                              __LINE__ = 1705;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 1706;
-                                                                __LINE__ = 652;
-
-                                                                __LINE__ = 1707;
-                                                                __LINE__ = 85;
-
-                                                                __LINE__ = 1709;
-                                                                __LINE__ = 653;
-
-                                                                __LINE__ = 1710;
-                                                                if ( !( fn.call( that,ta,iter,this ) ) ){
-                                                                  __LINE__ = 1711;
-                                                                  __LINE__ = 654;
-
-                                                                  __LINE__ = 1712;
-                                                                  __LINE__ = 86;
-
-                                                                  __LINE__ = 1713;
-                                                                  __LINE__ = 655;
-                                                                  __LINE__ = 1714;
-                                                                  return false;
-                                                                };
-                                                              };
-                                                            } else {
-                                                              __LINE__ = 1718;
-                                                              __LINE__ = 659;
-
-                                                              __LINE__ = 1719;
-                                                              __LINE__ = 90;
-
-                                                              __LINE__ = 1721;
-                                                              __LINE__ = 660;
-
-                                                              __LINE__ = 1722;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                if ( !( fn( ta,iter,this ) ) ){
-                                                                  __LINE__ = 1724;
-                                                                  __LINE__ = 662;
-
-                                                                  __LINE__ = 1725;
-                                                                  __LINE__ = 92;
-
-                                                                  __LINE__ = 1726;
-                                                                  __LINE__ = 663;
-                                                                  __LINE__ = 1727;
-                                                                  return false;
-                                                                };
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 1732;
-                                                            __LINE__ = 667;
-
-                                                            __LINE__ = 1733;
-                                                            __LINE__ = 96;
-
-                                                            __LINE__ = 1734;
-                                                            __LINE__ = 668;
-                                                            __LINE__ = 1735;
-                                                            return true;
-                                                          } catch( e ){
-                                                            __LINE__ = 1737;
-                                                            __LINE__ = 670;
-
-                                                            __LINE__ = 1738;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1741;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1746;
-                                                  __LINE__ = 675;
-
-                                                  __LINE__ = 1747;
-                                                  __LINE__ = 100;
-
-                                                  __LINE__ = 1749;
-                                                  __LINE__ = 676;
-
-                                                  __LINE__ = 1750;
-                                                  if ( !Array.prototype.some ){
-                                                    __LINE__ = 1751;
-                                                    __LINE__ = 677;
-
-                                                    __LINE__ = 1752;
-                                                    __LINE__ = 101;
-
-                                                    __LINE__ = 1754;
-                                                    __LINE__ = 678;
-
-                                                    __LINE__ = 1755;
-                                                    Array.prototype.some = function ( fn,that ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1758;
-                                                            __LINE__ = 680;
-
-                                                            __LINE__ = 1759;
-                                                            __LINE__ = 102;
-
-                                                            __LINE__ = 1761;
-                                                            __LINE__ = 681;
-
-                                                            __LINE__ = 1762;
-                                                            var iter = -1,
-                                                                ta;
-
-                                                            __LINE__ = 1765;
-                                                            __LINE__ = 684;
-
-                                                            __LINE__ = 1766;
-                                                            __LINE__ = 105;
-
-                                                            __LINE__ = 1768;
-                                                            __LINE__ = 685;
-
-                                                            __LINE__ = 1769;
-                                                            if ( that ){
-                                                              __LINE__ = 1770;
-                                                              __LINE__ = 686;
-
-                                                              __LINE__ = 1771;
-                                                              __LINE__ = 106;
-
-                                                              __LINE__ = 1773;
-                                                              __LINE__ = 687;
-
-                                                              __LINE__ = 1774;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 1775;
-                                                                __LINE__ = 688;
-
-                                                                __LINE__ = 1776;
-                                                                __LINE__ = 107;
-
-                                                                __LINE__ = 1778;
-                                                                __LINE__ = 689;
-
-                                                                __LINE__ = 1779;
-                                                                if ( fn.call( that,ta,iter,this ) ){
-                                                                  __LINE__ = 1780;
-                                                                  __LINE__ = 690;
-
-                                                                  __LINE__ = 1781;
-                                                                  __LINE__ = 108;
-
-                                                                  __LINE__ = 1782;
-                                                                  __LINE__ = 691;
-                                                                  __LINE__ = 1783;
-                                                                  return true;
-                                                                };
-                                                              };
-                                                            } else {
-                                                              __LINE__ = 1787;
-                                                              __LINE__ = 695;
-
-                                                              __LINE__ = 1788;
-                                                              __LINE__ = 112;
-
-                                                              __LINE__ = 1790;
-                                                              __LINE__ = 696;
-
-                                                              __LINE__ = 1791;
-                                                              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                                if ( fn( ta,iter,this ) ){
-                                                                  __LINE__ = 1793;
-                                                                  __LINE__ = 698;
-
-                                                                  __LINE__ = 1794;
-                                                                  __LINE__ = 114;
-
-                                                                  __LINE__ = 1795;
-                                                                  __LINE__ = 699;
-                                                                  __LINE__ = 1796;
-                                                                  return true;
-                                                                };
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 1801;
-                                                            __LINE__ = 703;
-
-                                                            __LINE__ = 1802;
-                                                            __LINE__ = 118;
-
-                                                            __LINE__ = 1803;
-                                                            __LINE__ = 704;
-                                                            __LINE__ = 1804;
-                                                            return false;
-                                                          } catch( e ){
-                                                            __LINE__ = 1806;
-                                                            __LINE__ = 706;
-
-                                                            __LINE__ = 1807;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1810;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1815;
-                                                  __LINE__ = 711;
-
-                                                  __LINE__ = 1816;
-                                                  __LINE__ = 122;
-
-                                                  __LINE__ = 1818;
-                                                  __LINE__ = 712;
-
-                                                  __LINE__ = 1819;
-                                                  if ( !Array.prototype.filter ){
-                                                    __LINE__ = 1820;
-                                                    __LINE__ = 713;
-
-                                                    __LINE__ = 1821;
-                                                    __LINE__ = 123;
-
-                                                    __LINE__ = 1823;
-                                                    __LINE__ = 714;
-
-                                                    __LINE__ = 1824;
-                                                    Array.prototype.filter = function ( fn,that ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1827;
-                                                            __LINE__ = 716;
-
-                                                            __LINE__ = 1828;
-                                                            __LINE__ = 124;
-
-                                                            __LINE__ = 1830;
-                                                            __LINE__ = 717;
-
-                                                            __LINE__ = 1831;
-                                                            var iter = -1,
-                                                                ret = [],
-                                                                ta;
-
-                                                            __LINE__ = 1835;
-                                                            __LINE__ = 721;
-
-                                                            __LINE__ = 1836;
-                                                            __LINE__ = 128;
-
-                                                            __LINE__ = 1838;
-                                                            __LINE__ = 722;
-
-                                                            __LINE__ = 1839;
-                                                            if ( that ){
-                                                              __LINE__ = 1840;
-                                                              __LINE__ = 723;
-
-                                                              __LINE__ = 1841;
-                                                              __LINE__ = 129;
-
-                                                              __LINE__ = 1843;
-                                                              __LINE__ = 724;
-
-                                                              __LINE__ = 1844;
-                                                              for ( var i = 0,len = this.length;i<len; ++ i ){
-                                                                __LINE__ = 1845;
-                                                                __LINE__ = 725;
-
-                                                                __LINE__ = 1846;
-                                                                __LINE__ = 130;
-
-                                                                __LINE__ = 1848;
-                                                                __LINE__ = 726;
-
-                                                                __LINE__ = 1849;
-                                                                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                  __LINE__ = 1850;
-                                                                  __LINE__ = 727;
-
-                                                                  __LINE__ = 1851;
-                                                                  __LINE__ = 131;
-
-                                                                  __LINE__ = 1853;
-                                                                  __LINE__ = 728;
-
-                                                                  __LINE__ = 1854;
-                                                                  if ( fn.call( that,ta,i,this ) ){
-                                                                    __LINE__ = 1855;
-                                                                    __LINE__ = 729;
-
-                                                                    __LINE__ = 1856;
-                                                                    __LINE__ = 132;
-
-                                                                    __LINE__ = 1858;
-                                                                    __LINE__ = 730;
-
-                                                                    __LINE__ = 1859;
-                                                                    ret[ ++ iter] = ta;
-                                                                  };
-                                                                };
-                                                              };
-                                                            } else {
-                                                              __LINE__ = 1864;
-                                                              __LINE__ = 735;
-
-                                                              __LINE__ = 1865;
-                                                              __LINE__ = 137;
-
-                                                              __LINE__ = 1867;
-                                                              __LINE__ = 736;
-
-                                                              __LINE__ = 1868;
-                                                              for ( var i = 0,len = this.length;i<len; ++ i ){
-                                                                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                  if ( fn( ta,i,this ) ){
-                                                                    __LINE__ = 1871;
-                                                                    __LINE__ = 739;
-
-                                                                    __LINE__ = 1872;
-                                                                    __LINE__ = 140;
-
-                                                                    __LINE__ = 1874;
-                                                                    __LINE__ = 740;
-
-                                                                    __LINE__ = 1875;
-                                                                    ret[ ++ iter] = ta;
-                                                                  };
-                                                                };
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 1881;
-                                                            __LINE__ = 745;
-
-                                                            __LINE__ = 1882;
-                                                            __LINE__ = 145;
-
-                                                            __LINE__ = 1883;
-                                                            __LINE__ = 746;
-                                                            __LINE__ = 1884;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 1886;
-                                                            __LINE__ = 748;
-
-                                                            __LINE__ = 1887;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1890;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1895;
-                                                  __LINE__ = 753;
-
-                                                  __LINE__ = 1896;
-                                                  __LINE__ = 149;
-
-                                                  __LINE__ = 1898;
-                                                  __LINE__ = 754;
-
-                                                  __LINE__ = 1899;
-                                                  if ( !Array.prototype.indexOf ){
-                                                    __LINE__ = 1900;
-                                                    __LINE__ = 755;
-
-                                                    __LINE__ = 1901;
-                                                    __LINE__ = 150;
-
-                                                    __LINE__ = 1903;
-                                                    __LINE__ = 756;
-
-                                                    __LINE__ = 1904;
-                                                    Array.prototype.indexOf = function ( subject ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1907;
-                                                            __LINE__ = 758;
-
-                                                            __LINE__ = 1908;
-                                                            __LINE__ = 151;
-
-                                                            __LINE__ = 1910;
-                                                            __LINE__ = 759;
-
-                                                            __LINE__ = 1911;
-                                                            var iter = -1,
-                                                                index = -1,
-                                                                ta;
-
-                                                            __LINE__ = 1915;
-                                                            __LINE__ = 763;
-
-                                                            __LINE__ = 1916;
-                                                            __LINE__ = 155;
-
-                                                            __LINE__ = 1918;
-                                                            __LINE__ = 764;
-
-                                                            __LINE__ = 1919;
-                                                            while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                                              __LINE__ = 1920;
-                                                              __LINE__ = 765;
-
-                                                              __LINE__ = 1921;
-                                                              __LINE__ = 156;
-
-                                                              __LINE__ = 1923;
-                                                              __LINE__ = 766;
-
-                                                              __LINE__ = 1924;
-                                                              if ( ta === subject ){
-                                                                __LINE__ = 1925;
-                                                                __LINE__ = 767;
-
-                                                                __LINE__ = 1926;
-                                                                __LINE__ = 157;
-
-                                                                __LINE__ = 1928;
-                                                                __LINE__ = 768;
-
-                                                                __LINE__ = 1929;
-                                                                index = iter;
-
-                                                                __LINE__ = 1931;
-                                                                __LINE__ = 769;
-
-                                                                __LINE__ = 1932;
-                                                                __LINE__ = 158;
-
-                                                                __LINE__ = 1933;
-                                                                __LINE__ = 770;
-                                                                __LINE__ = 1934;
-                                                                break;
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 1938;
-                                                            __LINE__ = 773;
-
-                                                            __LINE__ = 1939;
-                                                            __LINE__ = 161;
-
-                                                            __LINE__ = 1940;
-                                                            __LINE__ = 774;
-                                                            __LINE__ = 1941;
-                                                            return index;
-                                                          } catch( e ){
-                                                            __LINE__ = 1943;
-                                                            __LINE__ = 776;
-
-                                                            __LINE__ = 1944;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 1947;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 1952;
-                                                  __LINE__ = 781;
-
-                                                  __LINE__ = 1953;
-                                                  __LINE__ = 165;
-
-                                                  __LINE__ = 1955;
-                                                  __LINE__ = 782;
-
-                                                  __LINE__ = 1956;
-                                                  if ( !Array.prototype.lastIndexOf ){
-                                                    __LINE__ = 1957;
-                                                    __LINE__ = 783;
-
-                                                    __LINE__ = 1958;
-                                                    __LINE__ = 166;
-
-                                                    __LINE__ = 1960;
-                                                    __LINE__ = 784;
-
-                                                    __LINE__ = 1961;
-                                                    Array.prototype.lastIndexOf = function ( subject ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 1964;
-                                                            __LINE__ = 786;
-
-                                                            __LINE__ = 1965;
-                                                            __LINE__ = 167;
-
-                                                            __LINE__ = 1967;
-                                                            __LINE__ = 787;
-
-                                                            __LINE__ = 1968;
-                                                            var iter = this.length,
-                                                                index = -1,
-                                                                ta;
-
-                                                            __LINE__ = 1972;
-                                                            __LINE__ = 791;
-
-                                                            __LINE__ = 1973;
-                                                            __LINE__ = 171;
-
-                                                            __LINE__ = 1975;
-                                                            __LINE__ = 792;
-
-                                                            __LINE__ = 1976;
-                                                            while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                                                              __LINE__ = 1977;
-                                                              __LINE__ = 793;
-
-                                                              __LINE__ = 1978;
-                                                              __LINE__ = 172;
-
-                                                              __LINE__ = 1980;
-                                                              __LINE__ = 794;
-
-                                                              __LINE__ = 1981;
-                                                              if ( ta === subject ){
-                                                                __LINE__ = 1982;
-                                                                __LINE__ = 795;
-
-                                                                __LINE__ = 1983;
-                                                                __LINE__ = 173;
-
-                                                                __LINE__ = 1985;
-                                                                __LINE__ = 796;
-
-                                                                __LINE__ = 1986;
-                                                                index = iter;
-
-                                                                __LINE__ = 1988;
-                                                                __LINE__ = 797;
-
-                                                                __LINE__ = 1989;
-                                                                __LINE__ = 174;
-
-                                                                __LINE__ = 1990;
-                                                                __LINE__ = 798;
-                                                                __LINE__ = 1991;
-                                                                break;
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 1995;
-                                                            __LINE__ = 801;
-
-                                                            __LINE__ = 1996;
-                                                            __LINE__ = 177;
-
-                                                            __LINE__ = 1997;
-                                                            __LINE__ = 802;
-                                                            __LINE__ = 1998;
-                                                            return index;
-                                                          } catch( e ){
-                                                            __LINE__ = 2000;
-                                                            __LINE__ = 804;
-
-                                                            __LINE__ = 2001;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2004;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2009;
-                                                  __LINE__ = 809;
-
-                                                  __LINE__ = 2010;
-                                                  __LINE__ = 181;
-
-                                                  __LINE__ = 2012;
-                                                  __LINE__ = 810;
-
-                                                  __LINE__ = 2013;
-                                                  if ( !Array.prototype.map ){
-                                                    __LINE__ = 2014;
-                                                    __LINE__ = 811;
-
-                                                    __LINE__ = 2015;
-                                                    __LINE__ = 182;
-
-                                                    __LINE__ = 2017;
-                                                    __LINE__ = 812;
-
-                                                    __LINE__ = 2018;
-                                                    Array.prototype.map = function ( fn,that ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2021;
-                                                            __LINE__ = 814;
-
-                                                            __LINE__ = 2022;
-                                                            __LINE__ = 183;
-
-                                                            __LINE__ = 2024;
-                                                            __LINE__ = 815;
-
-                                                            __LINE__ = 2025;
-                                                            var ret = [],
-                                                                iter = -1,
-                                                                ta;
-
-                                                            __LINE__ = 2029;
-                                                            __LINE__ = 819;
-
-                                                            __LINE__ = 2030;
-                                                            __LINE__ = 187;
-
-                                                            __LINE__ = 2032;
-                                                            __LINE__ = 820;
-
-                                                            __LINE__ = 2033;
-                                                            if ( that ){
-                                                              __LINE__ = 2034;
-                                                              __LINE__ = 821;
-
-                                                              __LINE__ = 2035;
-                                                              __LINE__ = 188;
-
-                                                              __LINE__ = 2037;
-                                                              __LINE__ = 822;
-
-                                                              __LINE__ = 2038;
-                                                              for ( var i = 0,len = this.length;i<len; ++ i ){
-                                                                __LINE__ = 2039;
-                                                                __LINE__ = 823;
-
-                                                                __LINE__ = 2040;
-                                                                __LINE__ = 189;
-
-                                                                __LINE__ = 2042;
-                                                                __LINE__ = 824;
-
-                                                                __LINE__ = 2043;
-                                                                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                  __LINE__ = 2044;
-                                                                  __LINE__ = 825;
-
-                                                                  __LINE__ = 2045;
-                                                                  __LINE__ = 190;
-
-                                                                  __LINE__ = 2047;
-                                                                  __LINE__ = 826;
-
-                                                                  __LINE__ = 2048;
-                                                                  ret[ ++ iter] = fn.call( that,ta,i,this );
-                                                                };
-                                                              };
-                                                            } else {
-                                                              __LINE__ = 2052;
-                                                              __LINE__ = 830;
-
-                                                              __LINE__ = 2053;
-                                                              __LINE__ = 194;
-
-                                                              __LINE__ = 2055;
-                                                              __LINE__ = 831;
-
-                                                              __LINE__ = 2056;
-                                                              for ( var i = 0,len = this.length;i<len; ++ i ){
-                                                                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                  __LINE__ = 2058;
-                                                                  __LINE__ = 833;
-
-                                                                  __LINE__ = 2059;
-                                                                  __LINE__ = 196;
-
-                                                                  __LINE__ = 2061;
-                                                                  __LINE__ = 834;
-
-                                                                  __LINE__ = 2062;
-                                                                  ret[ ++ iter] = fn( ta,i,this );
-                                                                };
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 2067;
-                                                            __LINE__ = 838;
-
-                                                            __LINE__ = 2068;
-                                                            __LINE__ = 200;
-
-                                                            __LINE__ = 2069;
-                                                            __LINE__ = 839;
-                                                            __LINE__ = 2070;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 2072;
-                                                            __LINE__ = 841;
-
-                                                            __LINE__ = 2073;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2076;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2081;
-                                                  __LINE__ = 846;
-
-                                                  __LINE__ = 2082;
-                                                  __LINE__ = 204;
-
-                                                  __LINE__ = 2084;
-                                                  __LINE__ = 847;
-
-                                                  __LINE__ = 2085;
-                                                  if ( !Array.prototype.reduce ){
-                                                    __LINE__ = 2086;
-                                                    __LINE__ = 848;
-
-                                                    __LINE__ = 2087;
-                                                    __LINE__ = 205;
-
-                                                    __LINE__ = 2089;
-                                                    __LINE__ = 849;
-
-                                                    __LINE__ = 2090;
-                                                    Array.prototype.reduce = function ( fn,initial ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2093;
-                                                            __LINE__ = 851;
-
-                                                            __LINE__ = 2094;
-                                                            __LINE__ = 206;
-
-                                                            __LINE__ = 2096;
-                                                            __LINE__ = 852;
-
-                                                            __LINE__ = 2097;
-                                                            var ret = initial || this[0],
-                                                                i = ( ( ( ( ( initial ) ) ) ) )?0 : 1,
-                                                                ta,
-                                                                len;
-
-                                                            __LINE__ = 2102;
-                                                            __LINE__ = 857;
-
-                                                            __LINE__ = 2103;
-                                                            __LINE__ = 211;
-
-                                                            __LINE__ = 2105;
-                                                            __LINE__ = 858;
-
-                                                            __LINE__ = 2106;
-                                                            for ( i , len = this.length;i<len; ++ i ){
-                                                              __LINE__ = 2107;
-                                                              __LINE__ = 859;
-
-                                                              __LINE__ = 2108;
-                                                              __LINE__ = 212;
-
-                                                              __LINE__ = 2110;
-                                                              __LINE__ = 860;
-
-                                                              __LINE__ = 2111;
-                                                              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 2112;
-                                                                __LINE__ = 861;
-
-                                                                __LINE__ = 2113;
-                                                                __LINE__ = 213;
-
-                                                                __LINE__ = 2115;
-                                                                __LINE__ = 862;
-
-                                                                __LINE__ = 2116;
-                                                                ret = fn( ret,ta,i,this );
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 2120;
-                                                            __LINE__ = 865;
-
-                                                            __LINE__ = 2121;
-                                                            __LINE__ = 216;
-
-                                                            __LINE__ = 2122;
-                                                            __LINE__ = 866;
-                                                            __LINE__ = 2123;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 2125;
-                                                            __LINE__ = 868;
-
-                                                            __LINE__ = 2126;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2129;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2134;
-                                                  __LINE__ = 873;
-
-                                                  __LINE__ = 2135;
-                                                  __LINE__ = 220;
-
-                                                  __LINE__ = 2137;
-                                                  __LINE__ = 874;
-
-                                                  __LINE__ = 2138;
-                                                  if ( !Array.prototype.reduceRight ){
-                                                    __LINE__ = 2139;
-                                                    __LINE__ = 875;
-
-                                                    __LINE__ = 2140;
-                                                    __LINE__ = 221;
-
-                                                    __LINE__ = 2142;
-                                                    __LINE__ = 876;
-
-                                                    __LINE__ = 2143;
-                                                    Array.prototype.reduceRight = function ( fn,initial ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2146;
-                                                            __LINE__ = 878;
-
-                                                            __LINE__ = 2147;
-                                                            __LINE__ = 222;
-
-                                                            __LINE__ = 2149;
-                                                            __LINE__ = 879;
-
-                                                            __LINE__ = 2150;
-                                                            var ret = initial || this[this.length-1],
-                                                                i = ( ( ( ( ( initial ) ) ) ) )?this.length-1 : this.length-2,
-                                                                ta;
-
-                                                            __LINE__ = 2154;
-                                                            __LINE__ = 883;
-
-                                                            __LINE__ = 2155;
-                                                            __LINE__ = 226;
-
-                                                            __LINE__ = 2157;
-                                                            __LINE__ = 884;
-
-                                                            __LINE__ = 2158;
-                                                            for ( i;i>-1; -- i ){
-                                                              __LINE__ = 2159;
-                                                              __LINE__ = 885;
-
-                                                              __LINE__ = 2160;
-                                                              __LINE__ = 227;
-
-                                                              __LINE__ = 2162;
-                                                              __LINE__ = 886;
-
-                                                              __LINE__ = 2163;
-                                                              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                                                __LINE__ = 2164;
-                                                                __LINE__ = 887;
-
-                                                                __LINE__ = 2165;
-                                                                __LINE__ = 228;
-
-                                                                __LINE__ = 2167;
-                                                                __LINE__ = 888;
-
-                                                                __LINE__ = 2168;
-                                                                ret = fn( ret,ta,i,this );
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 2172;
-                                                            __LINE__ = 891;
-
-                                                            __LINE__ = 2173;
-                                                            __LINE__ = 231;
-
-                                                            __LINE__ = 2174;
-                                                            __LINE__ = 892;
-                                                            __LINE__ = 2175;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 2177;
-                                                            __LINE__ = 894;
-
-                                                            __LINE__ = 2178;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2181;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2186;
-                                                  __LINE__ = 899;
-
-                                                  __LINE__ = 2187;
-                                                  __LINE__ = 235;
-
-                                                  __LINE__ = 2189;
-                                                  __LINE__ = 900;
-
-                                                  __LINE__ = 2190;
-                                                  if ( !Date.prototype.toJSON ){
-                                                    __LINE__ = 2191;
-                                                    __LINE__ = 901;
-
-                                                    __LINE__ = 2192;
-                                                    __LINE__ = 236;
-
-                                                    __LINE__ = 2194;
-                                                    __LINE__ = 902;
-
-                                                    __LINE__ = 2195;
-                                                    Date.prototype.toJSON = function () {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2198;
-                                                            __LINE__ = 904;
-
-                                                            __LINE__ = 2199;
-                                                            __LINE__ = 237;
-
-                                                            __LINE__ = 2200;
-                                                            __LINE__ = 905;
-                                                            __LINE__ = 2201;
-                                                            return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                                                          } catch( e ){
-                                                            __LINE__ = 2203;
-                                                            __LINE__ = 907;
-
-                                                            __LINE__ = 2204;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2207;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2212;
-                                                  __LINE__ = 912;
-
-                                                  __LINE__ = 2213;
-                                                  __LINE__ = 241;
-
-                                                  __LINE__ = 2215;
-                                                  __LINE__ = 913;
-
-                                                  __LINE__ = 2216;
-                                                  if ( !Date.now ){
-                                                    __LINE__ = 2217;
-                                                    __LINE__ = 914;
-
-                                                    __LINE__ = 2218;
-                                                    __LINE__ = 242;
-
-                                                    __LINE__ = 2220;
-                                                    __LINE__ = 915;
-
-                                                    __LINE__ = 2221;
-                                                    Date.now = function () {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2224;
-                                                            __LINE__ = 917;
-
-                                                            __LINE__ = 2225;
-                                                            __LINE__ = 243;
-
-                                                            __LINE__ = 2226;
-                                                            __LINE__ = 918;
-                                                            __LINE__ = 2227;
-                                                            return +new Date();
-                                                          } catch( e ){
-                                                            __LINE__ = 2229;
-                                                            __LINE__ = 920;
-
-                                                            __LINE__ = 2230;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2233;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2238;
-                                                  __LINE__ = 925;
-
-                                                  __LINE__ = 2239;
-                                                  __LINE__ = 247;
-
-                                                  __LINE__ = 2241;
-                                                  __LINE__ = 926;
-
-                                                  __LINE__ = 2242;
-                                                  if ( !Object.keys ){
-                                                    __LINE__ = 2243;
-                                                    __LINE__ = 927;
-
-                                                    __LINE__ = 2244;
-                                                    __LINE__ = 248;
-
-                                                    __LINE__ = 2246;
-                                                    __LINE__ = 928;
-
-                                                    __LINE__ = 2247;
-                                                    Object.keys = function ( obj ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2250;
-                                                            __LINE__ = 930;
-
-                                                            __LINE__ = 2251;
-                                                            __LINE__ = 249;
-
-                                                            __LINE__ = 2253;
-                                                            __LINE__ = 931;
-
-                                                            __LINE__ = 2254;
-                                                            var ret = [],
-                                                                iter = -1;
-
-                                                            __LINE__ = 2257;
-                                                            __LINE__ = 934;
-
-                                                            __LINE__ = 2258;
-                                                            __LINE__ = 252;
-
-                                                            __LINE__ = 2260;
-                                                            __LINE__ = 935;
-
-                                                            __LINE__ = 2261;
-                                                            for ( var i in obj ){
-                                                              __LINE__ = 2262;
-                                                              __LINE__ = 936;
-
-                                                              __LINE__ = 2263;
-                                                              __LINE__ = 253;
-
-                                                              __LINE__ = 2265;
-                                                              __LINE__ = 937;
-
-                                                              __LINE__ = 2266;
-                                                              if ( obj.hasOwnProperty( i ) ){
-                                                                __LINE__ = 2267;
-                                                                __LINE__ = 938;
-
-                                                                __LINE__ = 2268;
-                                                                __LINE__ = 254;
-
-                                                                __LINE__ = 2270;
-                                                                __LINE__ = 939;
-
-                                                                __LINE__ = 2271;
-                                                                ret[ ++ iter] = obj[i];
-                                                              };
-                                                            };
-
-                                                            __LINE__ = 2275;
-                                                            __LINE__ = 942;
-
-                                                            __LINE__ = 2276;
-                                                            __LINE__ = 257;
-
-                                                            __LINE__ = 2277;
-                                                            __LINE__ = 943;
-                                                            __LINE__ = 2278;
-                                                            return ret;
-                                                          } catch( e ){
-                                                            __LINE__ = 2280;
-                                                            __LINE__ = 945;
-
-                                                            __LINE__ = 2281;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2284;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2289;
-                                                  __LINE__ = 950;
-
-                                                  __LINE__ = 2290;
-                                                  __LINE__ = 261;
-
-                                                  __LINE__ = 2292;
-                                                  __LINE__ = 951;
-
-                                                  __LINE__ = 2293;
-                                                  if ( !Object.preventExtensions ){
-                                                    __LINE__ = 2294;
-                                                    __LINE__ = 952;
-
-                                                    __LINE__ = 2295;
-                                                    __LINE__ = 262;
-
-                                                    __LINE__ = 2297;
-                                                    __LINE__ = 953;
-
-                                                    __LINE__ = 2298;
-                                                    Object.preventExtensions = function ( o ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2301;
-                                                            __LINE__ = 955;
-
-                                                            __LINE__ = 2302;
-                                                            __LINE__ = 263;
-
-                                                            __LINE__ = 2303;
-                                                            __LINE__ = 956;
-                                                            __LINE__ = 2304;
-                                                            return o;
-                                                          } catch( e ){
-                                                            __LINE__ = 2306;
-                                                            __LINE__ = 958;
-
-                                                            __LINE__ = 2307;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2310;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2315;
-                                                  __LINE__ = 963;
-
-                                                  __LINE__ = 2316;
-                                                  __LINE__ = 267;
-
-                                                  __LINE__ = 2318;
-                                                  __LINE__ = 964;
-
-                                                  __LINE__ = 2319;
-                                                  if ( !Object.seal ){
-                                                    __LINE__ = 2320;
-                                                    __LINE__ = 965;
-
-                                                    __LINE__ = 2321;
-                                                    __LINE__ = 268;
-
-                                                    __LINE__ = 2323;
-                                                    __LINE__ = 966;
-
-                                                    __LINE__ = 2324;
-                                                    Object.seal = function ( o ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2327;
-                                                            __LINE__ = 968;
-
-                                                            __LINE__ = 2328;
-                                                            __LINE__ = 269;
-
-                                                            __LINE__ = 2329;
-                                                            __LINE__ = 969;
-                                                            __LINE__ = 2330;
-                                                            return o;
-                                                          } catch( e ){
-                                                            __LINE__ = 2332;
-                                                            __LINE__ = 971;
-
-                                                            __LINE__ = 2333;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2336;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2341;
-                                                  __LINE__ = 976;
-
-                                                  __LINE__ = 2342;
-                                                  __LINE__ = 273;
-
-                                                  __LINE__ = 2344;
-                                                  __LINE__ = 977;
-
-                                                  __LINE__ = 2345;
-                                                  if ( !Object.freeze ){
-                                                    __LINE__ = 2346;
-                                                    __LINE__ = 978;
-
-                                                    __LINE__ = 2347;
-                                                    __LINE__ = 274;
-
-                                                    __LINE__ = 2349;
-                                                    __LINE__ = 979;
-
-                                                    __LINE__ = 2350;
-                                                    Object.freeze = function ( o ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2353;
-                                                            __LINE__ = 981;
-
-                                                            __LINE__ = 2354;
-                                                            __LINE__ = 275;
-
-                                                            __LINE__ = 2355;
-                                                            __LINE__ = 982;
-                                                            __LINE__ = 2356;
-                                                            return o;
-                                                          } catch( e ){
-                                                            __LINE__ = 2358;
-                                                            __LINE__ = 984;
-
-                                                            __LINE__ = 2359;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2362;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2367;
-                                                  __LINE__ = 989;
-
-                                                  __LINE__ = 2368;
-                                                  __LINE__ = 279;
-
-                                                  __LINE__ = 2370;
-                                                  __LINE__ = 990;
-
-                                                  __LINE__ = 2371;
-                                                  var hasRealEcma5 = ( function () {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              try {
-                                                                __LINE__ = 2375;
-                                                                __LINE__ = 993;
-
-                                                                __LINE__ = 2376;
-                                                                __LINE__ = 281;
-
-                                                                __LINE__ = 2378;
-                                                                __LINE__ = 994;
-
-                                                                __LINE__ = 2379;
-                                                                var obj = {};
-
-                                                                __LINE__ = 2381;
-                                                                __LINE__ = 996;
-
-                                                                __LINE__ = 2382;
-                                                                __LINE__ = 283;
-
-                                                                __LINE__ = 2384;
-                                                                __LINE__ = 997;
-
-                                                                __LINE__ = 2385;
-                                                                Object.defineProperty( obj,"test", {
-                                                                  configurable : false,
-                                                                  writable : false,
-                                                                  enumerable : false,
-                                                                  value : 0
-                                                                });
-
-                                                                __LINE__ = 2392;
-                                                                __LINE__ = 1004;
-
-                                                                __LINE__ = 2393;
-                                                                __LINE__ = 290;
-
-                                                                __LINE__ = 2395;
-                                                                __LINE__ = 1005;
-
-                                                                __LINE__ = 2396;
-                                                                obj.test = 200;
-
-                                                                __LINE__ = 2398;
-                                                                __LINE__ = 1006;
-
-                                                                __LINE__ = 2399;
-                                                                __LINE__ = 291;
-
-                                                                __LINE__ = 2400;
-                                                                __LINE__ = 1007;
-                                                                __LINE__ = 2401;
-                                                                return ( ( ( ( ( obj.test === 200 ) ) ) ) )?false : true;
-                                                              } catch( e ){
-                                                                __LINE__ = 2403;
-                                                                __LINE__ = 1009;
-
-                                                                __LINE__ = 2404;
-                                                                __LINE__ = 293;
-
-                                                                __LINE__ = 2405;
-                                                                __LINE__ = 1010;
-                                                                __LINE__ = 2406;
-                                                                return false;
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 2409;
-                                                              __LINE__ = 1013;
-
-                                                              __LINE__ = 2410;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2413;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      })();
-
-                                                  __LINE__ = 2417;
-                                                  __LINE__ = 1017;
-
-                                                  __LINE__ = 2418;
-                                                  __LINE__ = 297;
-
-                                                  __LINE__ = 2420;
-                                                  __LINE__ = 1018;
-
-                                                  __LINE__ = 2421;
-                                                  if ( !hasRealEcma5 ){
-                                                    __LINE__ = 2422;
-                                                    __LINE__ = 1019;
-
-                                                    __LINE__ = 2423;
-                                                    __LINE__ = 298;
-
-                                                    __LINE__ = 2425;
-                                                    __LINE__ = 1020;
-
-                                                    __LINE__ = 2426;
-                                                    Object.defineProperty = function ( obj,prop,valobj ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2429;
-                                                            __LINE__ = 1022;
-
-                                                            __LINE__ = 2430;
-                                                            __LINE__ = 299;
-
-                                                            __LINE__ = 2432;
-                                                            __LINE__ = 1023;
-
-                                                            __LINE__ = 2433;
-                                                            if ( valobj.value ){
-                                                              __LINE__ = 2434;
-                                                              __LINE__ = 1024;
-
-                                                              __LINE__ = 2435;
-                                                              __LINE__ = 300;
-
-                                                              __LINE__ = 2437;
-                                                              __LINE__ = 1025;
-
-                                                              __LINE__ = 2438;
-                                                              obj[prop] = valobj.value;
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2441;
-                                                            __LINE__ = 1028;
-
-                                                            __LINE__ = 2442;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2445;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2450;
-                                                  __LINE__ = 1033;
-
-                                                  __LINE__ = 2451;
-                                                  __LINE__ = 305;
-
-                                                  __LINE__ = 2453;
-                                                  __LINE__ = 1034;
-
-                                                  __LINE__ = 2454;
-                                                  if ( !Array.isArray ){
-                                                    __LINE__ = 2455;
-                                                    __LINE__ = 1035;
-
-                                                    __LINE__ = 2456;
-                                                    __LINE__ = 306;
-
-                                                    __LINE__ = 2458;
-                                                    __LINE__ = 1036;
-
-                                                    __LINE__ = 2459;
-                                                    var arrayString = "[object Array]";
-
-                                                    __LINE__ = 2461;
-                                                    __LINE__ = 1038;
-
-                                                    __LINE__ = 2462;
-                                                    __LINE__ = 308;
-
-                                                    __LINE__ = 2464;
-                                                    __LINE__ = 1039;
-
-                                                    __LINE__ = 2465;
-                                                    Array.isArray = function ( arr ) {
-                                                      try {
-                                                        try {
-                                                          try {
-                                                            __LINE__ = 2468;
-                                                            __LINE__ = 1041;
-
-                                                            __LINE__ = 2469;
-                                                            __LINE__ = 309;
-
-                                                            __LINE__ = 2471;
-                                                            __LINE__ = 1042;
-
-                                                            __LINE__ = 2472;
-                                                            if ( arguments.length === 0 ){
-                                                              __LINE__ = 2473;
-                                                              __LINE__ = 1043;
-
-                                                              __LINE__ = 2474;
-                                                              __LINE__ = 310;
-
-                                                              __LINE__ = 2475;
-                                                              __LINE__ = 1044;
-                                                              __LINE__ = 2476;
-                                                              return false;
-                                                            };
-
-                                                            __LINE__ = 2479;
-                                                            __LINE__ = 1046;
-
-                                                            __LINE__ = 2480;
-                                                            __LINE__ = 312;
-
-                                                            __LINE__ = 2481;
-                                                            __LINE__ = 1047;
-                                                            __LINE__ = 2482;
-                                                            return ( ( ( ( ( arr ) ) ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                                                          } catch( e ){
-                                                            __LINE__ = 2484;
-                                                            __LINE__ = 1049;
-
-                                                            __LINE__ = 2485;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          __LINE__ = 2488;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                      }
-                                                    };
-                                                  };
-
-                                                  __LINE__ = 2493;
-                                                  __LINE__ = 1054;
-
-                                                  __LINE__ = 2494;
-                                                  __LINE__ = 316;
-
-                                                  __LINE__ = 2496;
-                                                  __LINE__ = 1055;
-
-                                                  __LINE__ = 2497;
-                                                  var slice = Array.prototype.slice;
-
-                                                  __LINE__ = 2499;
-                                                  __LINE__ = 1057;
-
-                                                  __LINE__ = 2500;
-                                                  __LINE__ = 318;
-
-                                                  __LINE__ = 2502;
-                                                  __LINE__ = 1058;
-
-                                                  __LINE__ = 2503;
-                                                  var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2506;
-                                                              __LINE__ = 1060;
-
-                                                              __LINE__ = 2507;
-                                                              __LINE__ = 319;
-
-                                                              __LINE__ = 2508;
-                                                              __LINE__ = 1061;
-                                                              __LINE__ = 2509;
-                                                              return Object.defineProperty( obj,prop, {
-                                                                configurable : true,
-                                                                enumerable : false,
-                                                                writable : true,
-                                                                value : value
-                                                              });
-                                                            } catch( e ){
-                                                              __LINE__ = 2516;
-                                                              __LINE__ = 1068;
-
-                                                              __LINE__ = 2517;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2520;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2524;
-                                                  __LINE__ = 1072;
-
-                                                  __LINE__ = 2525;
-                                                  __LINE__ = 327;
-
-                                                  __LINE__ = 2527;
-                                                  __LINE__ = 1073;
-
-                                                  __LINE__ = 2528;
-                                                  var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2531;
-                                                              __LINE__ = 1075;
-
-                                                              __LINE__ = 2532;
-                                                              __LINE__ = 328;
-
-                                                              __LINE__ = 2533;
-                                                              __LINE__ = 1076;
-                                                              __LINE__ = 2534;
-                                                              return Object.defineProperty( obj,prop, {
-                                                                configurable : false,
-                                                                enumerable : false,
-                                                                writable : false,
-                                                                value : value
-                                                              });
-                                                            } catch( e ){
-                                                              __LINE__ = 2541;
-                                                              __LINE__ = 1083;
-
-                                                              __LINE__ = 2542;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2545;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2549;
-                                                  __LINE__ = 1087;
-
-                                                  __LINE__ = 2550;
-                                                  __LINE__ = 336;
-
-                                                  __LINE__ = 2552;
-                                                  __LINE__ = 1088;
-
-                                                  __LINE__ = 2553;
-                                                  var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2556;
-                                                              __LINE__ = 1090;
-
-                                                              __LINE__ = 2557;
-                                                              __LINE__ = 337;
-
-                                                              __LINE__ = 2558;
-                                                              __LINE__ = 1091;
-                                                              __LINE__ = 2559;
-                                                              return ( ( ( ( ( likeArray ) ) ) ) )?slice.call( likeArray,index ) : [];
-                                                            } catch( e ){
-                                                              __LINE__ = 2561;
-                                                              __LINE__ = 1093;
-
-                                                              __LINE__ = 2562;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2565;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2569;
-                                                  __LINE__ = 1097;
-
-                                                  __LINE__ = 2570;
-                                                  __LINE__ = 340;
-
-                                                  __LINE__ = 2572;
-                                                  __LINE__ = 1098;
-
-                                                  __LINE__ = 2573;
-                                                  var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2576;
-                                                              __LINE__ = 1100;
-
-                                                              __LINE__ = 2577;
-                                                              __LINE__ = 341;
-
-                                                              __LINE__ = 2579;
-                                                              __LINE__ = 1101;
-
-                                                              __LINE__ = 2580;
-                                                              isKeyOnly = isKeyOnly || false;
-
-                                                              __LINE__ = 2582;
-                                                              __LINE__ = 1103;
-
-                                                              __LINE__ = 2583;
-                                                              __LINE__ = 343;
-
-                                                              __LINE__ = 2585;
-                                                              __LINE__ = 1104;
-
-                                                              __LINE__ = 2586;
-                                                              var iter = {},
-                                                                  isArray,
-                                                                  ret,
-                                                                  index = 0;
-
-                                                              __LINE__ = 2591;
-                                                              __LINE__ = 1109;
-
-                                                              __LINE__ = 2592;
-                                                              __LINE__ = 348;
-
-                                                              __LINE__ = 2594;
-                                                              __LINE__ = 1110;
-
-                                                              __LINE__ = 2595;
-                                                              if ( this instanceof Iterator ){
-                                                                __LINE__ = 2596;
-                                                                __LINE__ = 1111;
-
-                                                                __LINE__ = 2597;
-                                                                __LINE__ = 349;
-
-                                                                __LINE__ = 2599;
-                                                                __LINE__ = 1112;
-
-                                                                __LINE__ = 2600;
-                                                                isArray = Array.isArray( obj );
-
-                                                                __LINE__ = 2602;
-                                                                __LINE__ = 1114;
-
-                                                                __LINE__ = 2603;
-                                                                __LINE__ = 351;
-
-                                                                __LINE__ = 2605;
-                                                                __LINE__ = 1115;
-
-                                                                __LINE__ = 2606;
-                                                                ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                                                              } else {
-                                                                __LINE__ = 2608;
-                                                                __LINE__ = 1117;
-
-                                                                __LINE__ = 2609;
-                                                                __LINE__ = 353;
-
-                                                                __LINE__ = 2610;
-                                                                __LINE__ = 1118;
-                                                                __LINE__ = 2611;
-                                                                return _userdefIterator( obj,isKeyOnly );
-                                                              };
-
-                                                              __LINE__ = 2614;
-                                                              __LINE__ = 1121;
-
-                                                              __LINE__ = 2615;
-                                                              __LINE__ = 356;
-
-                                                              __LINE__ = 2617;
-                                                              __LINE__ = 1122;
-
-                                                              __LINE__ = 2618;
-                                                              createUnenumProp( iter,"next",
-                                                              function () {
-                                                                try {
-                                                                  try {
-                                                                    try {
-                                                                      __LINE__ = 2622;
-                                                                      __LINE__ = 1125;
-
-                                                                      __LINE__ = 2623;
-                                                                      __LINE__ = 358;
-
-                                                                      __LINE__ = 2624;
-                                                                      __LINE__ = 1126;
-                                                                      __LINE__ = 2625;
-                                                                      return ret[index ++ ];
-                                                                    } catch( e ){
-                                                                      __LINE__ = 2627;
-                                                                      __LINE__ = 1128;
-
-                                                                      __LINE__ = 2628;
-                                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                    };
-                                                                  } catch( e ){
-                                                                    __LINE__ = 2631;
-                                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                  };
-                                                                } catch( e ){
-                                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                }
-                                                              });
-
-                                                              __LINE__ = 2635;
-                                                              __LINE__ = 1131;
-
-                                                              __LINE__ = 2636;
-                                                              __LINE__ = 360;
-
-                                                              __LINE__ = 2637;
-                                                              __LINE__ = 1132;
-                                                              __LINE__ = 2638;
-                                                              return iter;
-                                                            } catch( e ){
-                                                              __LINE__ = 2640;
-                                                              __LINE__ = 1134;
-
-                                                              __LINE__ = 2641;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2644;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2648;
-                                                  __LINE__ = 1138;
-
-                                                  __LINE__ = 2649;
-                                                  __LINE__ = 363;
-
-                                                  __LINE__ = 2651;
-                                                  __LINE__ = 1139;
-
-                                                  __LINE__ = 2652;
-                                                  var _objectIterator = function ( obj,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2655;
-                                                              __LINE__ = 1141;
-
-                                                              __LINE__ = 2656;
-                                                              __LINE__ = 364;
-
-                                                              __LINE__ = 2658;
-                                                              __LINE__ = 1142;
-
-                                                              __LINE__ = 2659;
-                                                              var ret = [],
-                                                                  iter = -1;
-
-                                                              __LINE__ = 2662;
-                                                              __LINE__ = 1145;
-
-                                                              __LINE__ = 2663;
-                                                              __LINE__ = 367;
-
-                                                              __LINE__ = 2665;
-                                                              __LINE__ = 1146;
-
-                                                              __LINE__ = 2666;
-                                                              if ( isKeyOnly ){
-                                                                __LINE__ = 2667;
-                                                                __LINE__ = 1147;
-
-                                                                __LINE__ = 2668;
-                                                                __LINE__ = 368;
-
-                                                                __LINE__ = 2670;
-                                                                __LINE__ = 1148;
-
-                                                                __LINE__ = 2671;
-                                                                for ( var prop in obj ){
-                                                                  __LINE__ = 2672;
-                                                                  __LINE__ = 1149;
-
-                                                                  __LINE__ = 2673;
-                                                                  __LINE__ = 369;
-
-                                                                  __LINE__ = 2675;
-                                                                  __LINE__ = 1150;
-
-                                                                  __LINE__ = 2676;
-                                                                  ret[ ++ iter] = prop;
-                                                                };
-                                                              } else {
-                                                                __LINE__ = 2679;
-                                                                __LINE__ = 1153;
-
-                                                                __LINE__ = 2680;
-                                                                __LINE__ = 372;
-
-                                                                __LINE__ = 2682;
-                                                                __LINE__ = 1154;
-
-                                                                __LINE__ = 2683;
-                                                                for ( var prop in obj ){
-                                                                  __LINE__ = 2684;
-                                                                  __LINE__ = 1155;
-
-                                                                  __LINE__ = 2685;
-                                                                  __LINE__ = 373;
-
-                                                                  __LINE__ = 2687;
-                                                                  __LINE__ = 1156;
-
-                                                                  __LINE__ = 2688;
-                                                                  ret[ ++ iter] = [prop,obj[prop]];
-                                                                };
-                                                              };
-
-                                                              __LINE__ = 2692;
-                                                              __LINE__ = 1159;
-
-                                                              __LINE__ = 2693;
-                                                              __LINE__ = 376;
-
-                                                              __LINE__ = 2694;
-                                                              __LINE__ = 1160;
-                                                              __LINE__ = 2695;
-                                                              return ret;
-                                                            } catch( e ){
-                                                              __LINE__ = 2697;
-                                                              __LINE__ = 1162;
-
-                                                              __LINE__ = 2698;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2701;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      },
-                                                      _arrayIterator = function ( obj,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2707;
-                                                              __LINE__ = 1167;
-
-                                                              __LINE__ = 2708;
-                                                              __LINE__ = 379;
-
-                                                              __LINE__ = 2710;
-                                                              __LINE__ = 1168;
-
-                                                              __LINE__ = 2711;
-                                                              var ret = [];
-
-                                                              __LINE__ = 2713;
-                                                              __LINE__ = 1170;
-
-                                                              __LINE__ = 2714;
-                                                              __LINE__ = 381;
-
-                                                              __LINE__ = 2716;
-                                                              __LINE__ = 1171;
-
-                                                              __LINE__ = 2717;
-                                                              if ( isKeyOnly ){
-                                                                __LINE__ = 2718;
-                                                                __LINE__ = 1172;
-
-                                                                __LINE__ = 2719;
-                                                                __LINE__ = 382;
-
-                                                                __LINE__ = 2721;
-                                                                __LINE__ = 1173;
-
-                                                                __LINE__ = 2722;
-                                                                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                                                  __LINE__ = 2723;
-                                                                  __LINE__ = 1174;
-
-                                                                  __LINE__ = 2724;
-                                                                  __LINE__ = 383;
-
-                                                                  __LINE__ = 2726;
-                                                                  __LINE__ = 1175;
-
-                                                                  __LINE__ = 2727;
-                                                                  ret[i] = i;
-                                                                };
-                                                              } else {
-                                                                __LINE__ = 2730;
-                                                                __LINE__ = 1178;
-
-                                                                __LINE__ = 2731;
-                                                                __LINE__ = 386;
-
-                                                                __LINE__ = 2733;
-                                                                __LINE__ = 1179;
-
-                                                                __LINE__ = 2734;
-                                                                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                                                  __LINE__ = 2735;
-                                                                  __LINE__ = 1180;
-
-                                                                  __LINE__ = 2736;
-                                                                  __LINE__ = 387;
-
-                                                                  __LINE__ = 2738;
-                                                                  __LINE__ = 1181;
-
-                                                                  __LINE__ = 2739;
-                                                                  ret[i] = [i,obj[i]];
-                                                                };
-                                                              };
-
-                                                              __LINE__ = 2743;
-                                                              __LINE__ = 1184;
-
-                                                              __LINE__ = 2744;
-                                                              __LINE__ = 390;
-
-                                                              __LINE__ = 2745;
-                                                              __LINE__ = 1185;
-                                                              __LINE__ = 2746;
-                                                              return ret;
-                                                            } catch( e ){
-                                                              __LINE__ = 2748;
-                                                              __LINE__ = 1187;
-
-                                                              __LINE__ = 2749;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2752;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      },
-                                                      _stringIterator = function ( obj,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2758;
-                                                              __LINE__ = 1192;
-
-                                                              __LINE__ = 2759;
-                                                              __LINE__ = 393;
-
-                                                              __LINE__ = 2761;
-                                                              __LINE__ = 1193;
-
-                                                              __LINE__ = 2762;
-                                                              var ret = [];
-
-                                                              __LINE__ = 2764;
-                                                              __LINE__ = 1195;
-
-                                                              __LINE__ = 2765;
-                                                              __LINE__ = 395;
-
-                                                              __LINE__ = 2767;
-                                                              __LINE__ = 1196;
-
-                                                              __LINE__ = 2768;
-                                                              if ( isKeyOnly ){
-                                                                __LINE__ = 2769;
-                                                                __LINE__ = 1197;
-
-                                                                __LINE__ = 2770;
-                                                                __LINE__ = 396;
-
-                                                                __LINE__ = 2772;
-                                                                __LINE__ = 1198;
-
-                                                                __LINE__ = 2773;
-                                                                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                                                  __LINE__ = 2774;
-                                                                  __LINE__ = 1199;
-
-                                                                  __LINE__ = 2775;
-                                                                  __LINE__ = 397;
-
-                                                                  __LINE__ = 2777;
-                                                                  __LINE__ = 1200;
-
-                                                                  __LINE__ = 2778;
-                                                                  ret[i] = i;
-                                                                };
-                                                              } else {
-                                                                __LINE__ = 2781;
-                                                                __LINE__ = 1203;
-
-                                                                __LINE__ = 2782;
-                                                                __LINE__ = 400;
-
-                                                                __LINE__ = 2784;
-                                                                __LINE__ = 1204;
-
-                                                                __LINE__ = 2785;
-                                                                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                                                  __LINE__ = 2786;
-                                                                  __LINE__ = 1205;
-
-                                                                  __LINE__ = 2787;
-                                                                  __LINE__ = 401;
-
-                                                                  __LINE__ = 2789;
-                                                                  __LINE__ = 1206;
-
-                                                                  __LINE__ = 2790;
-                                                                  ret[i] = [i,obj.charAt( i )];
-                                                                };
-                                                              };
-
-                                                              __LINE__ = 2794;
-                                                              __LINE__ = 1209;
-
-                                                              __LINE__ = 2795;
-                                                              __LINE__ = 404;
-
-                                                              __LINE__ = 2796;
-                                                              __LINE__ = 1210;
-                                                              __LINE__ = 2797;
-                                                              return ret;
-                                                            } catch( e ){
-                                                              __LINE__ = 2799;
-                                                              __LINE__ = 1212;
-
-                                                              __LINE__ = 2800;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2803;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      },
-                                                      _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2809;
-                                                              __LINE__ = 1217;
-
-                                                              __LINE__ = 2810;
-                                                              __LINE__ = 407;
-
-                                                              __LINE__ = 2812;
-                                                              __LINE__ = 1218;
-
-                                                              __LINE__ = 2813;
-                                                              var type = typeof obj;
-
-                                                              __LINE__ = 2815;
-                                                              __LINE__ = 1220;
-
-                                                              __LINE__ = 2816;
-                                                              __LINE__ = 409;
-
-                                                              __LINE__ = 2818;
-                                                              __LINE__ = 1221;
-
-                                                              __LINE__ = 2819;
-                                                              if ( type === "object" && !isArray ){
-                                                                __LINE__ = 2820;
-                                                                __LINE__ = 1222;
-
-                                                                __LINE__ = 2821;
-                                                                __LINE__ = 410;
-
-                                                                __LINE__ = 2822;
-                                                                __LINE__ = 1223;
-                                                                __LINE__ = 2823;
-                                                                return _objectIterator( obj,isKeyOnly );
-                                                              } else if ( isArray ){
-                                                                __LINE__ = 2825;
-                                                                __LINE__ = 1225;
-
-                                                                __LINE__ = 2826;
-                                                                __LINE__ = 412;
-
-                                                                __LINE__ = 2827;
-                                                                __LINE__ = 1226;
-                                                                __LINE__ = 2828;
-                                                                return _arrayIterator( obj,isKeyOnly );
-                                                              } else if ( type === "string" ){
-                                                                __LINE__ = 2830;
-                                                                __LINE__ = 1228;
-
-                                                                __LINE__ = 2831;
-                                                                __LINE__ = 414;
-
-                                                                __LINE__ = 2832;
-                                                                __LINE__ = 1229;
-                                                                __LINE__ = 2833;
-                                                                return _stringIterator( obj,isKeyOnly );
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 2836;
-                                                              __LINE__ = 1232;
-
-                                                              __LINE__ = 2837;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2840;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      },
-                                                      _userdefIterator = function ( obj,isKeyOnly ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2846;
-                                                              __LINE__ = 1237;
-
-                                                              __LINE__ = 2847;
-                                                              __LINE__ = 418;
-
-                                                              __LINE__ = 2849;
-                                                              __LINE__ = 1238;
-
-                                                              __LINE__ = 2850;
-                                                              if ( "__iterator__" in obj ){
-                                                                __LINE__ = 2851;
-                                                                __LINE__ = 1239;
-
-                                                                __LINE__ = 2852;
-                                                                __LINE__ = 419;
-
-                                                                __LINE__ = 2853;
-                                                                __LINE__ = 1240;
-                                                                __LINE__ = 2854;
-                                                                return obj.__iterator__( isKeyOnly );
-                                                              } else {
-                                                                __LINE__ = 2856;
-                                                                __LINE__ = 1242;
-
-                                                                __LINE__ = 2857;
-                                                                __LINE__ = 421;
-
-                                                                __LINE__ = 2858;
-                                                                __LINE__ = 1243;
-                                                                __LINE__ = 2859;
-                                                                return  {
-                                                                  next : function () {
-                                                                    try {
-                                                                      try {
-                                                                        try {
-                                                                          try {
-                                                                            __LINE__ = 2864;
-                                                                            __LINE__ = 1247;
-
-                                                                            __LINE__ = 2865;
-                                                                            __LINE__ = 424;
-
-                                                                            __LINE__ = 2866;
-                                                                            __LINE__ = 1248;
-                                                                            __LINE__ = 2867;
-                                                                            throw new StopIteration;
-                                                                          } catch( e ){
-                                                                            __LINE__ = 2869;
-                                                                            __LINE__ = 1250;
-
-                                                                            __LINE__ = 2870;
-                                                                            __LINE__ = 426;
-
-                                                                            __LINE__ = 2871;
-                                                                            __LINE__ = 1251;
-                                                                            __LINE__ = 2872;
-                                                                            throw new Error( e );
-                                                                          };
-                                                                        } catch( e ){
-                                                                          __LINE__ = 2875;
-                                                                          __LINE__ = 1254;
-
-                                                                          __LINE__ = 2876;
-                                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                        };
-                                                                      } catch( e ){
-                                                                        __LINE__ = 2879;
-                                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                      };
-                                                                    } catch( e ){
-                                                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                    }
-                                                                  }
-                                                                };
-                                                              };
-                                                            } catch( e ){
-                                                              __LINE__ = 2885;
-                                                              __LINE__ = 1260;
-
-                                                              __LINE__ = 2886;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2889;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2893;
-                                                  __LINE__ = 1264;
-
-                                                  __LINE__ = 2894;
-                                                  __LINE__ = 433;
-
-                                                  __LINE__ = 2896;
-                                                  __LINE__ = 1265;
-
-                                                  __LINE__ = 2897;
-                                                  var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2900;
-                                                              __LINE__ = 1267;
-
-                                                              __LINE__ = 2901;
-                                                              __LINE__ = 434;
-
-                                                              __LINE__ = 2903;
-                                                              __LINE__ = 1268;
-
-                                                              __LINE__ = 2904;
-                                                              var ret = {};
-
-                                                              __LINE__ = 2906;
-                                                              __LINE__ = 1270;
-
-                                                              __LINE__ = 2907;
-                                                              __LINE__ = 436;
-
-                                                              __LINE__ = 2909;
-                                                              __LINE__ = 1271;
-
-                                                              __LINE__ = 2910;
-                                                              createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                                                              __LINE__ = 2912;
-                                                              __LINE__ = 1273;
-
-                                                              __LINE__ = 2913;
-                                                              __LINE__ = 438;
-
-                                                              __LINE__ = 2915;
-                                                              __LINE__ = 1274;
-
-                                                              __LINE__ = 2916;
-                                                              createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                                                              __LINE__ = 2918;
-                                                              __LINE__ = 1276;
-
-                                                              __LINE__ = 2919;
-                                                              __LINE__ = 440;
-
-                                                              __LINE__ = 2921;
-                                                              __LINE__ = 1277;
-
-                                                              __LINE__ = 2922;
-                                                              createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                                                              __LINE__ = 2924;
-                                                              __LINE__ = 1279;
-
-                                                              __LINE__ = 2925;
-                                                              __LINE__ = 442;
-
-                                                              __LINE__ = 2927;
-                                                              __LINE__ = 1280;
-
-                                                              __LINE__ = 2928;
-                                                              createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                                                              __LINE__ = 2930;
-                                                              __LINE__ = 1282;
-
-                                                              __LINE__ = 2931;
-                                                              __LINE__ = 444;
-
-                                                              __LINE__ = 2933;
-                                                              __LINE__ = 1283;
-
-                                                              __LINE__ = 2934;
-                                                              createUnenumProp( ret,"toString",
-                                                              function () {
-                                                                try {
-                                                                  try {
-                                                                    try {
-                                                                      __LINE__ = 2938;
-                                                                      __LINE__ = 1286;
-
-                                                                      __LINE__ = 2939;
-                                                                      __LINE__ = 446;
-
-                                                                      __LINE__ = 2940;
-                                                                      __LINE__ = 1287;
-                                                                      __LINE__ = 2941;
-                                                                      return "[object Generator]";
-                                                                    } catch( e ){
-                                                                      __LINE__ = 2943;
-                                                                      __LINE__ = 1289;
-
-                                                                      __LINE__ = 2944;
-                                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                    };
-                                                                  } catch( e ){
-                                                                    __LINE__ = 2947;
-                                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                  };
-                                                                } catch( e ){
-                                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                }
-                                                              });
-
-                                                              __LINE__ = 2951;
-                                                              __LINE__ = 1293;
-
-                                                              __LINE__ = 2952;
-                                                              __LINE__ = 449;
-
-                                                              __LINE__ = 2954;
-                                                              __LINE__ = 1294;
-
-                                                              __LINE__ = 2955;
-                                                              Object.freeze( ret );
-
-                                                              __LINE__ = 2957;
-                                                              __LINE__ = 1295;
-
-                                                              __LINE__ = 2958;
-                                                              __LINE__ = 450;
-
-                                                              __LINE__ = 2959;
-                                                              __LINE__ = 1296;
-                                                              __LINE__ = 2960;
-                                                              return ret;
-                                                            } catch( e ){
-                                                              __LINE__ = 2962;
-                                                              __LINE__ = 1298;
-
-                                                              __LINE__ = 2963;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2966;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2970;
-                                                  __LINE__ = 1302;
-
-                                                  __LINE__ = 2971;
-                                                  __LINE__ = 453;
-
-                                                  __LINE__ = 2973;
-                                                  __LINE__ = 1303;
-
-                                                  __LINE__ = 2974;
-                                                  var getErrorMessage = function ( e ) {
-                                                        try {
-                                                          try {
-                                                            try {
-                                                              __LINE__ = 2977;
-                                                              __LINE__ = 1305;
-
-                                                              __LINE__ = 2978;
-                                                              __LINE__ = 454;
-
-                                                              __LINE__ = 2979;
-                                                              __LINE__ = 1306;
-                                                              __LINE__ = 2980;
-                                                              return ( ( ( ( ( e.message ) ) ) ) )?e.message : ( ( ( ( ( e.description ) ) ) ) )?e.description : e.toString();
-                                                            } catch( e ){
-                                                              __LINE__ = 2982;
-                                                              __LINE__ = 1308;
-
-                                                              __LINE__ = 2983;
-                                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                            };
-                                                          } catch( e ){
-                                                            __LINE__ = 2986;
-                                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                          };
-                                                        } catch( e ){
-                                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                        }
-                                                      };
-
-                                                  __LINE__ = 2990;
-                                                  __LINE__ = 1312;
-
-                                                  __LINE__ = 2991;
-                                                  __LINE__ = 457;
-
-                                                  __LINE__ = 2993;
-                                                  __LINE__ = 1313;
-
-                                                  __LINE__ = 2994;
-                                                  var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                                                  __LINE__ = 2996;
-                                                  __LINE__ = 1315;
-
-                                                  __LINE__ = 2997;
-                                                  __LINE__ = 459;
-
-                                                  __LINE__ = 2999;
-                                                  __LINE__ = 1316;
-
-                                                  __LINE__ = 3000;
-                                                  var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                                                  __LINE__ = 3002;
-                                                  __LINE__ = 1318;
-
-                                                  __LINE__ = 3003;
-                                                  __LINE__ = 461;
-
-                                                  __LINE__ = 3005;
-                                                  __LINE__ = 1319;
-
-                                                  __LINE__ = 3006;
-                                                  ( function () {
-                                                    try {
-                                                      try {
-                                                        try {
-                                                          __LINE__ = 3009;
-                                                          __LINE__ = 1321;
-
-                                                          __LINE__ = 3010;
-                                                          __LINE__ = 462;
-
-                                                          __LINE__ = 3012;
-                                                          __LINE__ = 1322;
-
-                                                          __LINE__ = 3013;
-                                                          var assert = _mochaLocalExport.assert = ( ( ( ( ( console && console.assert ) ) ) ) )?function ( expect,exp,str,line ) {
-                                                                try {
-                                                                  try {
-                                                                    try {
-                                                                      __LINE__ = 3016;
-                                                                      __LINE__ = 1324;
-
-                                                                      __LINE__ = 3017;
-                                                                      __LINE__ = 463;
-
-                                                                      __LINE__ = 3018;
-                                                                      __LINE__ = 1325;
-                                                                      __LINE__ = 3019;
-                                                                      return console.assert( expect === exp,str+"\nat : "+line );
-                                                                    } catch( e ){
-                                                                      __LINE__ = 3021;
-                                                                      __LINE__ = 1327;
-
-                                                                      __LINE__ = 3022;
-                                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                    };
-                                                                  } catch( e ){
-                                                                    __LINE__ = 3025;
-                                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                  };
-                                                                } catch( e ){
-                                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                }
-                                                              } : function ( expect,exp,str,line ) {
-                                                                try {
-                                                                  try {
-                                                                    try {
-                                                                      __LINE__ = 3030;
-                                                                      __LINE__ = 1331;
-
-                                                                      __LINE__ = 3031;
-                                                                      __LINE__ = 465;
-
-                                                                      __LINE__ = 3033;
-                                                                      __LINE__ = 1332;
-
-                                                                      __LINE__ = 3034;
-                                                                      if ( expect !== exp ){
-                                                                        __LINE__ = 3035;
-                                                                        __LINE__ = 1333;
-
-                                                                        __LINE__ = 3036;
-                                                                        __LINE__ = 466;
-
-                                                                        __LINE__ = 3038;
-                                                                        __LINE__ = 1334;
-
-                                                                        __LINE__ = 3039;
-                                                                        Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                                                                      };
-                                                                    } catch( e ){
-                                                                      __LINE__ = 3042;
-                                                                      __LINE__ = 1337;
-
-                                                                      __LINE__ = 3043;
-                                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                    };
-                                                                  } catch( e ){
-                                                                    __LINE__ = 3046;
-                                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                                  };
-                                                                } catch( e ){
-                                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                                }
-                                                              };
-                                                        } catch( e ){
-                                                          __LINE__ = 3050;
-                                                          __LINE__ = 1341;
-
-                                                          __LINE__ = 3051;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        __LINE__ = 3054;
-                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                      };
-                                                    } catch( e ){
-                                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                    }
-                                                  })();
-
-                                                  __LINE__ = 3058;
-                                                  __LINE__ = 1344;
-
-                                                  __LINE__ = 3059;
-                                                  __LINE__ = 470;
-
-                                                  __LINE__ = 3060;
-                                                  __LINE__ = 1345;
-                                                  __LINE__ = 3061;
-                                                  return _mochaLocalExport;
-                                                } catch( e ){
-                                                  __LINE__ = 3063;
-                                                  __LINE__ = 1347;
-
-                                                  __LINE__ = 3064;
-                                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                };
-                                              } catch( e ){
-                                                __LINE__ = 3067;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          })();
-
-                                      __LINE__ = 3071;
-                                      __LINE__ = 1351;
-
-                                      __LINE__ = 3072;
-                                      __LINE__ = 473;
-
-                                      __LINE__ = 3074;
-                                      __LINE__ = 1352;
-
-                                      __LINE__ = 3075;
-                                      var StopIteration =  {
-                                            toString : function toString() {
-                                              try {
-                                                try {
-                                                  try {
-                                                    __LINE__ = 3079;
-                                                    __LINE__ = 1355;
-
-                                                    __LINE__ = 3080;
-                                                    __LINE__ = 475;
-
-                                                    __LINE__ = 3081;
-                                                    __LINE__ = 1356;
-                                                    __LINE__ = 3082;
-                                                    return "StopIteration";
-                                                  } catch( e ){
-                                                    __LINE__ = 3084;
-                                                    __LINE__ = 1358;
-
-                                                    __LINE__ = 3085;
-                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                  };
-                                                } catch( e ){
-                                                  __LINE__ = 3088;
-                                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                };
-                                              } catch( e ){
-                                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                              }
-                                            }
-                                          };
-
-                                      __LINE__ = 3093;
-                                      __LINE__ = 1363;
-
-                                      __LINE__ = 3094;
-                                      __LINE__ = 479;
-
-                                      __LINE__ = 3096;
-                                      __LINE__ = 1364;
-
-                                      __LINE__ = 3097;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 3099;
-                                      __LINE__ = 1366;
-
-                                      __LINE__ = 3100;
-                                      __LINE__ = 480;
-
-                                      __LINE__ = 3102;
-                                      __LINE__ = 1367;
-
-                                      __LINE__ = 3103;
-                                      ( function () {
-                                        try {
-                                          try {
-                                            try {
-                                              try {
-                                                __LINE__ = 3107;
-                                                __LINE__ = 1370;
-
-                                                __LINE__ = 3108;
-                                                __LINE__ = 482;
-
-                                                __LINE__ = 3110;
-                                                __LINE__ = 1371;
-
-                                                __LINE__ = 3111;
-                                                var __FILE__ = "/var/samba/mocha/src/test/js/path_array.js",
-                                                    __LINE__ = 0;
-
-                                                __LINE__ = 3114;
-                                                __LINE__ = 1374;
-
-                                                __LINE__ = 3115;
-                                                __LINE__ = 484;
-
-                                                __LINE__ = 3117;
-                                                __LINE__ = 1375;
-
-                                                __LINE__ = 3118;
-                                                __LINE__ = 2;
-
-                                                __LINE__ = 3120;
-                                                __LINE__ = 1377;
-
-                                                __LINE__ = 3121;
-                                                __LINE__ = 485;
-
-                                                __LINE__ = 3123;
-                                                __LINE__ = 1378;
-
-                                                __LINE__ = 3124;
-                                                _mochaGlobalExport['./path_array.js'] = {};
-
-                                                __LINE__ = 3126;
-                                                __LINE__ = 1380;
-
-                                                __LINE__ = 3127;
-                                                __LINE__ = 487;
-
-                                                __LINE__ = 3129;
-                                                __LINE__ = 1381;
-
-                                                __LINE__ = 3130;
-                                                __LINE__ = 3;
-
-                                                __LINE__ = 3132;
-                                                __LINE__ = 1383;
-
-                                                __LINE__ = 3133;
-                                                __LINE__ = 488;
-
-                                                __LINE__ = 3135;
-                                                __LINE__ = 1384;
-
-                                                __LINE__ = 3136;
-                                                var _mochaGlobalAlias = _mochaGlobalExport['./path_array.js'];
-
-                                                __LINE__ = 3138;
-                                                __LINE__ = 1386;
-
-                                                __LINE__ = 3139;
-                                                __LINE__ = 490;
-
-                                                __LINE__ = 3141;
-                                                __LINE__ = 1387;
-
-                                                __LINE__ = 3142;
-                                                __LINE__ = 0;
-
-                                                __LINE__ = 3144;
-                                                __LINE__ = 1389;
-
-                                                __LINE__ = 3145;
-                                                __LINE__ = 491;
-
-                                                __LINE__ = 3147;
-                                                __LINE__ = 1390;
-
-                                                __LINE__ = 3148;
-                                                var m = "/Users/aono_taketoshi/mocha/test/js";
-
-                                                __LINE__ = 3150;
-                                                __LINE__ = 1392;
-
-                                                __LINE__ = 3151;
-                                                __LINE__ = 493;
-
-                                                __LINE__ = 3153;
-                                                __LINE__ = 1393;
-
-                                                __LINE__ = 3154;
-                                                __LINE__ = 0;
-
-                                                __LINE__ = 3156;
-                                                __LINE__ = 1395;
-
-                                                __LINE__ = 3157;
-                                                __LINE__ = 494;
-
-                                                __LINE__ = 3159;
-                                                __LINE__ = 1396;
-
-                                                __LINE__ = 3160;
-                                                var v = "/url/local/includes";
-
-                                                function getPathArray( path ) {
-                                                  try {
-                                                    try {
-                                                      try {
-                                                        try {
-                                                          __LINE__ = 3166;
-                                                          __LINE__ = 1401;
-
-                                                          __LINE__ = 3167;
-                                                          __LINE__ = 498;
-
-                                                          __LINE__ = 3169;
-                                                          __LINE__ = 1402;
-
-                                                          __LINE__ = 3170;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3172;
-                                                          __LINE__ = 1404;
-
-                                                          __LINE__ = 3173;
-                                                          __LINE__ = 499;
-
-                                                          __LINE__ = 3175;
-                                                          __LINE__ = 1405;
-
-                                                          __LINE__ = 3176;
-                                                          if ( path[path.length-1] !== '/' ){
-                                                            __LINE__ = 3177;
-                                                            __LINE__ = 1406;
-
-                                                            __LINE__ = 3178;
-                                                            __LINE__ = 500;
-
-                                                            __LINE__ = 3180;
-                                                            __LINE__ = 1407;
-
-                                                            __LINE__ = 3181;
-                                                            __LINE__ = 0;
-
-                                                            __LINE__ = 3183;
-                                                            __LINE__ = 1409;
-
-                                                            __LINE__ = 3184;
-                                                            __LINE__ = 501;
-
-                                                            __LINE__ = 3186;
-                                                            __LINE__ = 1410;
-
-                                                            __LINE__ = 3187;
-                                                            path += '/';
-                                                          };
-
-                                                          __LINE__ = 3190;
-                                                          __LINE__ = 1413;
-
-                                                          __LINE__ = 3191;
-                                                          __LINE__ = 504;
-
-                                                          __LINE__ = 3193;
-                                                          __LINE__ = 1414;
-
-                                                          __LINE__ = 3194;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3196;
-                                                          __LINE__ = 1416;
-
-                                                          __LINE__ = 3197;
-                                                          __LINE__ = 505;
-
-                                                          __LINE__ = 3199;
-                                                          __LINE__ = 1417;
-
-                                                          __LINE__ = 3200;
-                                                          var i = 0;
-
-                                                          __LINE__ = 3202;
-                                                          __LINE__ = 1419;
-
-                                                          __LINE__ = 3203;
-                                                          __LINE__ = 507;
-
-                                                          __LINE__ = 3205;
-                                                          __LINE__ = 1420;
-
-                                                          __LINE__ = 3206;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3208;
-                                                          __LINE__ = 1422;
-
-                                                          __LINE__ = 3209;
-                                                          __LINE__ = 508;
-
-                                                          __LINE__ = 3211;
-                                                          __LINE__ = 1423;
-
-                                                          __LINE__ = 3212;
-                                                          var arr = [];
-
-                                                          __LINE__ = 3214;
-                                                          __LINE__ = 1425;
-
-                                                          __LINE__ = 3215;
-                                                          __LINE__ = 510;
-
-                                                          __LINE__ = 3217;
-                                                          __LINE__ = 1426;
-
-                                                          __LINE__ = 3218;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3220;
-                                                          __LINE__ = 1428;
-
-                                                          __LINE__ = 3221;
-                                                          __LINE__ = 511;
-
-                                                          __LINE__ = 3223;
-                                                          __LINE__ = 1429;
-
-                                                          __LINE__ = 3224;
-                                                          var tmp = "";
-
-                                                          __LINE__ = 3226;
-                                                          __LINE__ = 1431;
-
-                                                          __LINE__ = 3227;
-                                                          __LINE__ = 513;
-
-                                                          __LINE__ = 3229;
-                                                          __LINE__ = 1432;
-
-                                                          __LINE__ = 3230;
-                                                          __LINE__ = 8;
-
-                                                          __LINE__ = 3232;
-                                                          __LINE__ = 1434;
-
-                                                          __LINE__ = 3233;
-                                                          __LINE__ = 514;
-
-                                                          __LINE__ = 3235;
-                                                          __LINE__ = 1435;
-
-                                                          __LINE__ = 3236;
-                                                          while ( path[i] ){
-                                                            __LINE__ = 3237;
-                                                            __LINE__ = 1436;
-
-                                                            __LINE__ = 3238;
-                                                            __LINE__ = 515;
-
-                                                            __LINE__ = 3240;
-                                                            __LINE__ = 1437;
-
-                                                            __LINE__ = 3241;
-                                                            __LINE__ = 0;
-
-                                                            __LINE__ = 3243;
-                                                            __LINE__ = 1439;
-
-                                                            __LINE__ = 3244;
-                                                            __LINE__ = 516;
-
-                                                            __LINE__ = 3246;
-                                                            __LINE__ = 1440;
-
-                                                            __LINE__ = 3247;
-                                                            if ( path[i] == '/' ){
-                                                              __LINE__ = 3248;
-                                                              __LINE__ = 1441;
-
-                                                              __LINE__ = 3249;
-                                                              __LINE__ = 517;
-
-                                                              __LINE__ = 3251;
-                                                              __LINE__ = 1442;
-
-                                                              __LINE__ = 3252;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3254;
-                                                              __LINE__ = 1444;
-
-                                                              __LINE__ = 3255;
-                                                              __LINE__ = 518;
-
-                                                              __LINE__ = 3257;
-                                                              __LINE__ = 1445;
-
-                                                              __LINE__ = 3258;
-                                                              if ( i == 0 ){
-                                                                __LINE__ = 3259;
-                                                                __LINE__ = 1446;
-
-                                                                __LINE__ = 3260;
-                                                                __LINE__ = 519;
-
-                                                                __LINE__ = 3262;
-                                                                __LINE__ = 1447;
-
-                                                                __LINE__ = 3263;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3265;
-                                                                __LINE__ = 1449;
-
-                                                                __LINE__ = 3266;
-                                                                __LINE__ = 520;
-
-                                                                __LINE__ = 3268;
-                                                                __LINE__ = 1450;
-
-                                                                __LINE__ = 3269;
-                                                                arr.push( "/" );
-                                                              } else {
-                                                                __LINE__ = 3271;
-                                                                __LINE__ = 1452;
-
-                                                                __LINE__ = 3272;
-                                                                __LINE__ = 522;
-
-                                                                __LINE__ = 3274;
-                                                                __LINE__ = 1453;
-
-                                                                __LINE__ = 3275;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3277;
-                                                                __LINE__ = 1455;
-
-                                                                __LINE__ = 3278;
-                                                                __LINE__ = 523;
-
-                                                                __LINE__ = 3280;
-                                                                __LINE__ = 1456;
-
-                                                                __LINE__ = 3281;
-                                                                arr.push( tmp );
-                                                              };
-
-                                                              __LINE__ = 3284;
-                                                              __LINE__ = 1459;
-
-                                                              __LINE__ = 3285;
-                                                              __LINE__ = 526;
-
-                                                              __LINE__ = 3287;
-                                                              __LINE__ = 1460;
-
-                                                              __LINE__ = 3288;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3290;
-                                                              __LINE__ = 1462;
-
-                                                              __LINE__ = 3291;
-                                                              __LINE__ = 527;
-
-                                                              __LINE__ = 3293;
-                                                              __LINE__ = 1463;
-
-                                                              __LINE__ = 3294;
-                                                              tmp = "";
-                                                            } else {
-                                                              __LINE__ = 3296;
-                                                              __LINE__ = 1465;
-
-                                                              __LINE__ = 3297;
-                                                              __LINE__ = 529;
-
-                                                              __LINE__ = 3299;
-                                                              __LINE__ = 1466;
-
-                                                              __LINE__ = 3300;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3302;
-                                                              __LINE__ = 1468;
-
-                                                              __LINE__ = 3303;
-                                                              __LINE__ = 530;
-
-                                                              __LINE__ = 3305;
-                                                              __LINE__ = 1469;
-
-                                                              __LINE__ = 3306;
-                                                              tmp += path[i];
-                                                            };
-
-                                                            __LINE__ = 3309;
-                                                            __LINE__ = 1472;
-
-                                                            __LINE__ = 3310;
-                                                            __LINE__ = 533;
-
-                                                            __LINE__ = 3312;
-                                                            __LINE__ = 1473;
-
-                                                            __LINE__ = 3313;
-                                                            __LINE__ = 0;
-
-                                                            __LINE__ = 3315;
-                                                            __LINE__ = 1475;
-
-                                                            __LINE__ = 3316;
-                                                            __LINE__ = 534;
-
-                                                            __LINE__ = 3318;
-                                                            __LINE__ = 1476;
-
-                                                            __LINE__ = 3319;
-                                                            i ++ ;
-                                                          };
-
-                                                          __LINE__ = 3322;
-                                                          __LINE__ = 1479;
-
-                                                          __LINE__ = 3323;
-                                                          __LINE__ = 536;
-
-                                                          __LINE__ = 3325;
-                                                          __LINE__ = 1480;
-
-                                                          __LINE__ = 3326;
-                                                          __LINE__ = 18;
-
-                                                          __LINE__ = 3328;
-                                                          __LINE__ = 1481;
-
-                                                          __LINE__ = 3329;
-                                                          __LINE__ = 537;
-
-                                                          __LINE__ = 3330;
-                                                          __LINE__ = 1482;
-                                                          __LINE__ = 3331;
-                                                          return arr;
-                                                        } catch( e ){
-                                                          __LINE__ = 3333;
-                                                          __LINE__ = 1484;
-
-                                                          __LINE__ = 3334;
-                                                          __LINE__ = 539;
-
-                                                          __LINE__ = 3336;
-                                                          __LINE__ = 1485;
-
-                                                          __LINE__ = 3337;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        __LINE__ = 3340;
-                                                        __LINE__ = 1488;
-
-                                                        __LINE__ = 3341;
-                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                      };
-                                                    } catch( e ){
-                                                      __LINE__ = 3344;
-                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                    };
-                                                  } catch( e ){
-                                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                  }
-                                                }
-                                                __LINE__ = 3347;
-                                                __LINE__ = 1491;
-
-                                                __LINE__ = 3348;
-                                                __LINE__ = 542;
-
-                                                __LINE__ = 3350;
-                                                __LINE__ = 1492;
-
-                                                __LINE__ = 3351;
-                                                __LINE__ = 0;
-
-                                                __LINE__ = 3353;
-                                                __LINE__ = 1494;
-
-                                                __LINE__ = 3354;
-                                                __LINE__ = 543;
-
-                                                __LINE__ = 3356;
-                                                __LINE__ = 1495;
-
-                                                __LINE__ = 3357;
-                                                var arr1 = getPathArray( m ),
-                                                    arr2 = getPathArray( v );
-
-                                                function cmp( arr1,arr2 ) {
-                                                  try {
-                                                    try {
-                                                      try {
-                                                        try {
-                                                          __LINE__ = 3364;
-                                                          __LINE__ = 1501;
-
-                                                          __LINE__ = 3365;
-                                                          __LINE__ = 548;
-
-                                                          __LINE__ = 3367;
-                                                          __LINE__ = 1502;
-
-                                                          __LINE__ = 3368;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3370;
-                                                          __LINE__ = 1504;
-
-                                                          __LINE__ = 3371;
-                                                          __LINE__ = 549;
-
-                                                          __LINE__ = 3373;
-                                                          __LINE__ = 1505;
-
-                                                          __LINE__ = 3374;
-                                                          var ret = "";
-
-                                                          __LINE__ = 3376;
-                                                          __LINE__ = 1507;
-
-                                                          __LINE__ = 3377;
-                                                          __LINE__ = 551;
-
-                                                          __LINE__ = 3379;
-                                                          __LINE__ = 1508;
-
-                                                          __LINE__ = 3380;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3382;
-                                                          __LINE__ = 1510;
-
-                                                          __LINE__ = 3383;
-                                                          __LINE__ = 552;
-
-                                                          __LINE__ = 3385;
-                                                          __LINE__ = 1511;
-
-                                                          __LINE__ = 3386;
-                                                          var i = 0;
-
-                                                          __LINE__ = 3388;
-                                                          __LINE__ = 1513;
-
-                                                          __LINE__ = 3389;
-                                                          __LINE__ = 554;
-
-                                                          __LINE__ = 3391;
-                                                          __LINE__ = 1514;
-
-                                                          __LINE__ = 3392;
-                                                          __LINE__ = 0;
-
-                                                          __LINE__ = 3394;
-                                                          __LINE__ = 1516;
-
-                                                          __LINE__ = 3395;
-                                                          __LINE__ = 555;
-
-                                                          __LINE__ = 3397;
-                                                          __LINE__ = 1517;
-
-                                                          __LINE__ = 3398;
-                                                          var unmatch = false;
-
-                                                          __LINE__ = 3400;
-                                                          __LINE__ = 1519;
-
-                                                          __LINE__ = 3401;
-                                                          __LINE__ = 557;
-
-                                                          __LINE__ = 3403;
-                                                          __LINE__ = 1520;
-
-                                                          __LINE__ = 3404;
-                                                          __LINE__ = 27;
-
-                                                          __LINE__ = 3406;
-                                                          __LINE__ = 1522;
-
-                                                          __LINE__ = 3407;
-                                                          __LINE__ = 558;
-
-                                                          __LINE__ = 3409;
-                                                          __LINE__ = 1523;
-
-                                                          __LINE__ = 3410;
-                                                          while ( arr1[i] || arr2[i] ){
-                                                            __LINE__ = 3411;
-                                                            __LINE__ = 1524;
-
-                                                            __LINE__ = 3412;
-                                                            __LINE__ = 559;
-
-                                                            __LINE__ = 3414;
-                                                            __LINE__ = 1525;
-
-                                                            __LINE__ = 3415;
-                                                            __LINE__ = 0;
-
-                                                            __LINE__ = 3417;
-                                                            __LINE__ = 1527;
-
-                                                            __LINE__ = 3418;
-                                                            __LINE__ = 560;
-
-                                                            __LINE__ = 3420;
-                                                            __LINE__ = 1528;
-
-                                                            __LINE__ = 3421;
-                                                            if ( !arr1[i] ){
-                                                              __LINE__ = 3422;
-                                                              __LINE__ = 1529;
-
-                                                              __LINE__ = 3423;
-                                                              __LINE__ = 561;
-
-                                                              __LINE__ = 3425;
-                                                              __LINE__ = 1530;
-
-                                                              __LINE__ = 3426;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3428;
-                                                              __LINE__ = 1532;
-
-                                                              __LINE__ = 3429;
-                                                              __LINE__ = 562;
-
-                                                              __LINE__ = 3431;
-                                                              __LINE__ = 1533;
-
-                                                              __LINE__ = 3432;
-                                                              ret += arr2[i]+"/";
-                                                            } else if ( !arr2[i] ){
-                                                              __LINE__ = 3434;
-                                                              __LINE__ = 1535;
-
-                                                              __LINE__ = 3435;
-                                                              __LINE__ = 564;
-
-                                                              __LINE__ = 3437;
-                                                              __LINE__ = 1536;
-
-                                                              __LINE__ = 3438;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3440;
-                                                              __LINE__ = 1538;
-
-                                                              __LINE__ = 3441;
-                                                              __LINE__ = 565;
-
-                                                              __LINE__ = 3443;
-                                                              __LINE__ = 1539;
-
-                                                              __LINE__ = 3444;
-                                                              var tmp = "";
-
-                                                              __LINE__ = 3446;
-                                                              __LINE__ = 1541;
-
-                                                              __LINE__ = 3447;
-                                                              __LINE__ = 567;
-
-                                                              __LINE__ = 3449;
-                                                              __LINE__ = 1542;
-
-                                                              __LINE__ = 3450;
-                                                              __LINE__ = 32;
-
-                                                              __LINE__ = 3452;
-                                                              __LINE__ = 1544;
-
-                                                              __LINE__ = 3453;
-                                                              __LINE__ = 568;
-
-                                                              __LINE__ = 3455;
-                                                              __LINE__ = 1545;
-
-                                                              __LINE__ = 3456;
-                                                              while ( arr1[i] ){
-                                                                __LINE__ = 3457;
-                                                                __LINE__ = 1546;
-
-                                                                __LINE__ = 3458;
-                                                                __LINE__ = 569;
-
-                                                                __LINE__ = 3460;
-                                                                __LINE__ = 1547;
-
-                                                                __LINE__ = 3461;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3463;
-                                                                __LINE__ = 1549;
-
-                                                                __LINE__ = 3464;
-                                                                __LINE__ = 570;
-
-                                                                __LINE__ = 3466;
-                                                                __LINE__ = 1550;
-
-                                                                __LINE__ = 3467;
-                                                                tmp += "../";
-
-                                                                __LINE__ = 3469;
-                                                                __LINE__ = 1552;
-
-                                                                __LINE__ = 3470;
-                                                                __LINE__ = 572;
-
-                                                                __LINE__ = 3472;
-                                                                __LINE__ = 1553;
-
-                                                                __LINE__ = 3473;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3475;
-                                                                __LINE__ = 1555;
-
-                                                                __LINE__ = 3476;
-                                                                __LINE__ = 573;
-
-                                                                __LINE__ = 3478;
-                                                                __LINE__ = 1556;
-
-                                                                __LINE__ = 3479;
-                                                                i ++ ;
-                                                              };
-
-                                                              __LINE__ = 3482;
-                                                              __LINE__ = 1559;
-
-                                                              __LINE__ = 3483;
-                                                              __LINE__ = 575;
-
-                                                              __LINE__ = 3485;
-                                                              __LINE__ = 1560;
-
-                                                              __LINE__ = 3486;
-                                                              __LINE__ = 36;
-
-                                                              __LINE__ = 3488;
-                                                              __LINE__ = 1561;
-
-                                                              __LINE__ = 3489;
-                                                              __LINE__ = 576;
-
-                                                              __LINE__ = 3490;
-                                                              __LINE__ = 1562;
-                                                              __LINE__ = 3491;
-                                                              return tmp+ret;
-                                                            } else if ( arr1[i] != arr2[i] ){
-                                                              __LINE__ = 3493;
-                                                              __LINE__ = 1564;
-
-                                                              __LINE__ = 3494;
-                                                              __LINE__ = 578;
-
-                                                              __LINE__ = 3496;
-                                                              __LINE__ = 1565;
-
-                                                              __LINE__ = 3497;
-                                                              __LINE__ = 0;
-
-                                                              __LINE__ = 3499;
-                                                              __LINE__ = 1567;
-
-                                                              __LINE__ = 3500;
-                                                              __LINE__ = 579;
-
-                                                              __LINE__ = 3502;
-                                                              __LINE__ = 1568;
-
-                                                              __LINE__ = 3503;
-                                                              unmatch = true;
-
-                                                              __LINE__ = 3505;
-                                                              __LINE__ = 1570;
-
-                                                              __LINE__ = 3506;
-                                                              __LINE__ = 581;
-
-                                                              __LINE__ = 3508;
-                                                              __LINE__ = 1571;
-
-                                                              __LINE__ = 3509;
-                                                              __LINE__ = 39;
-
-                                                              __LINE__ = 3511;
-                                                              __LINE__ = 1573;
-
-                                                              __LINE__ = 3512;
-                                                              __LINE__ = 582;
-
-                                                              __LINE__ = 3514;
-                                                              __LINE__ = 1574;
-
-                                                              __LINE__ = 3515;
-                                                              while ( arr1[i] ){
-                                                                __LINE__ = 3516;
-                                                                __LINE__ = 1575;
-
-                                                                __LINE__ = 3517;
-                                                                __LINE__ = 583;
-
-                                                                __LINE__ = 3519;
-                                                                __LINE__ = 1576;
-
-                                                                __LINE__ = 3520;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3522;
-                                                                __LINE__ = 1578;
-
-                                                                __LINE__ = 3523;
-                                                                __LINE__ = 584;
-
-                                                                __LINE__ = 3525;
-                                                                __LINE__ = 1579;
-
-                                                                __LINE__ = 3526;
-                                                                ret += "../";
-
-                                                                __LINE__ = 3528;
-                                                                __LINE__ = 1581;
-
-                                                                __LINE__ = 3529;
-                                                                __LINE__ = 586;
-
-                                                                __LINE__ = 3531;
-                                                                __LINE__ = 1582;
-
-                                                                __LINE__ = 3532;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3534;
-                                                                __LINE__ = 1584;
-
-                                                                __LINE__ = 3535;
-                                                                __LINE__ = 587;
-
-                                                                __LINE__ = 3537;
-                                                                __LINE__ = 1585;
-
-                                                                __LINE__ = 3538;
-                                                                arr1.pop();
-                                                              };
-
-                                                              __LINE__ = 3541;
-                                                              __LINE__ = 1588;
-
-                                                              __LINE__ = 3542;
-                                                              __LINE__ = 590;
-
-                                                              __LINE__ = 3544;
-                                                              __LINE__ = 1589;
-
-                                                              __LINE__ = 3545;
-                                                              __LINE__ = 43;
-
-                                                              __LINE__ = 3547;
-                                                              __LINE__ = 1591;
-
-                                                              __LINE__ = 3548;
-                                                              __LINE__ = 591;
-
-                                                              __LINE__ = 3550;
-                                                              __LINE__ = 1592;
-
-                                                              __LINE__ = 3551;
-                                                              while ( arr2[i] ){
-                                                                __LINE__ = 3552;
-                                                                __LINE__ = 1593;
-
-                                                                __LINE__ = 3553;
-                                                                __LINE__ = 592;
-
-                                                                __LINE__ = 3555;
-                                                                __LINE__ = 1594;
-
-                                                                __LINE__ = 3556;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3558;
-                                                                __LINE__ = 1596;
-
-                                                                __LINE__ = 3559;
-                                                                __LINE__ = 593;
-
-                                                                __LINE__ = 3561;
-                                                                __LINE__ = 1597;
-
-                                                                __LINE__ = 3562;
-                                                                ret += arr2[i]+"/";
-
-                                                                __LINE__ = 3564;
-                                                                __LINE__ = 1599;
-
-                                                                __LINE__ = 3565;
-                                                                __LINE__ = 595;
-
-                                                                __LINE__ = 3567;
-                                                                __LINE__ = 1600;
-
-                                                                __LINE__ = 3568;
-                                                                __LINE__ = 0;
-
-                                                                __LINE__ = 3570;
-                                                                __LINE__ = 1602;
-
-                                                                __LINE__ = 3571;
-                                                                __LINE__ = 596;
-
-                                                                __LINE__ = 3573;
-                                                                __LINE__ = 1603;
-
-                                                                __LINE__ = 3574;
-                                                                i ++ ;
-                                                              };
-
-                                                              __LINE__ = 3577;
-                                                              __LINE__ = 1606;
-
-                                                              __LINE__ = 3578;
-                                                              __LINE__ = 598;
-
-                                                              __LINE__ = 3580;
-                                                              __LINE__ = 1607;
-
-                                                              __LINE__ = 3581;
-                                                              __LINE__ = 47;
-
-                                                              __LINE__ = 3583;
-                                                              __LINE__ = 1608;
-
-                                                              __LINE__ = 3584;
-                                                              __LINE__ = 599;
-
-                                                              __LINE__ = 3585;
-                                                              __LINE__ = 1609;
-                                                              __LINE__ = 3586;
-                                                              return ret;
-                                                            };
-
-                                                            __LINE__ = 3589;
-                                                            __LINE__ = 1612;
-
-                                                            __LINE__ = 3590;
-                                                            __LINE__ = 602;
-
-                                                            __LINE__ = 3592;
-                                                            __LINE__ = 1613;
-
-                                                            __LINE__ = 3593;
-                                                            __LINE__ = 0;
-
-                                                            __LINE__ = 3595;
-                                                            __LINE__ = 1615;
-
-                                                            __LINE__ = 3596;
-                                                            __LINE__ = 603;
-
-                                                            __LINE__ = 3598;
-                                                            __LINE__ = 1616;
-
-                                                            __LINE__ = 3599;
-                                                            i ++ ;
-                                                          };
-
-                                                          __LINE__ = 3602;
-                                                          __LINE__ = 1619;
-
-                                                          __LINE__ = 3603;
-                                                          __LINE__ = 605;
-
-                                                          __LINE__ = 3605;
-                                                          __LINE__ = 1620;
-
-                                                          __LINE__ = 3606;
-                                                          __LINE__ = 51;
-
-                                                          __LINE__ = 3608;
-                                                          __LINE__ = 1621;
-
-                                                          __LINE__ = 3609;
-                                                          __LINE__ = 606;
-
-                                                          __LINE__ = 3610;
-                                                          __LINE__ = 1622;
-                                                          __LINE__ = 3611;
-                                                          return ret;
-                                                        } catch( e ){
-                                                          __LINE__ = 3613;
-                                                          __LINE__ = 1624;
-
-                                                          __LINE__ = 3614;
-                                                          __LINE__ = 608;
-
-                                                          __LINE__ = 3616;
-                                                          __LINE__ = 1625;
-
-                                                          __LINE__ = 3617;
-                                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                        };
-                                                      } catch( e ){
-                                                        __LINE__ = 3620;
-                                                        __LINE__ = 1628;
-
-                                                        __LINE__ = 3621;
-                                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                      };
-                                                    } catch( e ){
-                                                      __LINE__ = 3624;
-                                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                    };
-                                                  } catch( e ){
-                                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                  }
-                                                }
-                                                __LINE__ = 3627;
-                                                __LINE__ = 1631;
-
-                                                __LINE__ = 3628;
-                                                __LINE__ = 611;
-
-                                                __LINE__ = 3630;
-                                                __LINE__ = 1632;
-
-                                                __LINE__ = 3631;
-                                                __LINE__ = 0;
-
-                                                __LINE__ = 3633;
-                                                __LINE__ = 1634;
-
-                                                __LINE__ = 3634;
-                                                __LINE__ = 612;
-
-                                                __LINE__ = 3636;
-                                                __LINE__ = 1635;
-
-                                                __LINE__ = 3637;
-                                                cmp( arr1,arr2 );
-                                              } catch( e ){
-                                                __LINE__ = 3639;
-                                                __LINE__ = 1637;
-
-                                                __LINE__ = 3640;
-                                                __LINE__ = 614;
-
-                                                __LINE__ = 3642;
-                                                __LINE__ = 1638;
-
-                                                __LINE__ = 3643;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              __LINE__ = 3646;
-                                              __LINE__ = 1641;
-
-                                              __LINE__ = 3647;
-                                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                            };
-                                          } catch( e ){
-                                            __LINE__ = 3650;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      })();
-                                    } catch( e ){
-                                      __LINE__ = 3654;
-                                      __LINE__ = 1645;
-
-                                      __LINE__ = 3655;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    __LINE__ = 3658;
-                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              })();
-                            } catch( e ){
-                              __LINE__ = 3662;
-                              __LINE__ = 1649;
-
-                              __LINE__ = 3663;
-                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                            };
-                          } catch( e ){
-                            __LINE__ = 3666;
-                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      })();
-                    } catch( e ){
-                      __LINE__ = 3670;
-                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                    };
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                })();
-              } catch( e ){
-                __LINE__ = 3674;
-                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-              };
-            } catch( e ){
-              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-            }
-          })();
-        } catch( e ){
-          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-        }
-      })();
-    } catch( e ){
-      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-    }
-  })();
-})();
diff --git a/src/test/js/path_array-cmp-cmp-cmp.js b/src/test/js/path_array-cmp-cmp-cmp.js
deleted file mode 100755
index 391105d..0000000
--- a/src/test/js/path_array-cmp-cmp-cmp.js
+++ /dev/null
@@ -1,3677 +0,0 @@
-(function() {
-  var __FILE__ = "Runtime",
-      __LINE__ = 0;
-
-  var _mochaGlobalExport = {},
-      _mochaClassTable = {};
-
-  var Runtime = ( function Runtime() {
-        var _mochaLocalExport = {};
-
-        function Exception( line,file,e ) {
-          this.toString = function () {
-            return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-          };
-        }
-        var Runtime =  {
-              getErrorMessage : function getErrorMessage( e ) {
-                return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-              },
-              exceptionHandler : function exceptionHandler( line,file,e ) {
-                this.throwException( new Exception( line,file,e ) );
-              },
-              throwException : function throwException( exception ) {
-                try {
-                  throw exception;
-                } catch( e ){
-                  throw new Error( this.getErrorMessage( e ) );
-                };
-              }
-            };
-
-        if ( !String.prototype.trim ){
-          String.prototype.trim = function () {
-            return this.replace( String.prototype.trim.rtrim,"" );
-          };
-
-          String.prototype.trim.rtrim = /^\s*|\s*$/g;
-        };
-
-        if ( !Function.prototype.bind ){
-          Function.prototype.bind = function () {
-            var argArray = Array.prototype.slice.call( arguments ),
-                context = argArray.shift(),
-                ret = function () {
-                  var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                  if ( this instanceof ret ){
-                    return ret.context.apply( this,args );
-                  } else {
-                    return ret.context.apply( context,args );
-                  };
-                };
-
-            ret.prototype = this.prototype;
-
-            ret.context = this;
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.forEach ){
-          Array.prototype.forEach = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn.call( that,ta,iter,this );
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn( ta,iter,this );
-              };
-            };
-          };
-        };
-
-        if ( !Array.prototype.every ){
-          Array.prototype.every = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn.call( that,ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn( ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            };
-            return true;
-          };
-        };
-
-        if ( !Array.prototype.some ){
-          Array.prototype.some = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn.call( that,ta,iter,this ) ){
-                  return true;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn( ta,iter,this ) ){
-                  return true;
-                };
-              };
-            };
-            return false;
-          };
-        };
-
-        if ( !Array.prototype.filter ){
-          Array.prototype.filter = function ( fn,that ) {
-            var iter = -1,
-                ret = [],
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn.call( that,ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn( ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.indexOf ){
-          Array.prototype.indexOf = function ( subject ) {
-            var iter = -1,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.lastIndexOf ){
-          Array.prototype.lastIndexOf = function ( subject ) {
-            var iter = this.length,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.map ){
-          Array.prototype.map = function ( fn,that ) {
-            var ret = [],
-                iter = -1,
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn.call( that,ta,i,this );
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn( ta,i,this );
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduce ){
-          Array.prototype.reduce = function ( fn,initial ) {
-            var ret = initial || this[0],
-                i = ( ( initial ) )?0 : 1,
-                ta,
-                len;
-
-            for ( i , len = this.length;i<len; ++ i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduceRight ){
-          Array.prototype.reduceRight = function ( fn,initial ) {
-            var ret = initial || this[this.length-1],
-                i = ( ( initial ) )?this.length-1 : this.length-2,
-                ta;
-
-            for ( i;i>-1; -- i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Date.prototype.toJSON ){
-          Date.prototype.toJSON = function () {
-            return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-          };
-        };
-
-        if ( !Date.now ){
-          Date.now = function () {
-            return +new Date();
-          };
-        };
-
-        if ( !Object.keys ){
-          Object.keys = function ( obj ) {
-            var ret = [],
-                iter = -1;
-
-            for ( var i in obj ){
-              if ( obj.hasOwnProperty( i ) ){
-                ret[ ++ iter] = obj[i];
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Object.preventExtensions ){
-          Object.preventExtensions = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.seal ){
-          Object.seal = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.freeze ){
-          Object.freeze = function ( o ) {
-            return o;
-          };
-        };
-
-        var hasRealEcma5 = ( function () {
-              try {
-                var obj = {};
-
-                Object.defineProperty( obj,"test", {
-                  configurable : false,
-                  writable : false,
-                  enumerable : false,
-                  value : 0
-                });
-
-                obj.test = 200;
-                return ( ( obj.test === 200 ) )?false : true;
-              } catch( e ){
-                return false;
-              };
-            })();
-
-        if ( !hasRealEcma5 ){
-          Object.defineProperty = function ( obj,prop,valobj ) {
-            if ( valobj.value ){
-              obj[prop] = valobj.value;
-            };
-          };
-        };
-
-        if ( !Array.isArray ){
-          var arrayString = "[object Array]";
-
-          Array.isArray = function ( arr ) {
-            if ( arguments.length === 0 ){
-              return false;
-            };
-            return ( ( arr ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-          };
-        };
-
-        var slice = Array.prototype.slice;
-
-        var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : true,
-                enumerable : false,
-                writable : true,
-                value : value
-              });
-            };
-
-        var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : false,
-                enumerable : false,
-                writable : false,
-                value : value
-              });
-            };
-
-        var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-              return ( ( likeArray ) )?slice.call( likeArray,index ) : [];
-            };
-
-        var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-              isKeyOnly = isKeyOnly || false;
-
-              var iter = {},
-                  isArray,
-                  ret,
-                  index = 0;
-
-              if ( this instanceof Iterator ){
-                isArray = Array.isArray( obj );
-
-                ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-              } else {
-                return _userdefIterator( obj,isKeyOnly );
-              };
-
-              createUnenumProp( iter,"next",
-              function () {
-                return ret[index ++ ];
-              });
-              return iter;
-            };
-
-        var _objectIterator = function ( obj,isKeyOnly ) {
-              var ret = [],
-                  iter = -1;
-
-              if ( isKeyOnly ){
-                for ( var prop in obj ){
-                  ret[ ++ iter] = prop;
-                };
-              } else {
-                for ( var prop in obj ){
-                  ret[ ++ iter] = [prop,obj[prop]];
-                };
-              };
-              return ret;
-            },
-            _arrayIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj[i]];
-                };
-              };
-              return ret;
-            },
-            _stringIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj.charAt( i )];
-                };
-              };
-              return ret;
-            },
-            _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-              var type = typeof obj;
-
-              if ( type === "object" && !isArray ){
-                return _objectIterator( obj,isKeyOnly );
-              } else if ( isArray ){
-                return _arrayIterator( obj,isKeyOnly );
-              } else if ( type === "string" ){
-                return _stringIterator( obj,isKeyOnly );
-              };
-            },
-            _userdefIterator = function ( obj,isKeyOnly ) {
-              if ( "__iterator__" in obj ){
-                return obj.__iterator__( isKeyOnly );
-              } else {
-                return  {
-                  next : function () {
-                    try {
-                      throw new StopIteration;
-                    } catch( e ){
-                      throw new Error( e );
-                    };
-                  }
-                };
-              };
-            };
-
-        var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-              var ret = {};
-
-              createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-              createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-              createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-              createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-              createUnenumProp( ret,"toString",
-              function () {
-                return "[object Generator]";
-              });
-
-              Object.freeze( ret );
-              return ret;
-            };
-
-        var getErrorMessage = function ( e ) {
-              return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-            };
-
-        var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-        var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-        ( function () {
-          var assert = _mochaLocalExport.assert = ( ( console && console.assert ) )?function ( expect,exp,str,line ) {
-                return console.assert( expect === exp,str+"\nat : "+line );
-              } : function ( expect,exp,str,line ) {
-                if ( expect !== exp ){
-                  Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                };
-              };
-        })();
-        return _mochaLocalExport;
-      })();
-
-  var StopIteration =  {
-        toString : function toString() {
-          return "StopIteration";
-        }
-      };
-
-  __LINE__ = 0;
-  ( function () {
-    try {
-      var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp-cmp.js",
-          __LINE__ = 0;
-      __LINE__ = 2;
-      _mochaGlobalExport['./path_array-cmp-cmp.js'] = {};
-
-      __LINE__ = 3;
-      var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp-cmp.js'];
-
-      __LINE__ = 1;
-      ( function () {
-        try {
-          __LINE__ = 2;
-          var __FILE__ = "Runtime",
-              __LINE__ = 0;
-
-          __LINE__ = 5;
-          var _mochaGlobalExport = {},
-              _mochaClassTable = {};
-
-          __LINE__ = 8;
-          var Runtime = ( function Runtime() {
-                try {
-                  __LINE__ = 9;
-                  var _mochaLocalExport = {};
-
-                  function Exception( line,file,e ) {
-                    try {
-                      __LINE__ = 12;
-                      this.toString = function () {
-                        try {
-                          __LINE__ = 13;
-                          return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  }
-                  __LINE__ = 16;
-                  var Runtime =  {
-                        getErrorMessage : function getErrorMessage( e ) {
-                          try {
-                            __LINE__ = 18;
-                            return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        exceptionHandler : function exceptionHandler( line,file,e ) {
-                          try {
-                            __LINE__ = 21;
-                            this.throwException( new Exception( line,file,e ) );
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        throwException : function throwException( exception ) {
-                          try {
-                            try {
-                              __LINE__ = 25;
-                              throw exception;
-                            } catch( e ){
-                              __LINE__ = 27;
-                              throw new Error( this.getErrorMessage( e ) );
-                            };
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        }
-                      };
-
-                  __LINE__ = 32;
-                  if ( !String.prototype.trim ){
-                    __LINE__ = 33;
-                    String.prototype.trim = function () {
-                      try {
-                        __LINE__ = 34;
-                        return this.replace( String.prototype.trim.rtrim,"" );
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-
-                    __LINE__ = 37;
-                    String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                  };
-
-                  __LINE__ = 40;
-                  if ( !Function.prototype.bind ){
-                    __LINE__ = 41;
-                    Function.prototype.bind = function () {
-                      try {
-                        __LINE__ = 42;
-                        var argArray = Array.prototype.slice.call( arguments ),
-                            context = argArray.shift(),
-                            ret = function () {
-                              try {
-                                __LINE__ = 45;
-                                var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                __LINE__ = 47;
-                                if ( this instanceof ret ){
-                                  __LINE__ = 48;
-                                  return ret.context.apply( this,args );
-                                } else {
-                                  __LINE__ = 50;
-                                  return ret.context.apply( context,args );
-                                };
-                              } catch( e ){
-                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                              }
-                            };
-
-                        __LINE__ = 54;
-                        ret.prototype = this.prototype;
-
-                        __LINE__ = 56;
-                        ret.context = this;
-                        __LINE__ = 57;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 61;
-                  if ( !Array.prototype.forEach ){
-                    __LINE__ = 62;
-                    Array.prototype.forEach = function ( fn,that ) {
-                      try {
-                        __LINE__ = 63;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 66;
-                        if ( that ){
-                          __LINE__ = 67;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 68;
-                            fn.call( that,ta,iter,this );
-                          };
-                        } else {
-                          __LINE__ = 71;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 72;
-                            fn( ta,iter,this );
-                          };
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 78;
-                  if ( !Array.prototype.every ){
-                    __LINE__ = 79;
-                    Array.prototype.every = function ( fn,that ) {
-                      try {
-                        __LINE__ = 80;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 83;
-                        if ( that ){
-                          __LINE__ = 84;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 85;
-                            if ( !( fn.call( that,ta,iter,this ) ) ){
-                              __LINE__ = 86;
-                              return false;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 90;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( !( fn( ta,iter,this ) ) ){
-                              __LINE__ = 92;
-                              return false;
-                            };
-                          };
-                        };
-                        __LINE__ = 96;
-                        return true;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 100;
-                  if ( !Array.prototype.some ){
-                    __LINE__ = 101;
-                    Array.prototype.some = function ( fn,that ) {
-                      try {
-                        __LINE__ = 102;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 105;
-                        if ( that ){
-                          __LINE__ = 106;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 107;
-                            if ( fn.call( that,ta,iter,this ) ){
-                              __LINE__ = 108;
-                              return true;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 112;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( fn( ta,iter,this ) ){
-                              __LINE__ = 114;
-                              return true;
-                            };
-                          };
-                        };
-                        __LINE__ = 118;
-                        return false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 122;
-                  if ( !Array.prototype.filter ){
-                    __LINE__ = 123;
-                    Array.prototype.filter = function ( fn,that ) {
-                      try {
-                        __LINE__ = 124;
-                        var iter = -1,
-                            ret = [],
-                            ta;
-
-                        __LINE__ = 128;
-                        if ( that ){
-                          __LINE__ = 129;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 130;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 131;
-                              if ( fn.call( that,ta,i,this ) ){
-                                __LINE__ = 132;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        } else {
-                          __LINE__ = 137;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              if ( fn( ta,i,this ) ){
-                                __LINE__ = 140;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        };
-                        __LINE__ = 145;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 149;
-                  if ( !Array.prototype.indexOf ){
-                    __LINE__ = 150;
-                    Array.prototype.indexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 151;
-                        var iter = -1,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 155;
-                        while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 156;
-                          if ( ta === subject ){
-                            __LINE__ = 157;
-                            index = iter;
-                            __LINE__ = 158;
-                            break;
-                          };
-                        };
-                        __LINE__ = 161;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 165;
-                  if ( !Array.prototype.lastIndexOf ){
-                    __LINE__ = 166;
-                    Array.prototype.lastIndexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 167;
-                        var iter = this.length,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 171;
-                        while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 172;
-                          if ( ta === subject ){
-                            __LINE__ = 173;
-                            index = iter;
-                            __LINE__ = 174;
-                            break;
-                          };
-                        };
-                        __LINE__ = 177;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 181;
-                  if ( !Array.prototype.map ){
-                    __LINE__ = 182;
-                    Array.prototype.map = function ( fn,that ) {
-                      try {
-                        __LINE__ = 183;
-                        var ret = [],
-                            iter = -1,
-                            ta;
-
-                        __LINE__ = 187;
-                        if ( that ){
-                          __LINE__ = 188;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 189;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 190;
-                              ret[ ++ iter] = fn.call( that,ta,i,this );
-                            };
-                          };
-                        } else {
-                          __LINE__ = 194;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 196;
-                              ret[ ++ iter] = fn( ta,i,this );
-                            };
-                          };
-                        };
-                        __LINE__ = 200;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 204;
-                  if ( !Array.prototype.reduce ){
-                    __LINE__ = 205;
-                    Array.prototype.reduce = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 206;
-                        var ret = initial || this[0],
-                            i = ( ( ( initial ) ) )?0 : 1,
-                            ta,
-                            len;
-
-                        __LINE__ = 211;
-                        for ( i , len = this.length;i<len; ++ i ){
-                          __LINE__ = 212;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 213;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 216;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 220;
-                  if ( !Array.prototype.reduceRight ){
-                    __LINE__ = 221;
-                    Array.prototype.reduceRight = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 222;
-                        var ret = initial || this[this.length-1],
-                            i = ( ( ( initial ) ) )?this.length-1 : this.length-2,
-                            ta;
-
-                        __LINE__ = 226;
-                        for ( i;i>-1; -- i ){
-                          __LINE__ = 227;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 228;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 231;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 235;
-                  if ( !Date.prototype.toJSON ){
-                    __LINE__ = 236;
-                    Date.prototype.toJSON = function () {
-                      try {
-                        __LINE__ = 237;
-                        return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 241;
-                  if ( !Date.now ){
-                    __LINE__ = 242;
-                    Date.now = function () {
-                      try {
-                        __LINE__ = 243;
-                        return +new Date();
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 247;
-                  if ( !Object.keys ){
-                    __LINE__ = 248;
-                    Object.keys = function ( obj ) {
-                      try {
-                        __LINE__ = 249;
-                        var ret = [],
-                            iter = -1;
-
-                        __LINE__ = 252;
-                        for ( var i in obj ){
-                          __LINE__ = 253;
-                          if ( obj.hasOwnProperty( i ) ){
-                            __LINE__ = 254;
-                            ret[ ++ iter] = obj[i];
-                          };
-                        };
-                        __LINE__ = 257;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 261;
-                  if ( !Object.preventExtensions ){
-                    __LINE__ = 262;
-                    Object.preventExtensions = function ( o ) {
-                      try {
-                        __LINE__ = 263;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 267;
-                  if ( !Object.seal ){
-                    __LINE__ = 268;
-                    Object.seal = function ( o ) {
-                      try {
-                        __LINE__ = 269;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 273;
-                  if ( !Object.freeze ){
-                    __LINE__ = 274;
-                    Object.freeze = function ( o ) {
-                      try {
-                        __LINE__ = 275;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 279;
-                  var hasRealEcma5 = ( function () {
-                        try {
-                          try {
-                            __LINE__ = 281;
-                            var obj = {};
-
-                            __LINE__ = 283;
-                            Object.defineProperty( obj,"test", {
-                              configurable : false,
-                              writable : false,
-                              enumerable : false,
-                              value : 0
-                            });
-
-                            __LINE__ = 290;
-                            obj.test = 200;
-                            __LINE__ = 291;
-                            return ( ( ( obj.test === 200 ) ) )?false : true;
-                          } catch( e ){
-                            __LINE__ = 293;
-                            return false;
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      })();
-
-                  __LINE__ = 297;
-                  if ( !hasRealEcma5 ){
-                    __LINE__ = 298;
-                    Object.defineProperty = function ( obj,prop,valobj ) {
-                      try {
-                        __LINE__ = 299;
-                        if ( valobj.value ){
-                          __LINE__ = 300;
-                          obj[prop] = valobj.value;
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 305;
-                  if ( !Array.isArray ){
-                    __LINE__ = 306;
-                    var arrayString = "[object Array]";
-
-                    __LINE__ = 308;
-                    Array.isArray = function ( arr ) {
-                      try {
-                        __LINE__ = 309;
-                        if ( arguments.length === 0 ){
-                          __LINE__ = 310;
-                          return false;
-                        };
-                        __LINE__ = 312;
-                        return ( ( ( arr ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 316;
-                  var slice = Array.prototype.slice;
-
-                  __LINE__ = 318;
-                  var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 319;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : true,
-                            enumerable : false,
-                            writable : true,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 327;
-                  var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 328;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : false,
-                            enumerable : false,
-                            writable : false,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 336;
-                  var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                        try {
-                          __LINE__ = 337;
-                          return ( ( ( likeArray ) ) )?slice.call( likeArray,index ) : [];
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 340;
-                  var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 341;
-                          isKeyOnly = isKeyOnly || false;
-
-                          __LINE__ = 343;
-                          var iter = {},
-                              isArray,
-                              ret,
-                              index = 0;
-
-                          __LINE__ = 348;
-                          if ( this instanceof Iterator ){
-                            __LINE__ = 349;
-                            isArray = Array.isArray( obj );
-
-                            __LINE__ = 351;
-                            ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                          } else {
-                            __LINE__ = 353;
-                            return _userdefIterator( obj,isKeyOnly );
-                          };
-
-                          __LINE__ = 356;
-                          createUnenumProp( iter,"next",
-                          function () {
-                            try {
-                              __LINE__ = 358;
-                              return ret[index ++ ];
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-                          __LINE__ = 360;
-                          return iter;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 363;
-                  var _objectIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 364;
-                          var ret = [],
-                              iter = -1;
-
-                          __LINE__ = 367;
-                          if ( isKeyOnly ){
-                            __LINE__ = 368;
-                            for ( var prop in obj ){
-                              __LINE__ = 369;
-                              ret[ ++ iter] = prop;
-                            };
-                          } else {
-                            __LINE__ = 372;
-                            for ( var prop in obj ){
-                              __LINE__ = 373;
-                              ret[ ++ iter] = [prop,obj[prop]];
-                            };
-                          };
-                          __LINE__ = 376;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _arrayIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 379;
-                          var ret = [];
-
-                          __LINE__ = 381;
-                          if ( isKeyOnly ){
-                            __LINE__ = 382;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 383;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 386;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 387;
-                              ret[i] = [i,obj[i]];
-                            };
-                          };
-                          __LINE__ = 390;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _stringIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 393;
-                          var ret = [];
-
-                          __LINE__ = 395;
-                          if ( isKeyOnly ){
-                            __LINE__ = 396;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 397;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 400;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 401;
-                              ret[i] = [i,obj.charAt( i )];
-                            };
-                          };
-                          __LINE__ = 404;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                        try {
-                          __LINE__ = 407;
-                          var type = typeof obj;
-
-                          __LINE__ = 409;
-                          if ( type === "object" && !isArray ){
-                            __LINE__ = 410;
-                            return _objectIterator( obj,isKeyOnly );
-                          } else if ( isArray ){
-                            __LINE__ = 412;
-                            return _arrayIterator( obj,isKeyOnly );
-                          } else if ( type === "string" ){
-                            __LINE__ = 414;
-                            return _stringIterator( obj,isKeyOnly );
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _userdefIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 418;
-                          if ( "__iterator__" in obj ){
-                            __LINE__ = 419;
-                            return obj.__iterator__( isKeyOnly );
-                          } else {
-                            __LINE__ = 421;
-                            return  {
-                              next : function () {
-                                try {
-                                  try {
-                                    __LINE__ = 424;
-                                    throw new StopIteration;
-                                  } catch( e ){
-                                    __LINE__ = 426;
-                                    throw new Error( e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              }
-                            };
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 433;
-                  var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                        try {
-                          __LINE__ = 434;
-                          var ret = {};
-
-                          __LINE__ = 436;
-                          createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                          __LINE__ = 438;
-                          createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                          __LINE__ = 440;
-                          createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                          __LINE__ = 442;
-                          createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                          __LINE__ = 444;
-                          createUnenumProp( ret,"toString",
-                          function () {
-                            try {
-                              __LINE__ = 446;
-                              return "[object Generator]";
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-
-                          __LINE__ = 449;
-                          Object.freeze( ret );
-                          __LINE__ = 450;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 453;
-                  var getErrorMessage = function ( e ) {
-                        try {
-                          __LINE__ = 454;
-                          return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 457;
-                  var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                  __LINE__ = 459;
-                  var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                  __LINE__ = 461;
-                  ( function () {
-                    try {
-                      __LINE__ = 462;
-                      var assert = _mochaLocalExport.assert = ( ( ( console && console.assert ) ) )?function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 463;
-                              return console.assert( expect === exp,str+"\nat : "+line );
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          } : function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 465;
-                              if ( expect !== exp ){
-                                __LINE__ = 466;
-                                Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                              };
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  })();
-                  __LINE__ = 470;
-                  return _mochaLocalExport;
-                } catch( e ){
-                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                }
-              })();
-
-          __LINE__ = 473;
-          var StopIteration =  {
-                toString : function toString() {
-                  try {
-                    __LINE__ = 475;
-                    return "StopIteration";
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                }
-              };
-
-          __LINE__ = 479;
-          __LINE__ = 0;
-
-          __LINE__ = 480;
-          ( function () {
-            try {
-              try {
-                __LINE__ = 482;
-                var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp.js",
-                    __LINE__ = 0;
-
-                __LINE__ = 484;
-                __LINE__ = 2;
-
-                __LINE__ = 485;
-                _mochaGlobalExport['./path_array-cmp.js'] = {};
-
-                __LINE__ = 487;
-                __LINE__ = 3;
-
-                __LINE__ = 488;
-                var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp.js'];
-
-                __LINE__ = 490;
-                __LINE__ = 1;
-
-                __LINE__ = 491;
-                ( function () {
-                  try {
-                    try {
-                      __LINE__ = 493;
-                      __LINE__ = 2;
-
-                      __LINE__ = 494;
-                      var __FILE__ = "Runtime",
-                          __LINE__ = 0;
-
-                      __LINE__ = 497;
-                      __LINE__ = 5;
-
-                      __LINE__ = 498;
-                      var _mochaGlobalExport = {},
-                          _mochaClassTable = {};
-
-                      __LINE__ = 501;
-                      __LINE__ = 8;
-
-                      __LINE__ = 502;
-                      var Runtime = ( function Runtime() {
-                            try {
-                              try {
-                                __LINE__ = 504;
-                                __LINE__ = 9;
-
-                                __LINE__ = 505;
-                                var _mochaLocalExport = {};
-
-                                function Exception( line,file,e ) {
-                                  try {
-                                    try {
-                                      __LINE__ = 509;
-                                      __LINE__ = 12;
-
-                                      __LINE__ = 510;
-                                      this.toString = function () {
-                                        try {
-                                          try {
-                                            __LINE__ = 512;
-                                            __LINE__ = 13;
-                                            __LINE__ = 513;
-                                            return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                                          } catch( e ){
-                                            __LINE__ = 515;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      };
-                                    } catch( e ){
-                                      __LINE__ = 519;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                  }
-                                }
-                                __LINE__ = 522;
-                                __LINE__ = 16;
-
-                                __LINE__ = 523;
-                                var Runtime =  {
-                                      getErrorMessage : function getErrorMessage( e ) {
-                                        try {
-                                          try {
-                                            __LINE__ = 526;
-                                            __LINE__ = 18;
-                                            __LINE__ = 527;
-                                            return ( ( ( ( e.message ) ) ) )?e.message : ( ( ( ( e.description ) ) ) )?e.description : e.toString();
-                                          } catch( e ){
-                                            __LINE__ = 529;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      },
-                                      exceptionHandler : function exceptionHandler( line,file,e ) {
-                                        try {
-                                          try {
-                                            __LINE__ = 534;
-                                            __LINE__ = 21;
-
-                                            __LINE__ = 535;
-                                            this.throwException( new Exception( line,file,e ) );
-                                          } catch( e ){
-                                            __LINE__ = 537;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      },
-                                      throwException : function throwException( exception ) {
-                                        try {
-                                          try {
-                                            try {
-                                              __LINE__ = 543;
-                                              __LINE__ = 25;
-                                              __LINE__ = 544;
-                                              throw exception;
-                                            } catch( e ){
-                                              __LINE__ = 546;
-                                              __LINE__ = 27;
-                                              __LINE__ = 547;
-                                              throw new Error( this.getErrorMessage( e ) );
-                                            };
-                                          } catch( e ){
-                                            __LINE__ = 550;
-                                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                          };
-                                        } catch( e ){
-                                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                        }
-                                      }
-                                    };
-
-                                __LINE__ = 555;
-                                __LINE__ = 32;
-
-                                __LINE__ = 556;
-                                if ( !String.prototype.trim ){
-                                  __LINE__ = 557;
-                                  __LINE__ = 33;
-
-                                  __LINE__ = 558;
-                                  String.prototype.trim = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 560;
-                                        __LINE__ = 34;
-                                        __LINE__ = 561;
-                                        return this.replace( String.prototype.trim.rtrim,"" );
-                                      } catch( e ){
-                                        __LINE__ = 563;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-
-                                  __LINE__ = 567;
-                                  __LINE__ = 37;
-
-                                  __LINE__ = 568;
-                                  String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                                };
-
-                                __LINE__ = 571;
-                                __LINE__ = 40;
-
-                                __LINE__ = 572;
-                                if ( !Function.prototype.bind ){
-                                  __LINE__ = 573;
-                                  __LINE__ = 41;
-
-                                  __LINE__ = 574;
-                                  Function.prototype.bind = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 576;
-                                        __LINE__ = 42;
-
-                                        __LINE__ = 577;
-                                        var argArray = Array.prototype.slice.call( arguments ),
-                                            context = argArray.shift(),
-                                            ret = function () {
-                                              try {
-                                                try {
-                                                  __LINE__ = 581;
-                                                  __LINE__ = 45;
-
-                                                  __LINE__ = 582;
-                                                  var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                                  __LINE__ = 584;
-                                                  __LINE__ = 47;
-
-                                                  __LINE__ = 585;
-                                                  if ( this instanceof ret ){
-                                                    __LINE__ = 586;
-                                                    __LINE__ = 48;
-                                                    __LINE__ = 587;
-                                                    return ret.context.apply( this,args );
-                                                  } else {
-                                                    __LINE__ = 589;
-                                                    __LINE__ = 50;
-                                                    __LINE__ = 590;
-                                                    return ret.context.apply( context,args );
-                                                  };
-                                                } catch( e ){
-                                                  __LINE__ = 593;
-                                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                };
-                                              } catch( e ){
-                                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                              }
-                                            };
-
-                                        __LINE__ = 597;
-                                        __LINE__ = 54;
-
-                                        __LINE__ = 598;
-                                        ret.prototype = this.prototype;
-
-                                        __LINE__ = 600;
-                                        __LINE__ = 56;
-
-                                        __LINE__ = 601;
-                                        ret.context = this;
-
-                                        __LINE__ = 602;
-                                        __LINE__ = 57;
-                                        __LINE__ = 603;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 605;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 610;
-                                __LINE__ = 61;
-
-                                __LINE__ = 611;
-                                if ( !Array.prototype.forEach ){
-                                  __LINE__ = 612;
-                                  __LINE__ = 62;
-
-                                  __LINE__ = 613;
-                                  Array.prototype.forEach = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 615;
-                                        __LINE__ = 63;
-
-                                        __LINE__ = 616;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 619;
-                                        __LINE__ = 66;
-
-                                        __LINE__ = 620;
-                                        if ( that ){
-                                          __LINE__ = 621;
-                                          __LINE__ = 67;
-
-                                          __LINE__ = 622;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 623;
-                                            __LINE__ = 68;
-
-                                            __LINE__ = 624;
-                                            fn.call( that,ta,iter,this );
-                                          };
-                                        } else {
-                                          __LINE__ = 627;
-                                          __LINE__ = 71;
-
-                                          __LINE__ = 628;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 629;
-                                            __LINE__ = 72;
-
-                                            __LINE__ = 630;
-                                            fn( ta,iter,this );
-                                          };
-                                        };
-                                      } catch( e ){
-                                        __LINE__ = 634;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 639;
-                                __LINE__ = 78;
-
-                                __LINE__ = 640;
-                                if ( !Array.prototype.every ){
-                                  __LINE__ = 641;
-                                  __LINE__ = 79;
-
-                                  __LINE__ = 642;
-                                  Array.prototype.every = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 644;
-                                        __LINE__ = 80;
-
-                                        __LINE__ = 645;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 648;
-                                        __LINE__ = 83;
-
-                                        __LINE__ = 649;
-                                        if ( that ){
-                                          __LINE__ = 650;
-                                          __LINE__ = 84;
-
-                                          __LINE__ = 651;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 652;
-                                            __LINE__ = 85;
-
-                                            __LINE__ = 653;
-                                            if ( !( fn.call( that,ta,iter,this ) ) ){
-                                              __LINE__ = 654;
-                                              __LINE__ = 86;
-                                              __LINE__ = 655;
-                                              return false;
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 659;
-                                          __LINE__ = 90;
-
-                                          __LINE__ = 660;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            if ( !( fn( ta,iter,this ) ) ){
-                                              __LINE__ = 662;
-                                              __LINE__ = 92;
-                                              __LINE__ = 663;
-                                              return false;
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 667;
-                                        __LINE__ = 96;
-                                        __LINE__ = 668;
-                                        return true;
-                                      } catch( e ){
-                                        __LINE__ = 670;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 675;
-                                __LINE__ = 100;
-
-                                __LINE__ = 676;
-                                if ( !Array.prototype.some ){
-                                  __LINE__ = 677;
-                                  __LINE__ = 101;
-
-                                  __LINE__ = 678;
-                                  Array.prototype.some = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 680;
-                                        __LINE__ = 102;
-
-                                        __LINE__ = 681;
-                                        var iter = -1,
-                                            ta;
-
-                                        __LINE__ = 684;
-                                        __LINE__ = 105;
-
-                                        __LINE__ = 685;
-                                        if ( that ){
-                                          __LINE__ = 686;
-                                          __LINE__ = 106;
-
-                                          __LINE__ = 687;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            __LINE__ = 688;
-                                            __LINE__ = 107;
-
-                                            __LINE__ = 689;
-                                            if ( fn.call( that,ta,iter,this ) ){
-                                              __LINE__ = 690;
-                                              __LINE__ = 108;
-                                              __LINE__ = 691;
-                                              return true;
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 695;
-                                          __LINE__ = 112;
-
-                                          __LINE__ = 696;
-                                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                            if ( fn( ta,iter,this ) ){
-                                              __LINE__ = 698;
-                                              __LINE__ = 114;
-                                              __LINE__ = 699;
-                                              return true;
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 703;
-                                        __LINE__ = 118;
-                                        __LINE__ = 704;
-                                        return false;
-                                      } catch( e ){
-                                        __LINE__ = 706;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 711;
-                                __LINE__ = 122;
-
-                                __LINE__ = 712;
-                                if ( !Array.prototype.filter ){
-                                  __LINE__ = 713;
-                                  __LINE__ = 123;
-
-                                  __LINE__ = 714;
-                                  Array.prototype.filter = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 716;
-                                        __LINE__ = 124;
-
-                                        __LINE__ = 717;
-                                        var iter = -1,
-                                            ret = [],
-                                            ta;
-
-                                        __LINE__ = 721;
-                                        __LINE__ = 128;
-
-                                        __LINE__ = 722;
-                                        if ( that ){
-                                          __LINE__ = 723;
-                                          __LINE__ = 129;
-
-                                          __LINE__ = 724;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            __LINE__ = 725;
-                                            __LINE__ = 130;
-
-                                            __LINE__ = 726;
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 727;
-                                              __LINE__ = 131;
-
-                                              __LINE__ = 728;
-                                              if ( fn.call( that,ta,i,this ) ){
-                                                __LINE__ = 729;
-                                                __LINE__ = 132;
-
-                                                __LINE__ = 730;
-                                                ret[ ++ iter] = ta;
-                                              };
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 735;
-                                          __LINE__ = 137;
-
-                                          __LINE__ = 736;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              if ( fn( ta,i,this ) ){
-                                                __LINE__ = 739;
-                                                __LINE__ = 140;
-
-                                                __LINE__ = 740;
-                                                ret[ ++ iter] = ta;
-                                              };
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 745;
-                                        __LINE__ = 145;
-                                        __LINE__ = 746;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 748;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 753;
-                                __LINE__ = 149;
-
-                                __LINE__ = 754;
-                                if ( !Array.prototype.indexOf ){
-                                  __LINE__ = 755;
-                                  __LINE__ = 150;
-
-                                  __LINE__ = 756;
-                                  Array.prototype.indexOf = function ( subject ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 758;
-                                        __LINE__ = 151;
-
-                                        __LINE__ = 759;
-                                        var iter = -1,
-                                            index = -1,
-                                            ta;
-
-                                        __LINE__ = 763;
-                                        __LINE__ = 155;
-
-                                        __LINE__ = 764;
-                                        while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                                          __LINE__ = 765;
-                                          __LINE__ = 156;
-
-                                          __LINE__ = 766;
-                                          if ( ta === subject ){
-                                            __LINE__ = 767;
-                                            __LINE__ = 157;
-
-                                            __LINE__ = 768;
-                                            index = iter;
-
-                                            __LINE__ = 769;
-                                            __LINE__ = 158;
-                                            __LINE__ = 770;
-                                            break;
-                                          };
-                                        };
-
-                                        __LINE__ = 773;
-                                        __LINE__ = 161;
-                                        __LINE__ = 774;
-                                        return index;
-                                      } catch( e ){
-                                        __LINE__ = 776;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 781;
-                                __LINE__ = 165;
-
-                                __LINE__ = 782;
-                                if ( !Array.prototype.lastIndexOf ){
-                                  __LINE__ = 783;
-                                  __LINE__ = 166;
-
-                                  __LINE__ = 784;
-                                  Array.prototype.lastIndexOf = function ( subject ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 786;
-                                        __LINE__ = 167;
-
-                                        __LINE__ = 787;
-                                        var iter = this.length,
-                                            index = -1,
-                                            ta;
-
-                                        __LINE__ = 791;
-                                        __LINE__ = 171;
-
-                                        __LINE__ = 792;
-                                        while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                                          __LINE__ = 793;
-                                          __LINE__ = 172;
-
-                                          __LINE__ = 794;
-                                          if ( ta === subject ){
-                                            __LINE__ = 795;
-                                            __LINE__ = 173;
-
-                                            __LINE__ = 796;
-                                            index = iter;
-
-                                            __LINE__ = 797;
-                                            __LINE__ = 174;
-                                            __LINE__ = 798;
-                                            break;
-                                          };
-                                        };
-
-                                        __LINE__ = 801;
-                                        __LINE__ = 177;
-                                        __LINE__ = 802;
-                                        return index;
-                                      } catch( e ){
-                                        __LINE__ = 804;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 809;
-                                __LINE__ = 181;
-
-                                __LINE__ = 810;
-                                if ( !Array.prototype.map ){
-                                  __LINE__ = 811;
-                                  __LINE__ = 182;
-
-                                  __LINE__ = 812;
-                                  Array.prototype.map = function ( fn,that ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 814;
-                                        __LINE__ = 183;
-
-                                        __LINE__ = 815;
-                                        var ret = [],
-                                            iter = -1,
-                                            ta;
-
-                                        __LINE__ = 819;
-                                        __LINE__ = 187;
-
-                                        __LINE__ = 820;
-                                        if ( that ){
-                                          __LINE__ = 821;
-                                          __LINE__ = 188;
-
-                                          __LINE__ = 822;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            __LINE__ = 823;
-                                            __LINE__ = 189;
-
-                                            __LINE__ = 824;
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 825;
-                                              __LINE__ = 190;
-
-                                              __LINE__ = 826;
-                                              ret[ ++ iter] = fn.call( that,ta,i,this );
-                                            };
-                                          };
-                                        } else {
-                                          __LINE__ = 830;
-                                          __LINE__ = 194;
-
-                                          __LINE__ = 831;
-                                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                              __LINE__ = 833;
-                                              __LINE__ = 196;
-
-                                              __LINE__ = 834;
-                                              ret[ ++ iter] = fn( ta,i,this );
-                                            };
-                                          };
-                                        };
-
-                                        __LINE__ = 838;
-                                        __LINE__ = 200;
-                                        __LINE__ = 839;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 841;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 846;
-                                __LINE__ = 204;
-
-                                __LINE__ = 847;
-                                if ( !Array.prototype.reduce ){
-                                  __LINE__ = 848;
-                                  __LINE__ = 205;
-
-                                  __LINE__ = 849;
-                                  Array.prototype.reduce = function ( fn,initial ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 851;
-                                        __LINE__ = 206;
-
-                                        __LINE__ = 852;
-                                        var ret = initial || this[0],
-                                            i = ( ( ( ( initial ) ) ) )?0 : 1,
-                                            ta,
-                                            len;
-
-                                        __LINE__ = 857;
-                                        __LINE__ = 211;
-
-                                        __LINE__ = 858;
-                                        for ( i , len = this.length;i<len; ++ i ){
-                                          __LINE__ = 859;
-                                          __LINE__ = 212;
-
-                                          __LINE__ = 860;
-                                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                            __LINE__ = 861;
-                                            __LINE__ = 213;
-
-                                            __LINE__ = 862;
-                                            ret = fn( ret,ta,i,this );
-                                          };
-                                        };
-
-                                        __LINE__ = 865;
-                                        __LINE__ = 216;
-                                        __LINE__ = 866;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 868;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 873;
-                                __LINE__ = 220;
-
-                                __LINE__ = 874;
-                                if ( !Array.prototype.reduceRight ){
-                                  __LINE__ = 875;
-                                  __LINE__ = 221;
-
-                                  __LINE__ = 876;
-                                  Array.prototype.reduceRight = function ( fn,initial ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 878;
-                                        __LINE__ = 222;
-
-                                        __LINE__ = 879;
-                                        var ret = initial || this[this.length-1],
-                                            i = ( ( ( ( initial ) ) ) )?this.length-1 : this.length-2,
-                                            ta;
-
-                                        __LINE__ = 883;
-                                        __LINE__ = 226;
-
-                                        __LINE__ = 884;
-                                        for ( i;i>-1; -- i ){
-                                          __LINE__ = 885;
-                                          __LINE__ = 227;
-
-                                          __LINE__ = 886;
-                                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                                            __LINE__ = 887;
-                                            __LINE__ = 228;
-
-                                            __LINE__ = 888;
-                                            ret = fn( ret,ta,i,this );
-                                          };
-                                        };
-
-                                        __LINE__ = 891;
-                                        __LINE__ = 231;
-                                        __LINE__ = 892;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 894;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 899;
-                                __LINE__ = 235;
-
-                                __LINE__ = 900;
-                                if ( !Date.prototype.toJSON ){
-                                  __LINE__ = 901;
-                                  __LINE__ = 236;
-
-                                  __LINE__ = 902;
-                                  Date.prototype.toJSON = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 904;
-                                        __LINE__ = 237;
-                                        __LINE__ = 905;
-                                        return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                                      } catch( e ){
-                                        __LINE__ = 907;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 912;
-                                __LINE__ = 241;
-
-                                __LINE__ = 913;
-                                if ( !Date.now ){
-                                  __LINE__ = 914;
-                                  __LINE__ = 242;
-
-                                  __LINE__ = 915;
-                                  Date.now = function () {
-                                    try {
-                                      try {
-                                        __LINE__ = 917;
-                                        __LINE__ = 243;
-                                        __LINE__ = 918;
-                                        return +new Date();
-                                      } catch( e ){
-                                        __LINE__ = 920;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 925;
-                                __LINE__ = 247;
-
-                                __LINE__ = 926;
-                                if ( !Object.keys ){
-                                  __LINE__ = 927;
-                                  __LINE__ = 248;
-
-                                  __LINE__ = 928;
-                                  Object.keys = function ( obj ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 930;
-                                        __LINE__ = 249;
-
-                                        __LINE__ = 931;
-                                        var ret = [],
-                                            iter = -1;
-
-                                        __LINE__ = 934;
-                                        __LINE__ = 252;
-
-                                        __LINE__ = 935;
-                                        for ( var i in obj ){
-                                          __LINE__ = 936;
-                                          __LINE__ = 253;
-
-                                          __LINE__ = 937;
-                                          if ( obj.hasOwnProperty( i ) ){
-                                            __LINE__ = 938;
-                                            __LINE__ = 254;
-
-                                            __LINE__ = 939;
-                                            ret[ ++ iter] = obj[i];
-                                          };
-                                        };
-
-                                        __LINE__ = 942;
-                                        __LINE__ = 257;
-                                        __LINE__ = 943;
-                                        return ret;
-                                      } catch( e ){
-                                        __LINE__ = 945;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 950;
-                                __LINE__ = 261;
-
-                                __LINE__ = 951;
-                                if ( !Object.preventExtensions ){
-                                  __LINE__ = 952;
-                                  __LINE__ = 262;
-
-                                  __LINE__ = 953;
-                                  Object.preventExtensions = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 955;
-                                        __LINE__ = 263;
-                                        __LINE__ = 956;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 958;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 963;
-                                __LINE__ = 267;
-
-                                __LINE__ = 964;
-                                if ( !Object.seal ){
-                                  __LINE__ = 965;
-                                  __LINE__ = 268;
-
-                                  __LINE__ = 966;
-                                  Object.seal = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 968;
-                                        __LINE__ = 269;
-                                        __LINE__ = 969;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 971;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 976;
-                                __LINE__ = 273;
-
-                                __LINE__ = 977;
-                                if ( !Object.freeze ){
-                                  __LINE__ = 978;
-                                  __LINE__ = 274;
-
-                                  __LINE__ = 979;
-                                  Object.freeze = function ( o ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 981;
-                                        __LINE__ = 275;
-                                        __LINE__ = 982;
-                                        return o;
-                                      } catch( e ){
-                                        __LINE__ = 984;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 989;
-                                __LINE__ = 279;
-
-                                __LINE__ = 990;
-                                var hasRealEcma5 = ( function () {
-                                      try {
-                                        try {
-                                          try {
-                                            __LINE__ = 993;
-                                            __LINE__ = 281;
-
-                                            __LINE__ = 994;
-                                            var obj = {};
-
-                                            __LINE__ = 996;
-                                            __LINE__ = 283;
-
-                                            __LINE__ = 997;
-                                            Object.defineProperty( obj,"test", {
-                                              configurable : false,
-                                              writable : false,
-                                              enumerable : false,
-                                              value : 0
-                                            });
-
-                                            __LINE__ = 1004;
-                                            __LINE__ = 290;
-
-                                            __LINE__ = 1005;
-                                            obj.test = 200;
-
-                                            __LINE__ = 1006;
-                                            __LINE__ = 291;
-                                            __LINE__ = 1007;
-                                            return ( ( ( ( obj.test === 200 ) ) ) )?false : true;
-                                          } catch( e ){
-                                            __LINE__ = 1009;
-                                            __LINE__ = 293;
-                                            __LINE__ = 1010;
-                                            return false;
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1013;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    })();
-
-                                __LINE__ = 1017;
-                                __LINE__ = 297;
-
-                                __LINE__ = 1018;
-                                if ( !hasRealEcma5 ){
-                                  __LINE__ = 1019;
-                                  __LINE__ = 298;
-
-                                  __LINE__ = 1020;
-                                  Object.defineProperty = function ( obj,prop,valobj ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 1022;
-                                        __LINE__ = 299;
-
-                                        __LINE__ = 1023;
-                                        if ( valobj.value ){
-                                          __LINE__ = 1024;
-                                          __LINE__ = 300;
-
-                                          __LINE__ = 1025;
-                                          obj[prop] = valobj.value;
-                                        };
-                                      } catch( e ){
-                                        __LINE__ = 1028;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 1033;
-                                __LINE__ = 305;
-
-                                __LINE__ = 1034;
-                                if ( !Array.isArray ){
-                                  __LINE__ = 1035;
-                                  __LINE__ = 306;
-
-                                  __LINE__ = 1036;
-                                  var arrayString = "[object Array]";
-
-                                  __LINE__ = 1038;
-                                  __LINE__ = 308;
-
-                                  __LINE__ = 1039;
-                                  Array.isArray = function ( arr ) {
-                                    try {
-                                      try {
-                                        __LINE__ = 1041;
-                                        __LINE__ = 309;
-
-                                        __LINE__ = 1042;
-                                        if ( arguments.length === 0 ){
-                                          __LINE__ = 1043;
-                                          __LINE__ = 310;
-                                          __LINE__ = 1044;
-                                          return false;
-                                        };
-
-                                        __LINE__ = 1046;
-                                        __LINE__ = 312;
-                                        __LINE__ = 1047;
-                                        return ( ( ( ( arr ) ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                                      } catch( e ){
-                                        __LINE__ = 1049;
-                                        Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                      };
-                                    } catch( e ){
-                                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                    }
-                                  };
-                                };
-
-                                __LINE__ = 1054;
-                                __LINE__ = 316;
-
-                                __LINE__ = 1055;
-                                var slice = Array.prototype.slice;
-
-                                __LINE__ = 1057;
-                                __LINE__ = 318;
-
-                                __LINE__ = 1058;
-                                var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1060;
-                                          __LINE__ = 319;
-                                          __LINE__ = 1061;
-                                          return Object.defineProperty( obj,prop, {
-                                            configurable : true,
-                                            enumerable : false,
-                                            writable : true,
-                                            value : value
-                                          });
-                                        } catch( e ){
-                                          __LINE__ = 1068;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1072;
-                                __LINE__ = 327;
-
-                                __LINE__ = 1073;
-                                var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1075;
-                                          __LINE__ = 328;
-                                          __LINE__ = 1076;
-                                          return Object.defineProperty( obj,prop, {
-                                            configurable : false,
-                                            enumerable : false,
-                                            writable : false,
-                                            value : value
-                                          });
-                                        } catch( e ){
-                                          __LINE__ = 1083;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1087;
-                                __LINE__ = 336;
-
-                                __LINE__ = 1088;
-                                var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1090;
-                                          __LINE__ = 337;
-                                          __LINE__ = 1091;
-                                          return ( ( ( ( likeArray ) ) ) )?slice.call( likeArray,index ) : [];
-                                        } catch( e ){
-                                          __LINE__ = 1093;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1097;
-                                __LINE__ = 340;
-
-                                __LINE__ = 1098;
-                                var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1100;
-                                          __LINE__ = 341;
-
-                                          __LINE__ = 1101;
-                                          isKeyOnly = isKeyOnly || false;
-
-                                          __LINE__ = 1103;
-                                          __LINE__ = 343;
-
-                                          __LINE__ = 1104;
-                                          var iter = {},
-                                              isArray,
-                                              ret,
-                                              index = 0;
-
-                                          __LINE__ = 1109;
-                                          __LINE__ = 348;
-
-                                          __LINE__ = 1110;
-                                          if ( this instanceof Iterator ){
-                                            __LINE__ = 1111;
-                                            __LINE__ = 349;
-
-                                            __LINE__ = 1112;
-                                            isArray = Array.isArray( obj );
-
-                                            __LINE__ = 1114;
-                                            __LINE__ = 351;
-
-                                            __LINE__ = 1115;
-                                            ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                                          } else {
-                                            __LINE__ = 1117;
-                                            __LINE__ = 353;
-                                            __LINE__ = 1118;
-                                            return _userdefIterator( obj,isKeyOnly );
-                                          };
-
-                                          __LINE__ = 1121;
-                                          __LINE__ = 356;
-
-                                          __LINE__ = 1122;
-                                          createUnenumProp( iter,"next",
-                                          function () {
-                                            try {
-                                              try {
-                                                __LINE__ = 1125;
-                                                __LINE__ = 358;
-                                                __LINE__ = 1126;
-                                                return ret[index ++ ];
-                                              } catch( e ){
-                                                __LINE__ = 1128;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          });
-
-                                          __LINE__ = 1131;
-                                          __LINE__ = 360;
-                                          __LINE__ = 1132;
-                                          return iter;
-                                        } catch( e ){
-                                          __LINE__ = 1134;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1138;
-                                __LINE__ = 363;
-
-                                __LINE__ = 1139;
-                                var _objectIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1141;
-                                          __LINE__ = 364;
-
-                                          __LINE__ = 1142;
-                                          var ret = [],
-                                              iter = -1;
-
-                                          __LINE__ = 1145;
-                                          __LINE__ = 367;
-
-                                          __LINE__ = 1146;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1147;
-                                            __LINE__ = 368;
-
-                                            __LINE__ = 1148;
-                                            for ( var prop in obj ){
-                                              __LINE__ = 1149;
-                                              __LINE__ = 369;
-
-                                              __LINE__ = 1150;
-                                              ret[ ++ iter] = prop;
-                                            };
-                                          } else {
-                                            __LINE__ = 1153;
-                                            __LINE__ = 372;
-
-                                            __LINE__ = 1154;
-                                            for ( var prop in obj ){
-                                              __LINE__ = 1155;
-                                              __LINE__ = 373;
-
-                                              __LINE__ = 1156;
-                                              ret[ ++ iter] = [prop,obj[prop]];
-                                            };
-                                          };
-
-                                          __LINE__ = 1159;
-                                          __LINE__ = 376;
-                                          __LINE__ = 1160;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1162;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _arrayIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1167;
-                                          __LINE__ = 379;
-
-                                          __LINE__ = 1168;
-                                          var ret = [];
-
-                                          __LINE__ = 1170;
-                                          __LINE__ = 381;
-
-                                          __LINE__ = 1171;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1172;
-                                            __LINE__ = 382;
-
-                                            __LINE__ = 1173;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1174;
-                                              __LINE__ = 383;
-
-                                              __LINE__ = 1175;
-                                              ret[i] = i;
-                                            };
-                                          } else {
-                                            __LINE__ = 1178;
-                                            __LINE__ = 386;
-
-                                            __LINE__ = 1179;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1180;
-                                              __LINE__ = 387;
-
-                                              __LINE__ = 1181;
-                                              ret[i] = [i,obj[i]];
-                                            };
-                                          };
-
-                                          __LINE__ = 1184;
-                                          __LINE__ = 390;
-                                          __LINE__ = 1185;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1187;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _stringIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1192;
-                                          __LINE__ = 393;
-
-                                          __LINE__ = 1193;
-                                          var ret = [];
-
-                                          __LINE__ = 1195;
-                                          __LINE__ = 395;
-
-                                          __LINE__ = 1196;
-                                          if ( isKeyOnly ){
-                                            __LINE__ = 1197;
-                                            __LINE__ = 396;
-
-                                            __LINE__ = 1198;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1199;
-                                              __LINE__ = 397;
-
-                                              __LINE__ = 1200;
-                                              ret[i] = i;
-                                            };
-                                          } else {
-                                            __LINE__ = 1203;
-                                            __LINE__ = 400;
-
-                                            __LINE__ = 1204;
-                                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                                              __LINE__ = 1205;
-                                              __LINE__ = 401;
-
-                                              __LINE__ = 1206;
-                                              ret[i] = [i,obj.charAt( i )];
-                                            };
-                                          };
-
-                                          __LINE__ = 1209;
-                                          __LINE__ = 404;
-                                          __LINE__ = 1210;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1212;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1217;
-                                          __LINE__ = 407;
-
-                                          __LINE__ = 1218;
-                                          var type = typeof obj;
-
-                                          __LINE__ = 1220;
-                                          __LINE__ = 409;
-
-                                          __LINE__ = 1221;
-                                          if ( type === "object" && !isArray ){
-                                            __LINE__ = 1222;
-                                            __LINE__ = 410;
-                                            __LINE__ = 1223;
-                                            return _objectIterator( obj,isKeyOnly );
-                                          } else if ( isArray ){
-                                            __LINE__ = 1225;
-                                            __LINE__ = 412;
-                                            __LINE__ = 1226;
-                                            return _arrayIterator( obj,isKeyOnly );
-                                          } else if ( type === "string" ){
-                                            __LINE__ = 1228;
-                                            __LINE__ = 414;
-                                            __LINE__ = 1229;
-                                            return _stringIterator( obj,isKeyOnly );
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1232;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    },
-                                    _userdefIterator = function ( obj,isKeyOnly ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1237;
-                                          __LINE__ = 418;
-
-                                          __LINE__ = 1238;
-                                          if ( "__iterator__" in obj ){
-                                            __LINE__ = 1239;
-                                            __LINE__ = 419;
-                                            __LINE__ = 1240;
-                                            return obj.__iterator__( isKeyOnly );
-                                          } else {
-                                            __LINE__ = 1242;
-                                            __LINE__ = 421;
-                                            __LINE__ = 1243;
-                                            return  {
-                                              next : function () {
-                                                try {
-                                                  try {
-                                                    try {
-                                                      __LINE__ = 1247;
-                                                      __LINE__ = 424;
-                                                      __LINE__ = 1248;
-                                                      throw new StopIteration;
-                                                    } catch( e ){
-                                                      __LINE__ = 1250;
-                                                      __LINE__ = 426;
-                                                      __LINE__ = 1251;
-                                                      throw new Error( e );
-                                                    };
-                                                  } catch( e ){
-                                                    __LINE__ = 1254;
-                                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                                  };
-                                                } catch( e ){
-                                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                                }
-                                              }
-                                            };
-                                          };
-                                        } catch( e ){
-                                          __LINE__ = 1260;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1264;
-                                __LINE__ = 433;
-
-                                __LINE__ = 1265;
-                                var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1267;
-                                          __LINE__ = 434;
-
-                                          __LINE__ = 1268;
-                                          var ret = {};
-
-                                          __LINE__ = 1270;
-                                          __LINE__ = 436;
-
-                                          __LINE__ = 1271;
-                                          createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                                          __LINE__ = 1273;
-                                          __LINE__ = 438;
-
-                                          __LINE__ = 1274;
-                                          createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                                          __LINE__ = 1276;
-                                          __LINE__ = 440;
-
-                                          __LINE__ = 1277;
-                                          createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                                          __LINE__ = 1279;
-                                          __LINE__ = 442;
-
-                                          __LINE__ = 1280;
-                                          createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                                          __LINE__ = 1282;
-                                          __LINE__ = 444;
-
-                                          __LINE__ = 1283;
-                                          createUnenumProp( ret,"toString",
-                                          function () {
-                                            try {
-                                              try {
-                                                __LINE__ = 1286;
-                                                __LINE__ = 446;
-                                                __LINE__ = 1287;
-                                                return "[object Generator]";
-                                              } catch( e ){
-                                                __LINE__ = 1289;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          });
-
-                                          __LINE__ = 1293;
-                                          __LINE__ = 449;
-
-                                          __LINE__ = 1294;
-                                          Object.freeze( ret );
-
-                                          __LINE__ = 1295;
-                                          __LINE__ = 450;
-                                          __LINE__ = 1296;
-                                          return ret;
-                                        } catch( e ){
-                                          __LINE__ = 1298;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1302;
-                                __LINE__ = 453;
-
-                                __LINE__ = 1303;
-                                var getErrorMessage = function ( e ) {
-                                      try {
-                                        try {
-                                          __LINE__ = 1305;
-                                          __LINE__ = 454;
-                                          __LINE__ = 1306;
-                                          return ( ( ( ( e.message ) ) ) )?e.message : ( ( ( ( e.description ) ) ) )?e.description : e.toString();
-                                        } catch( e ){
-                                          __LINE__ = 1308;
-                                          Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                        };
-                                      } catch( e ){
-                                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                      }
-                                    };
-
-                                __LINE__ = 1312;
-                                __LINE__ = 457;
-
-                                __LINE__ = 1313;
-                                var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                                __LINE__ = 1315;
-                                __LINE__ = 459;
-
-                                __LINE__ = 1316;
-                                var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                                __LINE__ = 1318;
-                                __LINE__ = 461;
-
-                                __LINE__ = 1319;
-                                ( function () {
-                                  try {
-                                    try {
-                                      __LINE__ = 1321;
-                                      __LINE__ = 462;
-
-                                      __LINE__ = 1322;
-                                      var assert = _mochaLocalExport.assert = ( ( ( ( console && console.assert ) ) ) )?function ( expect,exp,str,line ) {
-                                            try {
-                                              try {
-                                                __LINE__ = 1324;
-                                                __LINE__ = 463;
-                                                __LINE__ = 1325;
-                                                return console.assert( expect === exp,str+"\nat : "+line );
-                                              } catch( e ){
-                                                __LINE__ = 1327;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          } : function ( expect,exp,str,line ) {
-                                            try {
-                                              try {
-                                                __LINE__ = 1331;
-                                                __LINE__ = 465;
-
-                                                __LINE__ = 1332;
-                                                if ( expect !== exp ){
-                                                  __LINE__ = 1333;
-                                                  __LINE__ = 466;
-
-                                                  __LINE__ = 1334;
-                                                  Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                                                };
-                                              } catch( e ){
-                                                __LINE__ = 1337;
-                                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                              };
-                                            } catch( e ){
-                                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                            }
-                                          };
-                                    } catch( e ){
-                                      __LINE__ = 1341;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                  }
-                                })();
-
-                                __LINE__ = 1344;
-                                __LINE__ = 470;
-                                __LINE__ = 1345;
-                                return _mochaLocalExport;
-                              } catch( e ){
-                                __LINE__ = 1347;
-                                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                              };
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          })();
-
-                      __LINE__ = 1351;
-                      __LINE__ = 473;
-
-                      __LINE__ = 1352;
-                      var StopIteration =  {
-                            toString : function toString() {
-                              try {
-                                try {
-                                  __LINE__ = 1355;
-                                  __LINE__ = 475;
-                                  __LINE__ = 1356;
-                                  return "StopIteration";
-                                } catch( e ){
-                                  __LINE__ = 1358;
-                                  Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                };
-                              } catch( e ){
-                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                              }
-                            }
-                          };
-
-                      __LINE__ = 1363;
-                      __LINE__ = 479;
-
-                      __LINE__ = 1364;
-                      __LINE__ = 0;
-
-                      __LINE__ = 1366;
-                      __LINE__ = 480;
-
-                      __LINE__ = 1367;
-                      ( function () {
-                        try {
-                          try {
-                            try {
-                              __LINE__ = 1370;
-                              __LINE__ = 482;
-
-                              __LINE__ = 1371;
-                              var __FILE__ = "/var/samba/mocha/src/test/js/path_array.js",
-                                  __LINE__ = 0;
-
-                              __LINE__ = 1374;
-                              __LINE__ = 484;
-
-                              __LINE__ = 1375;
-                              __LINE__ = 2;
-
-                              __LINE__ = 1377;
-                              __LINE__ = 485;
-
-                              __LINE__ = 1378;
-                              _mochaGlobalExport['./path_array.js'] = {};
-
-                              __LINE__ = 1380;
-                              __LINE__ = 487;
-
-                              __LINE__ = 1381;
-                              __LINE__ = 3;
-
-                              __LINE__ = 1383;
-                              __LINE__ = 488;
-
-                              __LINE__ = 1384;
-                              var _mochaGlobalAlias = _mochaGlobalExport['./path_array.js'];
-
-                              __LINE__ = 1386;
-                              __LINE__ = 490;
-
-                              __LINE__ = 1387;
-                              __LINE__ = 0;
-
-                              __LINE__ = 1389;
-                              __LINE__ = 491;
-
-                              __LINE__ = 1390;
-                              var m = "/Users/aono_taketoshi/mocha/test/js";
-
-                              __LINE__ = 1392;
-                              __LINE__ = 493;
-
-                              __LINE__ = 1393;
-                              __LINE__ = 0;
-
-                              __LINE__ = 1395;
-                              __LINE__ = 494;
-
-                              __LINE__ = 1396;
-                              var v = "/url/local/includes";
-
-                              function getPathArray( path ) {
-                                try {
-                                  try {
-                                    try {
-                                      __LINE__ = 1401;
-                                      __LINE__ = 498;
-
-                                      __LINE__ = 1402;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1404;
-                                      __LINE__ = 499;
-
-                                      __LINE__ = 1405;
-                                      if ( path[path.length-1] !== '/' ){
-                                        __LINE__ = 1406;
-                                        __LINE__ = 500;
-
-                                        __LINE__ = 1407;
-                                        __LINE__ = 0;
-
-                                        __LINE__ = 1409;
-                                        __LINE__ = 501;
-
-                                        __LINE__ = 1410;
-                                        path += '/';
-                                      };
-
-                                      __LINE__ = 1413;
-                                      __LINE__ = 504;
-
-                                      __LINE__ = 1414;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1416;
-                                      __LINE__ = 505;
-
-                                      __LINE__ = 1417;
-                                      var i = 0;
-
-                                      __LINE__ = 1419;
-                                      __LINE__ = 507;
-
-                                      __LINE__ = 1420;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1422;
-                                      __LINE__ = 508;
-
-                                      __LINE__ = 1423;
-                                      var arr = [];
-
-                                      __LINE__ = 1425;
-                                      __LINE__ = 510;
-
-                                      __LINE__ = 1426;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1428;
-                                      __LINE__ = 511;
-
-                                      __LINE__ = 1429;
-                                      var tmp = "";
-
-                                      __LINE__ = 1431;
-                                      __LINE__ = 513;
-
-                                      __LINE__ = 1432;
-                                      __LINE__ = 8;
-
-                                      __LINE__ = 1434;
-                                      __LINE__ = 514;
-
-                                      __LINE__ = 1435;
-                                      while ( path[i] ){
-                                        __LINE__ = 1436;
-                                        __LINE__ = 515;
-
-                                        __LINE__ = 1437;
-                                        __LINE__ = 0;
-
-                                        __LINE__ = 1439;
-                                        __LINE__ = 516;
-
-                                        __LINE__ = 1440;
-                                        if ( path[i] == '/' ){
-                                          __LINE__ = 1441;
-                                          __LINE__ = 517;
-
-                                          __LINE__ = 1442;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1444;
-                                          __LINE__ = 518;
-
-                                          __LINE__ = 1445;
-                                          if ( i == 0 ){
-                                            __LINE__ = 1446;
-                                            __LINE__ = 519;
-
-                                            __LINE__ = 1447;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1449;
-                                            __LINE__ = 520;
-
-                                            __LINE__ = 1450;
-                                            arr.push( "/" );
-                                          } else {
-                                            __LINE__ = 1452;
-                                            __LINE__ = 522;
-
-                                            __LINE__ = 1453;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1455;
-                                            __LINE__ = 523;
-
-                                            __LINE__ = 1456;
-                                            arr.push( tmp );
-                                          };
-
-                                          __LINE__ = 1459;
-                                          __LINE__ = 526;
-
-                                          __LINE__ = 1460;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1462;
-                                          __LINE__ = 527;
-
-                                          __LINE__ = 1463;
-                                          tmp = "";
-                                        } else {
-                                          __LINE__ = 1465;
-                                          __LINE__ = 529;
-
-                                          __LINE__ = 1466;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1468;
-                                          __LINE__ = 530;
-
-                                          __LINE__ = 1469;
-                                          tmp += path[i];
-                                        };
-
-                                        __LINE__ = 1472;
-                                        __LINE__ = 533;
-
-                                        __LINE__ = 1473;
-                                        __LINE__ = 0;
-
-                                        __LINE__ = 1475;
-                                        __LINE__ = 534;
-
-                                        __LINE__ = 1476;
-                                        i ++ ;
-                                      };
-
-                                      __LINE__ = 1479;
-                                      __LINE__ = 536;
-
-                                      __LINE__ = 1480;
-                                      __LINE__ = 18;
-
-                                      __LINE__ = 1481;
-                                      __LINE__ = 537;
-                                      __LINE__ = 1482;
-                                      return arr;
-                                    } catch( e ){
-                                      __LINE__ = 1484;
-                                      __LINE__ = 539;
-
-                                      __LINE__ = 1485;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    __LINE__ = 1488;
-                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              }
-                              __LINE__ = 1491;
-                              __LINE__ = 542;
-
-                              __LINE__ = 1492;
-                              __LINE__ = 0;
-
-                              __LINE__ = 1494;
-                              __LINE__ = 543;
-
-                              __LINE__ = 1495;
-                              var arr1 = getPathArray( m ),
-                                  arr2 = getPathArray( v );
-
-                              function cmp( arr1,arr2 ) {
-                                try {
-                                  try {
-                                    try {
-                                      __LINE__ = 1501;
-                                      __LINE__ = 548;
-
-                                      __LINE__ = 1502;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1504;
-                                      __LINE__ = 549;
-
-                                      __LINE__ = 1505;
-                                      var ret = "";
-
-                                      __LINE__ = 1507;
-                                      __LINE__ = 551;
-
-                                      __LINE__ = 1508;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1510;
-                                      __LINE__ = 552;
-
-                                      __LINE__ = 1511;
-                                      var i = 0;
-
-                                      __LINE__ = 1513;
-                                      __LINE__ = 554;
-
-                                      __LINE__ = 1514;
-                                      __LINE__ = 0;
-
-                                      __LINE__ = 1516;
-                                      __LINE__ = 555;
-
-                                      __LINE__ = 1517;
-                                      var unmatch = false;
-
-                                      __LINE__ = 1519;
-                                      __LINE__ = 557;
-
-                                      __LINE__ = 1520;
-                                      __LINE__ = 27;
-
-                                      __LINE__ = 1522;
-                                      __LINE__ = 558;
-
-                                      __LINE__ = 1523;
-                                      while ( arr1[i] || arr2[i] ){
-                                        __LINE__ = 1524;
-                                        __LINE__ = 559;
-
-                                        __LINE__ = 1525;
-                                        __LINE__ = 0;
-
-                                        __LINE__ = 1527;
-                                        __LINE__ = 560;
-
-                                        __LINE__ = 1528;
-                                        if ( !arr1[i] ){
-                                          __LINE__ = 1529;
-                                          __LINE__ = 561;
-
-                                          __LINE__ = 1530;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1532;
-                                          __LINE__ = 562;
-
-                                          __LINE__ = 1533;
-                                          ret += arr2[i]+"/";
-                                        } else if ( !arr2[i] ){
-                                          __LINE__ = 1535;
-                                          __LINE__ = 564;
-
-                                          __LINE__ = 1536;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1538;
-                                          __LINE__ = 565;
-
-                                          __LINE__ = 1539;
-                                          var tmp = "";
-
-                                          __LINE__ = 1541;
-                                          __LINE__ = 567;
-
-                                          __LINE__ = 1542;
-                                          __LINE__ = 32;
-
-                                          __LINE__ = 1544;
-                                          __LINE__ = 568;
-
-                                          __LINE__ = 1545;
-                                          while ( arr1[i] ){
-                                            __LINE__ = 1546;
-                                            __LINE__ = 569;
-
-                                            __LINE__ = 1547;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1549;
-                                            __LINE__ = 570;
-
-                                            __LINE__ = 1550;
-                                            tmp += "../";
-
-                                            __LINE__ = 1552;
-                                            __LINE__ = 572;
-
-                                            __LINE__ = 1553;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1555;
-                                            __LINE__ = 573;
-
-                                            __LINE__ = 1556;
-                                            i ++ ;
-                                          };
-
-                                          __LINE__ = 1559;
-                                          __LINE__ = 575;
-
-                                          __LINE__ = 1560;
-                                          __LINE__ = 36;
-
-                                          __LINE__ = 1561;
-                                          __LINE__ = 576;
-                                          __LINE__ = 1562;
-                                          return tmp+ret;
-                                        } else if ( arr1[i] != arr2[i] ){
-                                          __LINE__ = 1564;
-                                          __LINE__ = 578;
-
-                                          __LINE__ = 1565;
-                                          __LINE__ = 0;
-
-                                          __LINE__ = 1567;
-                                          __LINE__ = 579;
-
-                                          __LINE__ = 1568;
-                                          unmatch = true;
-
-                                          __LINE__ = 1570;
-                                          __LINE__ = 581;
-
-                                          __LINE__ = 1571;
-                                          __LINE__ = 39;
-
-                                          __LINE__ = 1573;
-                                          __LINE__ = 582;
-
-                                          __LINE__ = 1574;
-                                          while ( arr1[i] ){
-                                            __LINE__ = 1575;
-                                            __LINE__ = 583;
-
-                                            __LINE__ = 1576;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1578;
-                                            __LINE__ = 584;
-
-                                            __LINE__ = 1579;
-                                            ret += "../";
-
-                                            __LINE__ = 1581;
-                                            __LINE__ = 586;
-
-                                            __LINE__ = 1582;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1584;
-                                            __LINE__ = 587;
-
-                                            __LINE__ = 1585;
-                                            arr1.pop();
-                                          };
-
-                                          __LINE__ = 1588;
-                                          __LINE__ = 590;
-
-                                          __LINE__ = 1589;
-                                          __LINE__ = 43;
-
-                                          __LINE__ = 1591;
-                                          __LINE__ = 591;
-
-                                          __LINE__ = 1592;
-                                          while ( arr2[i] ){
-                                            __LINE__ = 1593;
-                                            __LINE__ = 592;
-
-                                            __LINE__ = 1594;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1596;
-                                            __LINE__ = 593;
-
-                                            __LINE__ = 1597;
-                                            ret += arr2[i]+"/";
-
-                                            __LINE__ = 1599;
-                                            __LINE__ = 595;
-
-                                            __LINE__ = 1600;
-                                            __LINE__ = 0;
-
-                                            __LINE__ = 1602;
-                                            __LINE__ = 596;
-
-                                            __LINE__ = 1603;
-                                            i ++ ;
-                                          };
-
-                                          __LINE__ = 1606;
-                                          __LINE__ = 598;
-
-                                          __LINE__ = 1607;
-                                          __LINE__ = 47;
-
-                                          __LINE__ = 1608;
-                                          __LINE__ = 599;
-                                          __LINE__ = 1609;
-                                          return ret;
-                                        };
-
-                                        __LINE__ = 1612;
-                                        __LINE__ = 602;
-
-                                        __LINE__ = 1613;
-                                        __LINE__ = 0;
-
-                                        __LINE__ = 1615;
-                                        __LINE__ = 603;
-
-                                        __LINE__ = 1616;
-                                        i ++ ;
-                                      };
-
-                                      __LINE__ = 1619;
-                                      __LINE__ = 605;
-
-                                      __LINE__ = 1620;
-                                      __LINE__ = 51;
-
-                                      __LINE__ = 1621;
-                                      __LINE__ = 606;
-                                      __LINE__ = 1622;
-                                      return ret;
-                                    } catch( e ){
-                                      __LINE__ = 1624;
-                                      __LINE__ = 608;
-
-                                      __LINE__ = 1625;
-                                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                    };
-                                  } catch( e ){
-                                    __LINE__ = 1628;
-                                    Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              }
-                              __LINE__ = 1631;
-                              __LINE__ = 611;
-
-                              __LINE__ = 1632;
-                              __LINE__ = 0;
-
-                              __LINE__ = 1634;
-                              __LINE__ = 612;
-
-                              __LINE__ = 1635;
-                              cmp( arr1,arr2 );
-                            } catch( e ){
-                              __LINE__ = 1637;
-                              __LINE__ = 614;
-
-                              __LINE__ = 1638;
-                              Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                            };
-                          } catch( e ){
-                            __LINE__ = 1641;
-                            Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      })();
-                    } catch( e ){
-                      __LINE__ = 1645;
-                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                    };
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                })();
-              } catch( e ){
-                __LINE__ = 1649;
-                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-              };
-            } catch( e ){
-              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-            }
-          })();
-        } catch( e ){
-          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-        }
-      })();
-    } catch( e ){
-      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-    }
-  })();
-})();
diff --git a/src/test/js/path_array-cmp-cmp.js b/src/test/js/path_array-cmp-cmp.js
deleted file mode 100755
index a8c14b7..0000000
--- a/src/test/js/path_array-cmp-cmp.js
+++ /dev/null
@@ -1,1652 +0,0 @@
-(function() {
-  var __FILE__ = "Runtime",
-      __LINE__ = 0;
-
-  var _mochaGlobalExport = {},
-      _mochaClassTable = {};
-
-  var Runtime = ( function Runtime() {
-        var _mochaLocalExport = {};
-
-        function Exception( line,file,e ) {
-          this.toString = function () {
-            return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-          };
-        }
-        var Runtime =  {
-              getErrorMessage : function getErrorMessage( e ) {
-                return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-              },
-              exceptionHandler : function exceptionHandler( line,file,e ) {
-                this.throwException( new Exception( line,file,e ) );
-              },
-              throwException : function throwException( exception ) {
-                try {
-                  throw exception;
-                } catch( e ){
-                  throw new Error( this.getErrorMessage( e ) );
-                };
-              }
-            };
-
-        if ( !String.prototype.trim ){
-          String.prototype.trim = function () {
-            return this.replace( String.prototype.trim.rtrim,"" );
-          };
-
-          String.prototype.trim.rtrim = /^\s*|\s*$/g;
-        };
-
-        if ( !Function.prototype.bind ){
-          Function.prototype.bind = function () {
-            var argArray = Array.prototype.slice.call( arguments ),
-                context = argArray.shift(),
-                ret = function () {
-                  var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                  if ( this instanceof ret ){
-                    return ret.context.apply( this,args );
-                  } else {
-                    return ret.context.apply( context,args );
-                  };
-                };
-
-            ret.prototype = this.prototype;
-
-            ret.context = this;
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.forEach ){
-          Array.prototype.forEach = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn.call( that,ta,iter,this );
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                fn( ta,iter,this );
-              };
-            };
-          };
-        };
-
-        if ( !Array.prototype.every ){
-          Array.prototype.every = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn.call( that,ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( !( fn( ta,iter,this ) ) ){
-                  return false;
-                };
-              };
-            };
-            return true;
-          };
-        };
-
-        if ( !Array.prototype.some ){
-          Array.prototype.some = function ( fn,that ) {
-            var iter = -1,
-                ta;
-
-            if ( that ){
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn.call( that,ta,iter,this ) ){
-                  return true;
-                };
-              };
-            } else {
-              while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                if ( fn( ta,iter,this ) ){
-                  return true;
-                };
-              };
-            };
-            return false;
-          };
-        };
-
-        if ( !Array.prototype.filter ){
-          Array.prototype.filter = function ( fn,that ) {
-            var iter = -1,
-                ret = [],
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn.call( that,ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  if ( fn( ta,i,this ) ){
-                    ret[ ++ iter] = ta;
-                  };
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.indexOf ){
-          Array.prototype.indexOf = function ( subject ) {
-            var iter = -1,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.lastIndexOf ){
-          Array.prototype.lastIndexOf = function ( subject ) {
-            var iter = this.length,
-                index = -1,
-                ta;
-
-            while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-              if ( ta === subject ){
-                index = iter;
-                break;
-              };
-            };
-            return index;
-          };
-        };
-
-        if ( !Array.prototype.map ){
-          Array.prototype.map = function ( fn,that ) {
-            var ret = [],
-                iter = -1,
-                ta;
-
-            if ( that ){
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn.call( that,ta,i,this );
-                };
-              };
-            } else {
-              for ( var i = 0,len = this.length;i<len; ++ i ){
-                if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                  ret[ ++ iter] = fn( ta,i,this );
-                };
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduce ){
-          Array.prototype.reduce = function ( fn,initial ) {
-            var ret = initial || this[0],
-                i = ( ( initial ) )?0 : 1,
-                ta,
-                len;
-
-            for ( i , len = this.length;i<len; ++ i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Array.prototype.reduceRight ){
-          Array.prototype.reduceRight = function ( fn,initial ) {
-            var ret = initial || this[this.length-1],
-                i = ( ( initial ) )?this.length-1 : this.length-2,
-                ta;
-
-            for ( i;i>-1; -- i ){
-              if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                ret = fn( ret,ta,i,this );
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Date.prototype.toJSON ){
-          Date.prototype.toJSON = function () {
-            return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-          };
-        };
-
-        if ( !Date.now ){
-          Date.now = function () {
-            return +new Date();
-          };
-        };
-
-        if ( !Object.keys ){
-          Object.keys = function ( obj ) {
-            var ret = [],
-                iter = -1;
-
-            for ( var i in obj ){
-              if ( obj.hasOwnProperty( i ) ){
-                ret[ ++ iter] = obj[i];
-              };
-            };
-            return ret;
-          };
-        };
-
-        if ( !Object.preventExtensions ){
-          Object.preventExtensions = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.seal ){
-          Object.seal = function ( o ) {
-            return o;
-          };
-        };
-
-        if ( !Object.freeze ){
-          Object.freeze = function ( o ) {
-            return o;
-          };
-        };
-
-        var hasRealEcma5 = ( function () {
-              try {
-                var obj = {};
-
-                Object.defineProperty( obj,"test", {
-                  configurable : false,
-                  writable : false,
-                  enumerable : false,
-                  value : 0
-                });
-
-                obj.test = 200;
-                return ( ( obj.test === 200 ) )?false : true;
-              } catch( e ){
-                return false;
-              };
-            })();
-
-        if ( !hasRealEcma5 ){
-          Object.defineProperty = function ( obj,prop,valobj ) {
-            if ( valobj.value ){
-              obj[prop] = valobj.value;
-            };
-          };
-        };
-
-        if ( !Array.isArray ){
-          var arrayString = "[object Array]";
-
-          Array.isArray = function ( arr ) {
-            if ( arguments.length === 0 ){
-              return false;
-            };
-            return ( ( arr ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-          };
-        };
-
-        var slice = Array.prototype.slice;
-
-        var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : true,
-                enumerable : false,
-                writable : true,
-                value : value
-              });
-            };
-
-        var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-              return Object.defineProperty( obj,prop, {
-                configurable : false,
-                enumerable : false,
-                writable : false,
-                value : value
-              });
-            };
-
-        var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-              return ( ( likeArray ) )?slice.call( likeArray,index ) : [];
-            };
-
-        var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-              isKeyOnly = isKeyOnly || false;
-
-              var iter = {},
-                  isArray,
-                  ret,
-                  index = 0;
-
-              if ( this instanceof Iterator ){
-                isArray = Array.isArray( obj );
-
-                ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-              } else {
-                return _userdefIterator( obj,isKeyOnly );
-              };
-
-              createUnenumProp( iter,"next",
-              function () {
-                return ret[index ++ ];
-              });
-              return iter;
-            };
-
-        var _objectIterator = function ( obj,isKeyOnly ) {
-              var ret = [],
-                  iter = -1;
-
-              if ( isKeyOnly ){
-                for ( var prop in obj ){
-                  ret[ ++ iter] = prop;
-                };
-              } else {
-                for ( var prop in obj ){
-                  ret[ ++ iter] = [prop,obj[prop]];
-                };
-              };
-              return ret;
-            },
-            _arrayIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj[i]];
-                };
-              };
-              return ret;
-            },
-            _stringIterator = function ( obj,isKeyOnly ) {
-              var ret = [];
-
-              if ( isKeyOnly ){
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = i;
-                };
-              } else {
-                for ( var i = 0,len = obj.length;i<len;i ++  ){
-                  ret[i] = [i,obj.charAt( i )];
-                };
-              };
-              return ret;
-            },
-            _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-              var type = typeof obj;
-
-              if ( type === "object" && !isArray ){
-                return _objectIterator( obj,isKeyOnly );
-              } else if ( isArray ){
-                return _arrayIterator( obj,isKeyOnly );
-              } else if ( type === "string" ){
-                return _stringIterator( obj,isKeyOnly );
-              };
-            },
-            _userdefIterator = function ( obj,isKeyOnly ) {
-              if ( "__iterator__" in obj ){
-                return obj.__iterator__( isKeyOnly );
-              } else {
-                return  {
-                  next : function () {
-                    try {
-                      throw new StopIteration;
-                    } catch( e ){
-                      throw new Error( e );
-                    };
-                  }
-                };
-              };
-            };
-
-        var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-              var ret = {};
-
-              createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-              createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-              createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-              createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-              createUnenumProp( ret,"toString",
-              function () {
-                return "[object Generator]";
-              });
-
-              Object.freeze( ret );
-              return ret;
-            };
-
-        var getErrorMessage = function ( e ) {
-              return ( ( e.message ) )?e.message : ( ( e.description ) )?e.description : e.toString();
-            };
-
-        var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-        var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-        ( function () {
-          var assert = _mochaLocalExport.assert = ( ( console && console.assert ) )?function ( expect,exp,str,line ) {
-                return console.assert( expect === exp,str+"\nat : "+line );
-              } : function ( expect,exp,str,line ) {
-                if ( expect !== exp ){
-                  Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                };
-              };
-        })();
-        return _mochaLocalExport;
-      })();
-
-  var StopIteration =  {
-        toString : function toString() {
-          return "StopIteration";
-        }
-      };
-
-  __LINE__ = 0;
-  ( function () {
-    try {
-      var __FILE__ = "/var/samba/mocha/src/test/js/path_array-cmp.js",
-          __LINE__ = 0;
-      __LINE__ = 2;
-      _mochaGlobalExport['./path_array-cmp.js'] = {};
-
-      __LINE__ = 3;
-      var _mochaGlobalAlias = _mochaGlobalExport['./path_array-cmp.js'];
-
-      __LINE__ = 1;
-      ( function () {
-        try {
-          __LINE__ = 2;
-          var __FILE__ = "Runtime",
-              __LINE__ = 0;
-
-          __LINE__ = 5;
-          var _mochaGlobalExport = {},
-              _mochaClassTable = {};
-
-          __LINE__ = 8;
-          var Runtime = ( function Runtime() {
-                try {
-                  __LINE__ = 9;
-                  var _mochaLocalExport = {};
-
-                  function Exception( line,file,e ) {
-                    try {
-                      __LINE__ = 12;
-                      this.toString = function () {
-                        try {
-                          __LINE__ = 13;
-                          return Runtime.getErrorMessage( e )+" in file "+file+" at : "+line;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  }
-                  __LINE__ = 16;
-                  var Runtime =  {
-                        getErrorMessage : function getErrorMessage( e ) {
-                          try {
-                            __LINE__ = 18;
-                            return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        exceptionHandler : function exceptionHandler( line,file,e ) {
-                          try {
-                            __LINE__ = 21;
-                            this.throwException( new Exception( line,file,e ) );
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        },
-                        throwException : function throwException( exception ) {
-                          try {
-                            try {
-                              __LINE__ = 25;
-                              throw exception;
-                            } catch( e ){
-                              __LINE__ = 27;
-                              throw new Error( this.getErrorMessage( e ) );
-                            };
-                          } catch( e ){
-                            Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                          }
-                        }
-                      };
-
-                  __LINE__ = 32;
-                  if ( !String.prototype.trim ){
-                    __LINE__ = 33;
-                    String.prototype.trim = function () {
-                      try {
-                        __LINE__ = 34;
-                        return this.replace( String.prototype.trim.rtrim,"" );
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-
-                    __LINE__ = 37;
-                    String.prototype.trim.rtrim = /^\s*|\s*$/g;
-                  };
-
-                  __LINE__ = 40;
-                  if ( !Function.prototype.bind ){
-                    __LINE__ = 41;
-                    Function.prototype.bind = function () {
-                      try {
-                        __LINE__ = 42;
-                        var argArray = Array.prototype.slice.call( arguments ),
-                            context = argArray.shift(),
-                            ret = function () {
-                              try {
-                                __LINE__ = 45;
-                                var args = argArray.concat( Array.prototype.slice.call( arguments ) );
-
-                                __LINE__ = 47;
-                                if ( this instanceof ret ){
-                                  __LINE__ = 48;
-                                  return ret.context.apply( this,args );
-                                } else {
-                                  __LINE__ = 50;
-                                  return ret.context.apply( context,args );
-                                };
-                              } catch( e ){
-                                Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                              }
-                            };
-
-                        __LINE__ = 54;
-                        ret.prototype = this.prototype;
-
-                        __LINE__ = 56;
-                        ret.context = this;
-                        __LINE__ = 57;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 61;
-                  if ( !Array.prototype.forEach ){
-                    __LINE__ = 62;
-                    Array.prototype.forEach = function ( fn,that ) {
-                      try {
-                        __LINE__ = 63;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 66;
-                        if ( that ){
-                          __LINE__ = 67;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 68;
-                            fn.call( that,ta,iter,this );
-                          };
-                        } else {
-                          __LINE__ = 71;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 72;
-                            fn( ta,iter,this );
-                          };
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 78;
-                  if ( !Array.prototype.every ){
-                    __LINE__ = 79;
-                    Array.prototype.every = function ( fn,that ) {
-                      try {
-                        __LINE__ = 80;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 83;
-                        if ( that ){
-                          __LINE__ = 84;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 85;
-                            if ( !( fn.call( that,ta,iter,this ) ) ){
-                              __LINE__ = 86;
-                              return false;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 90;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( !( fn( ta,iter,this ) ) ){
-                              __LINE__ = 92;
-                              return false;
-                            };
-                          };
-                        };
-                        __LINE__ = 96;
-                        return true;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 100;
-                  if ( !Array.prototype.some ){
-                    __LINE__ = 101;
-                    Array.prototype.some = function ( fn,that ) {
-                      try {
-                        __LINE__ = 102;
-                        var iter = -1,
-                            ta;
-
-                        __LINE__ = 105;
-                        if ( that ){
-                          __LINE__ = 106;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            __LINE__ = 107;
-                            if ( fn.call( that,ta,iter,this ) ){
-                              __LINE__ = 108;
-                              return true;
-                            };
-                          };
-                        } else {
-                          __LINE__ = 112;
-                          while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                            if ( fn( ta,iter,this ) ){
-                              __LINE__ = 114;
-                              return true;
-                            };
-                          };
-                        };
-                        __LINE__ = 118;
-                        return false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 122;
-                  if ( !Array.prototype.filter ){
-                    __LINE__ = 123;
-                    Array.prototype.filter = function ( fn,that ) {
-                      try {
-                        __LINE__ = 124;
-                        var iter = -1,
-                            ret = [],
-                            ta;
-
-                        __LINE__ = 128;
-                        if ( that ){
-                          __LINE__ = 129;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 130;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 131;
-                              if ( fn.call( that,ta,i,this ) ){
-                                __LINE__ = 132;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        } else {
-                          __LINE__ = 137;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              if ( fn( ta,i,this ) ){
-                                __LINE__ = 140;
-                                ret[ ++ iter] = ta;
-                              };
-                            };
-                          };
-                        };
-                        __LINE__ = 145;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 149;
-                  if ( !Array.prototype.indexOf ){
-                    __LINE__ = 150;
-                    Array.prototype.indexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 151;
-                        var iter = -1,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 155;
-                        while ( ( ta = this[ ++ iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 156;
-                          if ( ta === subject ){
-                            __LINE__ = 157;
-                            index = iter;
-                            __LINE__ = 158;
-                            break;
-                          };
-                        };
-                        __LINE__ = 161;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 165;
-                  if ( !Array.prototype.lastIndexOf ){
-                    __LINE__ = 166;
-                    Array.prototype.lastIndexOf = function ( subject ) {
-                      try {
-                        __LINE__ = 167;
-                        var iter = this.length,
-                            index = -1,
-                            ta;
-
-                        __LINE__ = 171;
-                        while ( ( ta = this[ -- iter] ) !== null && ta !== undefined ){
-                          __LINE__ = 172;
-                          if ( ta === subject ){
-                            __LINE__ = 173;
-                            index = iter;
-                            __LINE__ = 174;
-                            break;
-                          };
-                        };
-                        __LINE__ = 177;
-                        return index;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 181;
-                  if ( !Array.prototype.map ){
-                    __LINE__ = 182;
-                    Array.prototype.map = function ( fn,that ) {
-                      try {
-                        __LINE__ = 183;
-                        var ret = [],
-                            iter = -1,
-                            ta;
-
-                        __LINE__ = 187;
-                        if ( that ){
-                          __LINE__ = 188;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            __LINE__ = 189;
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 190;
-                              ret[ ++ iter] = fn.call( that,ta,i,this );
-                            };
-                          };
-                        } else {
-                          __LINE__ = 194;
-                          for ( var i = 0,len = this.length;i<len; ++ i ){
-                            if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                              __LINE__ = 196;
-                              ret[ ++ iter] = fn( ta,i,this );
-                            };
-                          };
-                        };
-                        __LINE__ = 200;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 204;
-                  if ( !Array.prototype.reduce ){
-                    __LINE__ = 205;
-                    Array.prototype.reduce = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 206;
-                        var ret = initial || this[0],
-                            i = ( ( ( initial ) ) )?0 : 1,
-                            ta,
-                            len;
-
-                        __LINE__ = 211;
-                        for ( i , len = this.length;i<len; ++ i ){
-                          __LINE__ = 212;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 213;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 216;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 220;
-                  if ( !Array.prototype.reduceRight ){
-                    __LINE__ = 221;
-                    Array.prototype.reduceRight = function ( fn,initial ) {
-                      try {
-                        __LINE__ = 222;
-                        var ret = initial || this[this.length-1],
-                            i = ( ( ( initial ) ) )?this.length-1 : this.length-2,
-                            ta;
-
-                        __LINE__ = 226;
-                        for ( i;i>-1; -- i ){
-                          __LINE__ = 227;
-                          if ( ( ta = this[i] ) !== null && ta !== undefined ){
-                            __LINE__ = 228;
-                            ret = fn( ret,ta,i,this );
-                          };
-                        };
-                        __LINE__ = 231;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 235;
-                  if ( !Date.prototype.toJSON ){
-                    __LINE__ = 236;
-                    Date.prototype.toJSON = function () {
-                      try {
-                        __LINE__ = 237;
-                        return '"'+this.getUTCFullYear()+'-'+"0"+( this.getUTCMonth()+1 )+'-'+"0"+( this.getUTCDate()-1 )+'T'+this.getUTCHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getUTCMilliseconds()+'"';
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 241;
-                  if ( !Date.now ){
-                    __LINE__ = 242;
-                    Date.now = function () {
-                      try {
-                        __LINE__ = 243;
-                        return +new Date();
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 247;
-                  if ( !Object.keys ){
-                    __LINE__ = 248;
-                    Object.keys = function ( obj ) {
-                      try {
-                        __LINE__ = 249;
-                        var ret = [],
-                            iter = -1;
-
-                        __LINE__ = 252;
-                        for ( var i in obj ){
-                          __LINE__ = 253;
-                          if ( obj.hasOwnProperty( i ) ){
-                            __LINE__ = 254;
-                            ret[ ++ iter] = obj[i];
-                          };
-                        };
-                        __LINE__ = 257;
-                        return ret;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 261;
-                  if ( !Object.preventExtensions ){
-                    __LINE__ = 262;
-                    Object.preventExtensions = function ( o ) {
-                      try {
-                        __LINE__ = 263;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 267;
-                  if ( !Object.seal ){
-                    __LINE__ = 268;
-                    Object.seal = function ( o ) {
-                      try {
-                        __LINE__ = 269;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 273;
-                  if ( !Object.freeze ){
-                    __LINE__ = 274;
-                    Object.freeze = function ( o ) {
-                      try {
-                        __LINE__ = 275;
-                        return o;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 279;
-                  var hasRealEcma5 = ( function () {
-                        try {
-                          try {
-                            __LINE__ = 281;
-                            var obj = {};
-
-                            __LINE__ = 283;
-                            Object.defineProperty( obj,"test", {
-                              configurable : false,
-                              writable : false,
-                              enumerable : false,
-                              value : 0
-                            });
-
-                            __LINE__ = 290;
-                            obj.test = 200;
-                            __LINE__ = 291;
-                            return ( ( ( obj.test === 200 ) ) )?false : true;
-                          } catch( e ){
-                            __LINE__ = 293;
-                            return false;
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      })();
-
-                  __LINE__ = 297;
-                  if ( !hasRealEcma5 ){
-                    __LINE__ = 298;
-                    Object.defineProperty = function ( obj,prop,valobj ) {
-                      try {
-                        __LINE__ = 299;
-                        if ( valobj.value ){
-                          __LINE__ = 300;
-                          obj[prop] = valobj.value;
-                        };
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 305;
-                  if ( !Array.isArray ){
-                    __LINE__ = 306;
-                    var arrayString = "[object Array]";
-
-                    __LINE__ = 308;
-                    Array.isArray = function ( arr ) {
-                      try {
-                        __LINE__ = 309;
-                        if ( arguments.length === 0 ){
-                          __LINE__ = 310;
-                          return false;
-                        };
-                        __LINE__ = 312;
-                        return ( ( ( arr ) ) )?Object.prototype.toString.call( arr ) === arrayString : false;
-                      } catch( e ){
-                        Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                      }
-                    };
-                  };
-
-                  __LINE__ = 316;
-                  var slice = Array.prototype.slice;
-
-                  __LINE__ = 318;
-                  var createUnenumProp = _mochaLocalExport.createUnenumProp = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 319;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : true,
-                            enumerable : false,
-                            writable : true,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 327;
-                  var constant = _mochaLocalExport.constant = function ( obj,prop,value ) {
-                        try {
-                          __LINE__ = 328;
-                          return Object.defineProperty( obj,prop, {
-                            configurable : false,
-                            enumerable : false,
-                            writable : false,
-                            value : value
-                          });
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 336;
-                  var toArray = _mochaLocalExport.toArray = function ( likeArray,index ) {
-                        try {
-                          __LINE__ = 337;
-                          return ( ( ( likeArray ) ) )?slice.call( likeArray,index ) : [];
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 340;
-                  var Iterator = _mochaLocalExport.Iterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 341;
-                          isKeyOnly = isKeyOnly || false;
-
-                          __LINE__ = 343;
-                          var iter = {},
-                              isArray,
-                              ret,
-                              index = 0;
-
-                          __LINE__ = 348;
-                          if ( this instanceof Iterator ){
-                            __LINE__ = 349;
-                            isArray = Array.isArray( obj );
-
-                            __LINE__ = 351;
-                            ret = _ownPropertyIterator( obj,isArray,isKeyOnly );
-                          } else {
-                            __LINE__ = 353;
-                            return _userdefIterator( obj,isKeyOnly );
-                          };
-
-                          __LINE__ = 356;
-                          createUnenumProp( iter,"next",
-                          function () {
-                            try {
-                              __LINE__ = 358;
-                              return ret[index ++ ];
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-                          __LINE__ = 360;
-                          return iter;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 363;
-                  var _objectIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 364;
-                          var ret = [],
-                              iter = -1;
-
-                          __LINE__ = 367;
-                          if ( isKeyOnly ){
-                            __LINE__ = 368;
-                            for ( var prop in obj ){
-                              __LINE__ = 369;
-                              ret[ ++ iter] = prop;
-                            };
-                          } else {
-                            __LINE__ = 372;
-                            for ( var prop in obj ){
-                              __LINE__ = 373;
-                              ret[ ++ iter] = [prop,obj[prop]];
-                            };
-                          };
-                          __LINE__ = 376;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _arrayIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 379;
-                          var ret = [];
-
-                          __LINE__ = 381;
-                          if ( isKeyOnly ){
-                            __LINE__ = 382;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 383;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 386;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 387;
-                              ret[i] = [i,obj[i]];
-                            };
-                          };
-                          __LINE__ = 390;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _stringIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 393;
-                          var ret = [];
-
-                          __LINE__ = 395;
-                          if ( isKeyOnly ){
-                            __LINE__ = 396;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 397;
-                              ret[i] = i;
-                            };
-                          } else {
-                            __LINE__ = 400;
-                            for ( var i = 0,len = obj.length;i<len;i ++  ){
-                              __LINE__ = 401;
-                              ret[i] = [i,obj.charAt( i )];
-                            };
-                          };
-                          __LINE__ = 404;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _ownPropertyIterator = function ( obj,isArray,isKeyOnly ) {
-                        try {
-                          __LINE__ = 407;
-                          var type = typeof obj;
-
-                          __LINE__ = 409;
-                          if ( type === "object" && !isArray ){
-                            __LINE__ = 410;
-                            return _objectIterator( obj,isKeyOnly );
-                          } else if ( isArray ){
-                            __LINE__ = 412;
-                            return _arrayIterator( obj,isKeyOnly );
-                          } else if ( type === "string" ){
-                            __LINE__ = 414;
-                            return _stringIterator( obj,isKeyOnly );
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      },
-                      _userdefIterator = function ( obj,isKeyOnly ) {
-                        try {
-                          __LINE__ = 418;
-                          if ( "__iterator__" in obj ){
-                            __LINE__ = 419;
-                            return obj.__iterator__( isKeyOnly );
-                          } else {
-                            __LINE__ = 421;
-                            return  {
-                              next : function () {
-                                try {
-                                  try {
-                                    __LINE__ = 424;
-                                    throw new StopIteration;
-                                  } catch( e ){
-                                    __LINE__ = 426;
-                                    throw new Error( e );
-                                  };
-                                } catch( e ){
-                                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                                }
-                              }
-                            };
-                          };
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 433;
-                  var createGenerator = _mochaLocalExport.createGenerator = function ( generatorFn,closeFn,context ) {
-                        try {
-                          __LINE__ = 434;
-                          var ret = {};
-
-                          __LINE__ = 436;
-                          createUnenumProp( ret,"next",generatorFn.bind( context,false,false ) );
-
-                          __LINE__ = 438;
-                          createUnenumProp( ret,"send",generatorFn.bind( context,true,false ) );
-
-                          __LINE__ = 440;
-                          createUnenumProp( ret,"close",closeFn.bind( context ) );
-
-                          __LINE__ = 442;
-                          createUnenumProp( ret,"__nothrowNext__",closeFn.bind( context,false,true ) );
-
-                          __LINE__ = 444;
-                          createUnenumProp( ret,"toString",
-                          function () {
-                            try {
-                              __LINE__ = 446;
-                              return "[object Generator]";
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          });
-
-                          __LINE__ = 449;
-                          Object.freeze( ret );
-                          __LINE__ = 450;
-                          return ret;
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 453;
-                  var getErrorMessage = function ( e ) {
-                        try {
-                          __LINE__ = 454;
-                          return ( ( ( e.message ) ) )?e.message : ( ( ( e.description ) ) )?e.description : e.toString();
-                        } catch( e ){
-                          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                        }
-                      };
-
-                  __LINE__ = 457;
-                  var throwException = _mochaLocalExport.throwException = Runtime.throwException.bind( Runtime );
-
-                  __LINE__ = 459;
-                  var exceptionHandler = _mochaLocalExport.exceptionHandler = Runtime.exceptionHandler.bind( Runtime );
-
-                  __LINE__ = 461;
-                  ( function () {
-                    try {
-                      __LINE__ = 462;
-                      var assert = _mochaLocalExport.assert = ( ( ( console && console.assert ) ) )?function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 463;
-                              return console.assert( expect === exp,str+"\nat : "+line );
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          } : function ( expect,exp,str,line ) {
-                            try {
-                              __LINE__ = 465;
-                              if ( expect !== exp ){
-                                __LINE__ = 466;
-                                Runtime.throwException( "assertion failed : "+str+"\nat : "+line );
-                              };
-                            } catch( e ){
-                              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                            }
-                          };
-                    } catch( e ){
-                      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                    }
-                  })();
-                  __LINE__ = 470;
-                  return _mochaLocalExport;
-                } catch( e ){
-                  Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                }
-              })();
-
-          __LINE__ = 473;
-          var StopIteration =  {
-                toString : function toString() {
-                  try {
-                    __LINE__ = 475;
-                    return "StopIteration";
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                }
-              };
-
-          __LINE__ = 479;
-          __LINE__ = 0;
-
-          __LINE__ = 480;
-          ( function () {
-            try {
-              try {
-                __LINE__ = 482;
-                var __FILE__ = "/var/samba/mocha/src/test/js/path_array.js",
-                    __LINE__ = 0;
-
-                __LINE__ = 484;
-                __LINE__ = 2;
-
-                __LINE__ = 485;
-                _mochaGlobalExport['./path_array.js'] = {};
-
-                __LINE__ = 487;
-                __LINE__ = 3;
-
-                __LINE__ = 488;
-                var _mochaGlobalAlias = _mochaGlobalExport['./path_array.js'];
-
-                __LINE__ = 490;
-                __LINE__ = 0;
-
-                __LINE__ = 491;
-                var m = "/Users/aono_taketoshi/mocha/test/js";
-
-                __LINE__ = 493;
-                __LINE__ = 0;
-
-                __LINE__ = 494;
-                var v = "/url/local/includes";
-
-                function getPathArray( path ) {
-                  try {
-                    try {
-                      __LINE__ = 498;
-                      __LINE__ = 0;
-
-                      __LINE__ = 499;
-                      if ( path[path.length-1] !== '/' ){
-                        __LINE__ = 500;
-                        __LINE__ = 0;
-
-                        __LINE__ = 501;
-                        path += '/';
-                      };
-
-                      __LINE__ = 504;
-                      __LINE__ = 0;
-
-                      __LINE__ = 505;
-                      var i = 0;
-
-                      __LINE__ = 507;
-                      __LINE__ = 0;
-
-                      __LINE__ = 508;
-                      var arr = [];
-
-                      __LINE__ = 510;
-                      __LINE__ = 0;
-
-                      __LINE__ = 511;
-                      var tmp = "";
-
-                      __LINE__ = 513;
-                      __LINE__ = 8;
-
-                      __LINE__ = 514;
-                      while ( path[i] ){
-                        __LINE__ = 515;
-                        __LINE__ = 0;
-
-                        __LINE__ = 516;
-                        if ( path[i] == '/' ){
-                          __LINE__ = 517;
-                          __LINE__ = 0;
-
-                          __LINE__ = 518;
-                          if ( i == 0 ){
-                            __LINE__ = 519;
-                            __LINE__ = 0;
-
-                            __LINE__ = 520;
-                            arr.push( "/" );
-                          } else {
-                            __LINE__ = 522;
-                            __LINE__ = 0;
-
-                            __LINE__ = 523;
-                            arr.push( tmp );
-                          };
-
-                          __LINE__ = 526;
-                          __LINE__ = 0;
-
-                          __LINE__ = 527;
-                          tmp = "";
-                        } else {
-                          __LINE__ = 529;
-                          __LINE__ = 0;
-
-                          __LINE__ = 530;
-                          tmp += path[i];
-                        };
-
-                        __LINE__ = 533;
-                        __LINE__ = 0;
-
-                        __LINE__ = 534;
-                        i ++ ;
-                      };
-
-                      __LINE__ = 536;
-                      __LINE__ = 18;
-                      __LINE__ = 537;
-                      return arr;
-                    } catch( e ){
-                      __LINE__ = 539;
-                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                    };
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                }
-                __LINE__ = 542;
-                __LINE__ = 0;
-
-                __LINE__ = 543;
-                var arr1 = getPathArray( m ),
-                    arr2 = getPathArray( v );
-
-                function cmp( arr1,arr2 ) {
-                  try {
-                    try {
-                      __LINE__ = 548;
-                      __LINE__ = 0;
-
-                      __LINE__ = 549;
-                      var ret = "";
-
-                      __LINE__ = 551;
-                      __LINE__ = 0;
-
-                      __LINE__ = 552;
-                      var i = 0;
-
-                      __LINE__ = 554;
-                      __LINE__ = 0;
-
-                      __LINE__ = 555;
-                      var unmatch = false;
-
-                      __LINE__ = 557;
-                      __LINE__ = 27;
-
-                      __LINE__ = 558;
-                      while ( arr1[i] || arr2[i] ){
-                        __LINE__ = 559;
-                        __LINE__ = 0;
-
-                        __LINE__ = 560;
-                        if ( !arr1[i] ){
-                          __LINE__ = 561;
-                          __LINE__ = 0;
-
-                          __LINE__ = 562;
-                          ret += arr2[i]+"/";
-                        } else if ( !arr2[i] ){
-                          __LINE__ = 564;
-                          __LINE__ = 0;
-
-                          __LINE__ = 565;
-                          var tmp = "";
-
-                          __LINE__ = 567;
-                          __LINE__ = 32;
-
-                          __LINE__ = 568;
-                          while ( arr1[i] ){
-                            __LINE__ = 569;
-                            __LINE__ = 0;
-
-                            __LINE__ = 570;
-                            tmp += "../";
-
-                            __LINE__ = 572;
-                            __LINE__ = 0;
-
-                            __LINE__ = 573;
-                            i ++ ;
-                          };
-
-                          __LINE__ = 575;
-                          __LINE__ = 36;
-                          __LINE__ = 576;
-                          return tmp+ret;
-                        } else if ( arr1[i] != arr2[i] ){
-                          __LINE__ = 578;
-                          __LINE__ = 0;
-
-                          __LINE__ = 579;
-                          unmatch = true;
-
-                          __LINE__ = 581;
-                          __LINE__ = 39;
-
-                          __LINE__ = 582;
-                          while ( arr1[i] ){
-                            __LINE__ = 583;
-                            __LINE__ = 0;
-
-                            __LINE__ = 584;
-                            ret += "../";
-
-                            __LINE__ = 586;
-                            __LINE__ = 0;
-
-                            __LINE__ = 587;
-                            arr1.pop();
-                          };
-
-                          __LINE__ = 590;
-                          __LINE__ = 43;
-
-                          __LINE__ = 591;
-                          while ( arr2[i] ){
-                            __LINE__ = 592;
-                            __LINE__ = 0;
-
-                            __LINE__ = 593;
-                            ret += arr2[i]+"/";
-
-                            __LINE__ = 595;
-                            __LINE__ = 0;
-
-                            __LINE__ = 596;
-                            i ++ ;
-                          };
-
-                          __LINE__ = 598;
-                          __LINE__ = 47;
-                          __LINE__ = 599;
-                          return ret;
-                        };
-
-                        __LINE__ = 602;
-                        __LINE__ = 0;
-
-                        __LINE__ = 603;
-                        i ++ ;
-                      };
-
-                      __LINE__ = 605;
-                      __LINE__ = 51;
-                      __LINE__ = 606;
-                      return ret;
-                    } catch( e ){
-                      __LINE__ = 608;
-                      Runtime.exceptionHandler( __LINE__,__FILE__,e );
-                    };
-                  } catch( e ){
-                    Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-                  }
-                }
-                __LINE__ = 611;
-                __LINE__ = 0;
-
-                __LINE__ = 612;
-                cmp( arr1,arr2 );
-              } catch( e ){
-                __LINE__ = 614;
-                Runtime.exceptionHandler( __LINE__,__FILE__,e );
-              };
-            } catch( e ){
-              Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-            }
-          })();
-        } catch( e ){
-          Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-        }
-      })();
-    } catch( e ){
-      Runtime.exceptionHandler( __LINE__ , __FILE__ , e );
-    }
-  })();
-})();
diff --git a/src/test/js/path_array.js b/src/test/js/path_array.js
deleted file mode 100644
index 65ed99e..0000000
--- a/src/test/js/path_array.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var m = "/Users/aono_taketoshi/mocha/test/js"
-var v = "/url/local/includes";
-function getPathArray( path ) {
-  if ( path[ path.length - 1 ] !== '/' ) path += '/';
-  var i = 0;
-  var arr = [];
-  var tmp = "";
-  while ( path[i] ) {
-    if ( path[ i ] == '/' ) {
-      if ( i == 0 )arr.push( "/" );
-      else arr.push(tmp);
-      tmp = "";
-    } else {
-      tmp += path[i]
-    }
-    i++
-  }
-  return arr
-}
-
-var arr1 = getPathArray( m ),
-    arr2 = getPathArray( v );
-function cmp(arr1 ,arr2) {
-  var ret = ""
-  var i = 0;
-  var unmatch = false;
-  while ( arr1[ i ] || arr2[ i ] ) {
-    if ( !arr1[ i ] ) {
-      ret += arr2[i] + "/";
-    }else if ( !arr2[ i ] ) {
-      var tmp = "";
-      while ( arr1[ i ] ) {
-        tmp += "../";
-        i++;
-      }
-      return tmp + ret;
-    } else if ( arr1[ i ] != arr2[ i ] ) {
-      unmatch = true;
-      while ( arr1[i] ) {
-        ret += "../";
-        arr1.pop();
-      }
-      while ( arr2[ i ] ) {
-        ret += arr2[i] + "/"
-        i++
-      }
-      return ret;
-    }
-    i++;
-  }
-  return ret;
-}
-cmp(arr1 , arr2);
\ No newline at end of file
diff --git a/src/test/js/switch_test.js b/src/test/js/switch_test.js
deleted file mode 100644
index a0406ca..0000000
--- a/src/test/js/switch_test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-switch ( type ) {
-case "only":
-case "first":
-	while ( (node = node.previousSibling) )	 {
-		if ( node.nodeType === 1 ) {
-			return false;
-		}
-	}
-
-	if ( type === "first" ) {
-		return true;
-	}
-
-	node = elem;
-
-case "last":
-	while ( (node = node.nextSibling) )	 {
-		if ( node.nodeType === 1 ) {
-			return false;
-		}
-	}
-
-	return true;
-
-case "nth":
-	first = match[2];
-	last = match[3];
-
-	if ( first === 1 && last === 0 ) {
-		return true;
-	}
-
-	doneName = match[0];
-	parent = elem.parentNode;
-
-	if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
-		count = 0;
-
-		for ( node = parent.firstChild; node; node = node.nextSibling ) {
-			if ( node.nodeType === 1 ) {
-				node.nodeIndex = ++count;
-			}
-		}
-
-		parent[ expando ] = doneName;
-	}
-
-	diff = elem.nodeIndex - last;
-
-	if ( first === 0 ) {
-		return diff === 0;
-
-	} else {
-		return ( diff % first === 0 && diff / first >= 0 );
-	}
-  break;
-default :
-  console.log(1);
-}
\ No newline at end of file
diff --git a/src/third_party/ncurses-5.9/lib/libform.a b/src/third_party/ncurses-5.9/lib/libform.a
deleted file mode 100644
index 31c2f2b..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libform.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libform_g.a b/src/third_party/ncurses-5.9/lib/libform_g.a
deleted file mode 100644
index c0725ba..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libform_g.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libmenu.a b/src/third_party/ncurses-5.9/lib/libmenu.a
deleted file mode 100644
index e4087bb..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libmenu.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libmenu_g.a b/src/third_party/ncurses-5.9/lib/libmenu_g.a
deleted file mode 100644
index 5d9a894..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libmenu_g.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libncurses++.a b/src/third_party/ncurses-5.9/lib/libncurses++.a
deleted file mode 100644
index bc5f60b..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libncurses++.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libncurses.a b/src/third_party/ncurses-5.9/lib/libncurses.a
deleted file mode 100644
index 955d844..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libncurses.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libncurses_g.a b/src/third_party/ncurses-5.9/lib/libncurses_g.a
deleted file mode 100644
index d9a6763..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libncurses_g.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libpanel.a b/src/third_party/ncurses-5.9/lib/libpanel.a
deleted file mode 100644
index ae51f3b..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libpanel.a and /dev/null differ
diff --git a/src/third_party/ncurses-5.9/lib/libpanel_g.a b/src/third_party/ncurses-5.9/lib/libpanel_g.a
deleted file mode 100644
index 5a9a0d1..0000000
Binary files a/src/third_party/ncurses-5.9/lib/libpanel_g.a and /dev/null differ
diff --git a/test/mains/.#fmt.js b/test/mains/.#fmt.js
deleted file mode 120000
index c32574d..0000000
--- a/test/mains/.#fmt.js
+++ /dev/null
@@ -1 +0,0 @@
-brn@devhome.7395:1327721868
\ No newline at end of file
diff --git a/test/mains/.#test.js b/test/mains/.#test.js
deleted file mode 120000
index 97c2839..0000000
--- a/test/mains/.#test.js
+++ /dev/null
@@ -1 +0,0 @@
-aono_taketoshi@PC-3914.local.637
\ No newline at end of file